このチュートリアルでは、Azure Virtual Network Gateway を使って、Cloudflare WAN(旧称 Magic WAN)を Azure Virtual Network に接続する方法を説明します。
Azure アカウントに、既存の Resource group、Virtual Network、Virtual Machine が必要です。作成方法は Microsoft のドキュメント ↗ を参照してください。
すでに Virtual Network(VNET)があり、サブネットが割り当てられている想定です。次に、Azure が Virtual Network Gateway 関連のサービス用に使う gateway subnet を作成します。すでに gateway subnet がある場合、Azure は 2 つ目の作成を拒否します。その場合は、既存の gateway subnet 設定を更新します。
- Virtual Network > Subnets を開きます。
- Gateway subnet を追加するオプションを選びます。
- サブネットのアドレスレンジを設定します。gateway subnet は仮想ネットワークのアドレス空間に含まれ、サブネットマスクは
/27以上である必要があります。 - その他の設定はすべて None にします。
Virtual Network Gateway は、拠点側のデバイスへのトンネルを形成するために使います。
- Virtual Network Gateway を作成します。
- 新しいパブリック IP アドレスを 2 つ作成するか、既存の IP を使います。Virtual Network Gateway に割り当てられたパブリック IP アドレスを控えます。これが Cloudflare WAN の IPsec トンネル設定における Customer endpoint になります。
- 先ほど作成した Virtual Network Gateway を開きます。
- Configuration で Active-active mode を有効にし、Gateway Private IPs を無効にします。
- Create を選びます。
- Virtual Network Gateway を作成します。
- 新しいパブリック IP アドレスを作成するか、既存の IP を使います。Virtual Network Gateway に割り当てられたパブリック IP アドレスを控えます。これが Cloudflare WAN の IPsec トンネル設定における Customer endpoint になります。
- すでに作成したリソースグループと VNET を選びます。
- Configuration で Active-active mode と Gateway Private IPs を無効にします。
- Create を選びます。
- Cloudflare ダッシュボードで IPsec トンネル を作成します。
- 次の設定になっていることを確認します。
- Interface address: Azure Local Network Gateway は
/31サブネットの下位 IP アドレスしか指定できないため、/31サブネット内の上位 IP アドレスを追加します。対応する/32アドレスは、あとで Azure 側で設定します(IPsec トンネルヘルスチェック用に Local Network Gateway を設定する を参照)。詳細は Tunnel endpoints を参照してください。 - Customer endpoint: Azure Virtual Network Gateway に関連付けられたパブリック IP です。例:
40.xxx.xxx.xxx。 - Cloudflare endpoint: Leased IPs ↗ で確認できる、アカウントに割り当てられた Cloudflare anycast アドレスのいずれかを使います。このアドレスは Azure 側の Local Network Gateway にも対応します。例:
162.xxx.xxx.xxx。 - Health check rate: デフォルト(Medium)のままにします。
- Health check type: デフォルト(Reply)のままにします。
- Health check direction: デフォルト(Bidirectional)のままにします。
- Health check target: Custom を選びます。
- Target address: Customer endpoint フィールドと同じアドレスを入力します。
- Add pre-shared key later: このオプションを選び、あとで Azure で使う PSK を作成します。
- Replay protection: Enable。
- Interface address: Azure Local Network Gateway は
- Active/Active 構成を使う場合は Add IPsec tunnel を選び、ステップ 2 を繰り返して 2 本目の Cloudflare WAN IPsec トンネルを作成します。1 本目と同じ Cloudflare endpoint を使います。
- 完了したら Add Tunnels を選びます。
- Cloudflare ダッシュボードにトンネル一覧が表示されます。作成したトンネルを編集し、Generate a new pre-shared key を選んで生成されたキーをコピーします。Active/Active 構成の場合は、2 本目のトンネルで Change to a new custom pre-shared key を選び、1 本目で生成した PSK を使います。
- 新しく作成したトンネルをネクストホップとして、Azure Virtual Network のサブネット向けに 静的ルート を作成します。
Local Network Gateway は通常、オンプレミスの拠点を指します。この場合は、接続の Cloudflare 側を表します。
Cloudflare の IPsec トンネルごとに Local Network Gateway を作成することを推奨します。
- 新しい local network gateway を作成します。
- Instance details > Endpoint で IP address を選び、IP address フィールドに Cloudflare anycast アドレスを入力します。
- Address space(s) に、Cloudflare WAN 接続経由でリモートアクセスしたいサブネットのアドレスレンジを指定します。たとえば、
192.168.1.0/24のネットワークに到達したい場合で、そのネットワークが Cloudflare WAN テナントに接続されているときは、local network gateway のアドレス空間に192.168.1.0/24を追加します。 - Advanced タブ > BGP settings を開き、No が選ばれていることを確認します。
Cloudflare WAN は、トンネルが利用可能かどうかを監視するために Tunnel Health Checks を使います。
トンネルヘルスチェックは、IPsec トンネルの Cloudflare 側からリモートエンドポイント(Azure)へ送る ICMP プローブを使います。プローブはトンネルのインターフェイスアドレスから送られます。このアドレスは次の 2 か所で指定します。
- Cloudflare Dashboard: IPsec トンネル設定の仮想トンネルインターフェイス(VTI)のアドレスとして指定します(Cloudflare がどのアドレスからプローブを送るかを知るため)。Cloudflare では、このアドレスを
/31ネットマスクの Classless Inter-Domain Routing(CIDR)表記で指定する必要があります。 - Azure Portal: VPN サイトのアドレス空間として指定します(Azure がプローブ応答をトンネル経由で返すため)。Azure では、このアドレスを
/32ネットマスクの CIDR 表記で指定する必要があります。
Cloudflare は、IPsec トンネルごとに一意の /31 サブネット(RFC 1918 - Address Allocation for Private Internets ↗)を選ぶことを推奨します。ポイントツーポイントリンクとして扱い、両方の要件を満たす理想的なアドレス方式になります。
例:
- 一意のポイントツーポイントリンクサブネットとして
10.252.3.55/31を選びます。 - Cloudflare ダッシュボードで、トンネルの IPv4 Interface address に
10.252.3.55/31を設定します(Cloudflare WAN を設定する を参照)。 - Azure ポータルで、Local Network Gateway の Address space に
10.252.3.55/32を追加します。
Tunnel Health Checks に対応するよう、Local Network Gateway の Address Space を設定するには:
- 前のセクションで設定した Local Network Gateway を編集します。
- Connections を選びます。
- Address Space(s) に、Cloudflare ダッシュボードの IPsec トンネルの Interface Address を CIDR 表記で追加します(例:
10.252.3.55/32)。 - Active/Active 構成の場合は、Address Space(s) に 2 本目の IPsec トンネルの Interface Address も CIDR 表記で追加します(例:
10.252.3.56/32)。両方のトンネルを正常に保つには、Local Network Gateway の Address Space に両方のトンネルインターフェイスアドレスを設定する必要があります。 - Save を選びます。
VPN Connection の作成時は、次の設定を選びます。
- Virtual network gateway: Virtual Network Gateway を作成する で作成した Virtual Network Gateway を選びます。
- Local network gateway: Local Network Gateway を作成する で作成した Local Network Gateway を選びます。
- Use Azure Private IP Address: Disabled
- BGP: Disabled
- IPsec / IKE policy: Custom
- IKE Phase 1
- Encryption: GCMAES256
- Integrity/PRF: SHA384
- DH Group: ECP384
- IKE Phase 2(IPsec)
- IPsec Encryption: GCMAES256
- IPsec Integrity: GCMAES256
- PFS Group: ECP384
- IPsec SA lifetime in KiloBytes:
0 - IPsec SA lifetime in seconds:
28800 - Use policy based traffic selector: Disable
- DPD timeout in seconds:
45 - Connection mode: InitiatorOnly
- Use custom traffic selectors: Disabled
- IKE Phase 1
- 接続作成後、Settings > Authentication を開き、PSK を入力します(Cloudflare WAN の設定で使った PSK と一致させる必要があります)。
冗長な Cloudflare anycast IP アドレスに対応する Local Network Gateway への Connection についても、同じ手順で設定を定義します。
Cloudflare Zero Trust のお客様は、インターネット向けトラフィックを Cloudflare WAN 経由で Cloudflare Gateway を通してインターネットへルーティングできます。
Microsoft は、Local Network Gateway の Address Space にデフォルトルート(0.0.0.0/0)を指定することを許可していません。ただし、ルート集約を使えばこの制限を回避できます。
- Local network gateways を開き、対象のオブジェクトを選びます。
- Configuration > Address Space(s) を開き、次の 2 つのサブネットを指定します。
0.0.0.0/1と128.0.0.0/1。 - Tunnel Health Checks 用に設定したサブネットは削除しないでください。
- Save を選びます。
インターネット向けトラフィックをすべて Cloudflare WAN 経由にし、HTTPS TLS 復号 を使いたい場合は、ユーザーのデバイスに Cloudflare Zero Trust のルート認証局(CA)証明書をインストールして信頼する必要があります。Cloudflare が提供する証明書(デフォルト)をインストールするか、独自のカスタム証明書を生成して Cloudflare にアップロードできます。
ルート CA 証明書のインストール方法の詳細は、Cloudflare Zero Trust ドキュメントの User-side certificates を参照してください。
ルート CA 証明書をインストールしたら、Web ブラウザーを開くか curl を使って、インターネット接続を検証します。
curl https://ipinfo.io{
"ip": "104.xxx.xxx.225",
"city": "Reston",
"region": "Virginia",
"country": "US",
"loc": "xx.xxxx,-xx.xxxx",
"org": "AS13335 Cloudflare, Inc.",
"postal": "20190",
"timezone": "America/New_York",
"readme": "https://ipinfo.io/missingauth"
}接続が確立されたことを確認したら、Azure Virtual Network Gateway のサイト間 VPN 接続ではアンチリプレイ保護を無効にすることを Cloudflare は推奨します。これは Microsoft Azure API で行えます。
- PowerShell で API トークンを取得します。
Get-AzAccessTokenToken: eyJ0e<REDACTED>AH-PdSPg
ExpiresOn : 04/08/2024 23:32:47 +00:00
Type : Bearer
TenantId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
UserId : user@domain.com- Azure Virtual Network Gateway に関連するサイト間 VPN Connection の詳細を表示する API 呼び出し(
GETリクエスト)を発行します。
curl --location 'https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}?api-version=2022-05-01' \
--header 'Authorization: Bearer eyJ0e<REDACTED>AH-PdSPg'- レスポンス全体をテキストエディターにコピーします。
{
"name": "{{virtualNetworkGatewayName}}",
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}",
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"type": "Microsoft.Network/virtualNetworkGateways",
"location": "eastus"
},
"properties": {
"provisioningState": "Succeeded",
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"packetCaptureDiagnosticState": "None",
"enablePrivateIpAddress": false,
"isMigrateToCSES": false,
"ipConfigurations": [
{
"name": "default",
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}/ipConfigurations/default",
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"type": "Microsoft.Network/virtualNetworkGateways/ipConfigurations",
"properties": {
"provisioningState": "Succeeded",
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/publicIPAddresses/{{virtualNetworkGatewayPublicIpAddress}}"
},
"subnet": {
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworks/{{virtualNetworkGatewayName}}/subnets/GatewaySubnet"
}
}
}
],
"natRules": [],
"virtualNetworkGatewayPolicyGroups": [],
"enableBgpRouteTranslationForNat": false,
"disableIPSecReplayProtection": false,
"sku": {
"name": "VpnGw2AZ",
"tier": "VpnGw2AZ",
"capacity": 2
},
"gatewayType": "Vpn",
"vpnType": "RouteBased",
"enableBgp": false,
"activeActive": false,
"bgpSettings": {
"asn": 65515,
"bgpPeeringAddress": "172.25.40.30",
"peerWeight": 0,
"bgpPeeringAddresses": [
{
"ipconfigurationId": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}/ipConfigurations/default",
"defaultBgpIpAddresses": [
"172.25.40.30"
],
"customBgpIpAddresses": [],
"tunnelIpAddresses": [
"{{CF ANYCAST IP}}"
]
}
]
},
"gatewayDefaultSite": {
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/localNetworkGateways/{{localNetworkGatewayName}}"
},
"vpnGatewayGeneration": "Generation2",
"allowRemoteVnetTraffic": false,
"allowVirtualWanTraffic": false
}
}- IPsec アンチリプレイ保護の無効化を制御する行を探し、
falseからtrueに変更します。
"disableIPSecReplayProtection": true- 後続の API 呼び出し(
PUTリクエスト)で、レスポンス全体をアップロードします。
curl --location --request PUT \
'https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}?api-version=2022-05-01' \
--header "Authorization: Bearer eyJ0e<REDACTED>AH-PdSPg" \
--header "Content-Type: application/json" \
--data '{
"name": "{{virtualNetworkGatewayName}}",
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}",
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"type": "Microsoft.Network/virtualNetworkGateways",
"location": "eastus"
},
"properties": {
"provisioningState": "Succeeded",
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"packetCaptureDiagnosticState": "None",
"enablePrivateIpAddress": false,
"isMigrateToCSES": false,
"ipConfigurations": [
{
"name": "default",
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}/ipConfigurations/default",
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"type": "Microsoft.Network/virtualNetworkGateways/ipConfigurations",
"properties": {
"provisioningState": "Succeeded",
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/publicIPAddresses/{{virtualNetworkGatewayPublicIpAddress}}"
},
"subnet": {
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworks/{{virtualNetworkGatewayName}}/subnets/GatewaySubnet"
}
}
}
],
"natRules": [],
"virtualNetworkGatewayPolicyGroups": [],
"enableBgpRouteTranslationForNat": false,
"disableIPSecReplayProtection": true,
"sku": {
"name": "VpnGw2AZ",
"tier": "VpnGw2AZ",
"capacity": 2
},
"gatewayType": "Vpn",
"vpnType": "RouteBased",
"enableBgp": false,
"activeActive": false,
"bgpSettings": {
"asn": 65515,
"bgpPeeringAddress": "172.25.40.30",
"peerWeight": 0,
"bgpPeeringAddresses": [
{
"ipconfigurationId": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/virtualNetworkGateways/{{virtualNetworkGatewayName}}/ipConfigurations/default",
"defaultBgpIpAddresses": [
"172.25.40.30"
],
"customBgpIpAddresses": [],
"tunnelIpAddresses": [
"{{CF ANYCAST IP}}"
]
}
]
},
"gatewayDefaultSite": {
"id": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Network/localNetworkGateways/{{localNetworkGatewayName}}"
},
"vpnGatewayGeneration": "Generation2",
"allowRemoteVnetTraffic": false,
"allowVirtualWanTraffic": false
}
}'- Cloudflare ダッシュボードでは replay protection の設定をオンのままにし、数分待ってから接続を再検証します。