Microsoft-hosted agents の IP アドレス範囲は Mac だけリージョンと異なる範囲にある

本記事は [Azure DevOps | Advent Calendar 2021](https://qiita.com/advent-calendar/2021/azuredevops) の 21 日目の記事です。

Microsoft-hosted agents の IP アドレス範囲を気にする人向けの雑記です。

タイトルの通りで Windows と Linux (Ubuntu) は `AzureCloud.<Region>` の IP アドレス範囲を持っていますが、 Mac だけは GitHub 独自の macOS クラウドでホストされているようで、 IP アドレスの範囲が異なります。
もし、グローバル IP を使って IP の許可リストなどを作る場合、 Mac だけは設定を変える必要があるので気を付けましょう。

## IP アドレス範囲の取得方法

### Mac

GitHub metadata API の [Meta - GitHub Docs](https://docs.github.com/en/rest/reference/meta#get-github-meta-information) を使って取得できます。

```shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/meta
```

actions 配列の中に Mac の IP アドレス範囲が含まれています。

### Windows / Linux

Azure IP Ranges の weekly json ファイル [Download Azure IP Ranges and Service Tags – Public Cloud from Official Microsoft Download Center](https://www.microsoft.com/en-us/download/details.aspx?id=56519) をダウンロードして取得します。

恐らく日本の皆さんが使っているであろう東南アジアリージョンの場合は values -> AzureCloud.southeastasia -> addressPrefixes に Windows と Linux の IP アドレス範囲が含まれています。

## IP アドレスを検証してみる

Azure Pipelines を実行して Microsoft-hosted agents のグローバル IP アドレスを表示して、先ほど取得した IP アドレス範囲にあるか確認してみます。

### 検証のための azure-pipelines.yml

Mac / Linux / Windows それぞれでグローバル IP を表示するスクリプトを実行しています。

```yaml
trigger:
- main

jobs:
- job: Linux
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: dig +short myip.opendns.com @resolver1.opendns.com
- job: macOS
  pool:
    vmImage: 'macOS-latest'
  steps:
  - script: dig +short myip.opendns.com @resolver1.opendns.com
- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - script: nslookup myip.opendns.com. resolver1.opendns.com
```

### macOS の結果

Agent の IP アドレスは `199.19.85.226` でした。

[![Image from Gyazo](https://i.gyazo.com/ad50b1fa1225c77c4cb57ea404d07fc2.png)](https://gyazo.com/ad50b1fa1225c77c4cb57ea404d07fc2)

GitHub metadata API で取得した IP アドレス範囲に含まれています。※Json ファイルは大きいので省略しています。

```json
{
  "actions": [
    "199.19.85.224/29",
  ],
}
```

### Linux の結果

Agent の IP アドレスは `13.76.135.249` でした。

[![Image from Gyazo](https://i.gyazo.com/521aa9527863868bdbb6aed79e000efb.png)](https://gyazo.com/521aa9527863868bdbb6aed79e000efb)

AzureCloud.southeastasia の addressPrefixes に IP アドレス範囲が含まれています。※Json ファイルは大きいので省略しています。

```json
{
  "changeNumber": 180,
  "cloud": "Public",
  "values": [
    {
      "name": "AzureCloud.southeastasia",
      "id": "AzureCloud.southeastasia",
      "properties": {
        "addressPrefixes": [
          "13.76.0.0/16",
        ]
      }
    }
  ]
}
```

### Windows の結果

Agent の IP アドレスは `20.212.57.174` でした。

[![Image from Gyazo](https://i.gyazo.com/4a2614b5b0f2574dd7fbdc3f8d0747de.png)](https://gyazo.com/4a2614b5b0f2574dd7fbdc3f8d0747de)

こちらも Linux と同じように AzureCloud.southeastasia の addressPrefixes に IP アドレス範囲が含まれています。※Json ファイルは大きいので省略しています。

```json
{
  "changeNumber": 180,
  "cloud": "Public",
  "values": [
    {
      "name": "AzureCloud.southeastasia",
      "id": "AzureCloud.southeastasia",
      "properties": {
        "addressPrefixes": [
          "20.212.0.0/16",
        ]
      }
    }
  ]
}
```

## 参考文献

- [Microsoft-hosted agents for Azure Pipelines - Azure Pipelines | Microsoft Docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#networking)
- [About GitHub-hosted runners - GitHub Docs](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#ip-addresses)