本教程提供了关于如何使用 Azure 虚拟网络网关 (Virtual Network Gateway) 将 Cloudflare WAN(前称 Magic WAN)连接到您的 Azure 虚拟网络的信息。
您需要在您的 Azure 账户中已创建资源组、虚拟网络和虚拟机。请参阅 Microsoft 文档 ↗以了解有关如何创建这些资源的更多信息。
您应该已经创建了一个虚拟网络 (VNET) 并为其分配了子网。下一步是创建一个网关子网,Azure 将使用它来为与 Azure 虚拟网络网关相关的服务进行寻址。如果您已经有了网关子网,Azure 将阻止您创建第二个。如果是这种情况,请更新您的网关子网设置。
- 转到您的虚拟网络 > Subnets(子网)。
- 选择添加 **Gateway subnet(网关子网)**的选项。
- 配置子网地址范围。网关子网必须包含在虚拟网络的地址空间内,且其子网掩码须为
/27或更大。 - 确保所有其他设置都设置为 None(无)。
虚拟网络网关用于构建通往您本地设备的隧道。
- 创建虚拟网络网关。
- 创建两个新的公共 IP 地址或使用现有的 IP。记下分配给虚拟网络网关的公共 IP 地址,因为这些将作为 Cloudflare WAN IPsec 隧道配置的客户方端点。
- 导航到之前创建的虚拟网络网关。
- 在 **Configuration(配置)**中,启用 **Active-active mode(主动-主动模式)**并禁用 Gateway Private IPs(网关私有 IP)。
- 选择 Create(创建)。
- 创建虚拟网络网关。
- 创建一个新的公共 IP 地址或使用现有的 IP。记下分配给虚拟网络网关的公共 IP 地址,因为这将作为 Cloudflare WAN IPsec 隧道配置的客户方端点。
- 选择您已创建的资源组和 VNET。
- 在 **Configuration(配置)**中,禁用 **Active-active mode(主动-主动模式)**和 Gateway Private IPs(网关私有 IP)。
- 选择 Create(创建)。
- 在 Cloudflare 仪表板中创建一个IPsec 隧道。
- 确保您具有以下设置:
- 接口地址:由于 Azure 本地网络网关仅允许指定
/31子网中的低位 IP 地址,因此请添加/31子网中的高位 IP 地址。您将在后面的步骤中在 Azure 中配置相应的/32地址(参阅为 IPsec 隧道健康检查配置本地网络网关)。请参阅隧道端点以了解更多详情。 - 客户方端点:与您的 Azure 虚拟网络网关相关联的公共 IP。例如,
40.xxx.xxx.xxx。 - Cloudflare 端点:使用分配给您账户的 Cloudflare Anycast 地址之一,可在租用 IP ↗ 中获取。这也将是 Azure 中本地网络网关对应的 IP 地址。例如,
162.xxx.xxx.xxx。 - 健康检查速率:保持选择默认选项 (Medium)。
- 健康检查类型:保持选择默认选项 (Reply)。
- 健康检查方向:保持选择默认选项 (Bidirectional)。
- 健康检查目标:选择 Custom(自定义)。
- 目标地址:输入与 Customer endpoint(客户端点) 字段中使用的相同地址。
- 稍后添加预共享密钥:选择此选项以创建一个稍后将在 Azure 中使用的 PSK。
- 重放保护:启用。
- 接口地址:由于 Azure 本地网络网关仅允许指定
- 如果您使用的是主动/主动配置,选择 **Add IPsec tunnel(添加 IPsec 隧道)**并重复步骤 2 以创建第二个 Cloudflare WAN IPsec 隧道。使用与第一个隧道相同的 Cloudflare endpoint(Cloudflare 端点)。
- 选择 **Add Tunnels(添加隧道)**时。
- Cloudflare 仪表板将为您显示隧道列表。编辑您创建的隧道 > 选择 Generate a new pre-shared key(生成新的预共享密钥) > 复制生成的密钥。如果使用的是主动/主动配置,请在第二个隧道上选择 Change to a new custom pre-shared key(更改为新的自定义预共享密钥),并使用为第一个隧道生成的 PSK。
- 为您的 Azure 虚拟网络子网创建静态路由,指定新创建的隧道作为下一跳。
本地网络网关(Local Network Gateway)通常指代您的本地物理位置。在本例中,本地网络网关代表连接的 Cloudflare 侧。
我们建议为您 Cloudflare 的 IPsec 隧道创建一个本地网络网关。
- 创建一个新的本地网络网关。
- 在 Instance details(实例详细信息) > **Endpoint(端点)**中,选择 IP address(IP 地址) 并在 IP 地址字段中输入 Cloudflare Anycast 地址。
- 在 **Address space(s)(地址空间)**中,指定您希望通过 Cloudflare WAN 连接远程访问的任何子网的地址范围。例如,如果您想访问 IP 范围为
192.168.1.0/24的网络,且此网络连接到您的 Cloudflare WAN 租户,您应该将192.168.1.0/24添加到本地网络网关的地址空间中。 - 转到 **Advanced(高级)**选项卡 > BGP settings(BGP 设置),确保选择 No(否)。
Cloudflare WAN 使用隧道健康检查来监控隧道是否可用。
隧道健康检查利用了从 IPsec 隧道 Cloudflare 侧发送到远程端点 (Azure) 的 ICMP 探测包。探测包从隧道的接口地址发送,您需要在两个地方指定该地址:
- Cloudflare 仪表板:在您的 IPsec 隧道配置中,作为虚拟隧道接口 (VTI) 的地址(以便 Cloudflare 知道从哪个地址发送探测)。Cloudflare 要求此地址采用带有
/31子网掩码的无类别域间路由 (CIDR) 表示法。 - Azure 门户:在您的 VPN 站点的地址空间中(以便 Azure 将探测响应路由回隧道)。Azure 要求此地址采用带有
/32子网掩码的 CIDR 表示法。
Cloudflare 建议客户为每个 IPsec 隧道选择一个唯一的 /31 子网(RFC 1918 - 专用互联网的地址分配 ↗),该子网被视为点对点链路,并提供了满足这两个要求的理想寻址方案。
示例:
- 选择 10.252.3.55/31 作为您的点对点链路子网。
- 在 Cloudflare 仪表板中,将
10.252.3.55/31设置为隧道的 IPv4 接口地址(参阅配置 Cloudflare WAN)。 - 在 Azure 门户中,将
10.252.3.55/32添加到您本地网络网关的**Address space(地址空间)**中。
要配置本地网络网关 (Local Network Gateway) 的地址空间以支持隧道健康检查:
- 编辑在上一节中配置的本地网络网关。
- 选择 Connections(连接)。
- 在 **Address Space(s)(地址空间)**下,以 CIDR 表示法添加来自 Cloudflare 仪表板的 IPsec 隧道的接口地址(例如,
10.252.3.55/32)。 - 如果使用的是主动/主动配置,还要在 **Address Space(s)(地址空间)**下,以 CIDR 表示法添加来自 Cloudflare 仪表板的第二个 IPsec 隧道的接口地址(例如,
10.252.3.56/32)。必须在本地网络网关地址空间中配置两个隧道的接口地址,以确保两个隧道保持健康。 - 选择 Save(保存)。
创建您的 VPN 连接时,选择以下设置:
- Virtual network gateway(虚拟网络网关):选择您在创建虚拟网络网关中创建的虚拟网络网关。
- Local network gateway(本地网络网关):选择在创建本地网络网关中创建的本地网络网关。
- Use Azure Private IP Address(使用 Azure 私有 IP 地址):已禁用
- BGP:已禁用
- IPsec / IKE 策略:Custom(自定义)
- IKE 阶段 1
- Encryption(加密):GCMAES256
- Integrity/PRF(完整性/PRF):SHA384
- DH Group(DH 组):ECP384
- IKE 阶段 2 (IPsec)
- IPsec Encryption(IPsec 加密):GCMAES256
- IPsec Integrity(IPsec 完整性):GCMAES256
- PFS Group(PFS 组):ECP384
- 以 KB 为单位的 IPsec SA 生存周期:
0 - 以秒为单位的 IPsec SA 生存周期:
28800 - 使用基于策略的流量选择器:禁用
- 以秒为单位的 DPD 超时时间:
45 - 连接模式:InitiatorOnly(仅限发起方)
- 使用自定义流量选择器:已禁用
- IKE 阶段 1
- 创建连接后,选择 Settings(设置)> Authentication(身份验证),并 input 您的 PSK(这需要与 Cloudflare WAN 配置中使用的 PSK 相匹配)。
重复此过程,为连接到对应于冗余 Cloudflare Anycast IP 地址的本地网络网关定义设置。
Cloudflare Zero Trust 客户可以通过 Cloudflare WAN 将流向互联网的流量路由到互联网,使其通过 Cloudflare Gateway。
Microsoft 不允许在本地网络网关的“地址空间”下指定默认路由 (0.0.0.0/0)。但是,可以通过使用路由汇总来绕过此限制。
- 转到 **Local network gateways(本地网络网关)**并选择所需的对象。
- 转到 Configuration(配置) > **Address Space(s)(地址空间)**并指定以下两个子网:
0.0.0.0/1和128.0.0.0/1。 - 不要删除配置用于支持隧道健康检查的子网。
- 选择 Save(保存)。
如果您选择通过 Cloudflare WAN 路由所有发往互联网的流量,并希望利用 HTTPS TLS 解密功能,则需要在您的用户设备上安装并信任 Cloudflare Zero Trust 根证书颁发机构(CA)证书。您既可以安装 Cloudflare 提供的证书(默认选项),也可以生成自己的自定义证书并将其上传到 Cloudflare。
有关如何安装根 CA 证书的更多详细信息,请参阅 Cloudflare Zero Trust 文档中的用户侧证书。
安装根 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"
}一旦您确定已建立连接,Cloudflare 建议您禁用 Azure 虚拟网络网关站点到站点 VPN 连接的防重放保护。这可以通过 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- 发起 API 调用以显示与 Azure 虚拟网络网关相关联的站点到站点 VPN 连接的详细信息(
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 仪表板中保持勾选重放保护设置,并等待几分钟后再重新验证连接。