使用 Azure CLI 配置 VNet 到 VNet 的 VPN 网关连接

本文介绍如何使用 VNet 到 VNet 连接类型来连接虚拟网络。 虚拟网络可位于相同或不同的区域,来自相同或不同的订阅。 从不同的订阅连接 VNet 时,订阅不需要与相同的租户相关联。

VNet 到 VNet 关系图。

在本练习中,你将创建所需的虚拟网络 (VNet) 和 VPN 网关。 我们提供一些步骤来连接同一订阅中的 VNet,还提供一些步骤和命令来处理更复杂的场景,即连接不同订阅中的 VNet。

用于创建连接的 Azure CLI 命令是 az network vpn-connection。 如果要从不同的订阅连接 VNet,请使用本文或 PowerShell 文章中的步骤。 如果已有要连接的 VNet,并且它们位于同一订阅中,则可能需要改用 Azure 门户步骤,因为该过程不太复杂。 请注意,无法使用 Azure 门户从不同的订阅连接 VNet。

关于连接 VNet

可通过多种方式来连接 VNet。 以下部分介绍如何通过不同的方式连接虚拟网络。

VNet 到 VNet

配置一个 VNet 到 VNet 连接即可轻松地连接 VNet。 使用 VNet 到 VNet 连接类型将一个虚拟网络连接到另一个虚拟网络类似于创建到本地位置的站点到站点 IPsec 连接。 这两种连接类型都使用 VPN 网关来提供使用 IPsec/IKE 的安全隧道,二者在通信时使用同样的方式运行。 连接类型的差异在于本地网关的配置方式。 创建 VNet 到 VNet 连接时,看不到本地网关地址空间。 会自动创建和填充该空间。 如果更新一个 VNet 的地址空间,另一个 VNet 会自动知道路由到更新的地址空间。 与在 VNet 之间创建站点到站点连接相比,创建 VNet 到 VNet 连接通常速度更快且更容易,但如果想添加另一个连接,则无法提供相同级别的灵活性,因为本地网关地址空间无法手动修改。

使用站点到站点 (IPsec) 步骤连接 VNet

如果要进行复杂的网络配置,则与使用 VNet 到 VNet 步骤相比,使用站点到站点步骤来连接 VNet 会更好。 使用站点到站点步骤时,可以手动创建和配置本地网关。 每个 VNet 的本地网关都将其他 VNet 视为本地站点。 这样可以为本地网关指定路由流量所需的其他地址空间。 如果 VNet 的地址空间更改,则需根据更改手动更新相应的本地网关。 它不会自动更新。

VNet 对等互连

可以考虑使用 VNet 对等互连来连接 VNet。 VNet 对等互连不使用 VPN 网关,并且具有不同的约束。 另外,VNet 对等互连定价的计算不同于 VNet 到 VNet VPN 网关定价的计算。 有关详细信息,请参阅 VNet 对等互连

为何创建 VNet 到 VNet 连接?

你可能会出于以下原因而使用 VNet 到 VNet 连接来连接虚拟网络:

  • 跨区域地域冗余和地域存在

    • 可以使用安全连接设置自己的异地复制或同步,而无需借助于面向 Internet 的终结点。
    • 使用 Azure 流量管理器和负载均衡器,可以设置支持跨多个 Azure 区域实现异地冗余的高可用性工作负荷。 一个重要的示例就是对分布在多个 Azure 区域中的可用性组设置 SQL Always On。
  • 具有隔离或管理边界的区域多层应用程序

    • 在同一区域中,由于存在隔离或管理要求,可以设置具有多个虚拟网络的多层应用程序,这些虚拟网络相互连接在一起。

可以将 VNet 到 VNet 通信与多站点配置组合使用。 这样,便可以建立将跨界连接与虚拟网络间连接相结合的网络拓扑。

应使用哪些 VNet 到 VNet 步骤?

在本文中,可以看到两组不同的 VNet 到 VNet 连接步骤。 一组步骤适用于驻留在同一订阅中的 VNet,另一组适用于驻留在不同订阅中的 VNet

就本练习来说,可以将配置组合起来,也可以只是选择要使用的配置。 所有配置使用 VNet 到 VNet 连接类型。 网络流量在彼此直接连接的 VNet 之间流动。

连接同一订阅中的 VNet

准备阶段

在开始之前,请安装最新版本的 CLI 命令(2.0 或更高版本)。 有关安装 CLI 命令的信息,请参阅安装 Azure CLI

规划 IP 地址范围

以下步骤将创建两个虚拟网络,以及它们各自的网关子网和配置。 然后在两个 VNet 之间创建 VPN 连接。 必须计划用于网络配置的 IP 地址范围。 请记住,必须确保没有任何 VNet 范围或本地网络范围存在任何形式的重叠。 在这些示例中,我们没有包括 DNS 服务器。 如果需要虚拟网络的名称解析,请参阅名称解析

示例中使用了以下值:

TestVNet1 的值:

  • VNet 名称:TestVNet1
  • 资源组:TestRG1
  • 位置:中国东部
  • TestVNet1:10.11.0.0/16 和 10.12.0.0/16
  • FrontEnd:10.11.0.0/24
  • BackEnd:10.12.0.0/24
  • GatewaySubnet:10.12.255.0/27
  • GatewayName:VNet1GW
  • 公共 IP:VNet1GWIP
  • VPNType:RouteBased
  • 连接(1 到 4):VNet1 到 VNet4
  • Connection(1to5):VNet1toVNet5(适用于不同订阅中的 VNet)

TestVNet4 的值:

  • VNet 名称:TestVNet4
  • TestVNet2:10.41.0.0/16 和 10.42.0.0/16
  • FrontEnd:10.41.0.0/24
  • BackEnd:10.42.0.0/24
  • GatewaySubnet:10.42.255.0/27
  • 资源组:TestRG4
  • 位置:中国北部
  • GatewayName:VNet4GW
  • 公共 IP:VNet4GWIP
  • VPN 类型: RouteBased
  • 连接:VNet4 到 VNet1

步骤 1 - 连接到订阅

  1. 使用 az login 命令登录到 Azure 订阅,并按照屏幕上的说明进行操作。 有关登录的详细信息,请参阅 Azure CLI 入门

    az cloud set -n AzureChinaCloud
    az login
    
  2. 如果有多个 Azure 订阅,请列出该帐户的订阅。

    az account list --all
    
  3. 指定要使用的订阅。

    az account set --subscription <replace_with_your_subscription_id>
    

步骤 2 - 创建并配置 TestVNet1

  1. 创建资源组。

    az group create -n TestRG1  -l chinaeast
    
  2. 使用 az network vnet create 命令创建 TestVNet1 以及 TestVNet1 的子网。 以下示例创建名为“TestVNet1”的虚拟网络和名为“FrontEnd”的子网。

    az network vnet create \
      -n TestVNet1 \
      -g TestRG1 \
      -l chinaeast \
      --address-prefix 10.11.0.0/16 \
      --subnet-name Frontend \
      --subnet-prefix 10.11.0.0/24
    
  3. 为后端子网创建额外的地址空间。 请注意,这一步指定了此前创建的地址空间,以及需要添加的额外地址空间。 这是因为,az network vnet update 命令覆盖以前的设置。 请确保在使用此命令时指定所有地址前缀。

    az network vnet update \
       -n TestVNet1 \
       --address-prefixes 10.11.0.0/16 10.12.0.0/16 \
       -g TestRG1
    
  4. 创建后端子网。

    az network vnet subnet create \
       --vnet-name TestVNet1 \
       -n BackEnd \
       -g TestRG1 \
       --address-prefix 10.12.0.0/24
    
  5. 创建网关子网。 请注意,网关子网命名为“GatewaySubnet”。 此名称是必需的。 在本示例中,网关子网使用 /27。 尽管创建的网关子网最小可为 /29,但建议至少选择 /28 或 /27,创建包含更多地址的更大子网。 这样便可以留出足够多的地址,满足将来可能需要使用的其他配置。

    az network vnet subnet create \
       --vnet-name TestVNet1 \
       -n GatewaySubnet \
       -g TestRG1 \
       --address-prefix 10.12.255.0/27
    
  6. VPN 网关必须使用公共 IP 地址。 公共 IP 地址分配给你为虚拟网络创建的 VPN 网关。 参照以下示例,使用 az network public-ip create 命令请求公共 IP 地址:

    az network public-ip create \
     -g TestRG1 \
     -n VNet1GWIP1 \
     --sku Standard \
     --allocation-method Static \
     --l chinaeast
    
  7. 使用 az network vnet-gateway create 命令创建 TestVNet1 的虚拟网络网关。 如果使用“--no-wait”参数运行该命令,则不会显示任何反馈或输出。 “--no-wait”参数允许在后台创建网关, 但并不意味着 VPN 网关会立即创建完毕。 创建网关通常需要 45 分钟或更长的时间,具体取决于所使用的网关 SKU。

    az network vnet-gateway create \
      --name VNet1GW \
      --public-ip-address VNet1GWIP \
      --resource-group TestRG1 \
      --vnet TestVNet1 \
      --gateway-type Vpn \
      --sku VpnGw2 \
      --vpn-gateway-generation Generation2 \
      --no-wait
    

步骤 3 - 创建并配置 TestVNet4

  1. 创建资源组。

    az group create -n TestRG4 -l chinanorth
    
  2. 创建 TestVNet4。

    az network vnet create \
      -n TestVNet4 \
      -g TestRG4 \
      -l chinanorth \
      --address-prefix 10.41.0.0/16 \
      --subnet-name Frontend \
      --subnet-prefix 10.41.0.0/24
    
  3. 为 TestVNet4 创建额外的子网。

    az network vnet update \
       -n TestVNet4 \
       --address-prefixes 10.41.0.0/16 10.42.0.0/16 \
       -g TestRG4 \
    
    az network vnet subnet create \
       --vnet-name TestVNet4 \
       -n BackEnd \
       -g TestRG4 \
       --address-prefix 10.42.0.0/24 
    
  4. 创建网关子网。

    az network vnet subnet create \
      --vnet-name TestVNet4 \
      -n GatewaySubnet \
      -g TestRG4 \
      --address-prefix 10.42.255.0/27 
    
  5. 请求公共 IP 地址。

    az network public-ip create \
     -g TestRG4 \
     --n VNet4GWIP \
     --sku Standard \
     --allocation-method Static \
     --l chinanorth
    
  6. 创建 TestVNet4 虚拟网络网关。

    az network vnet-gateway create \
      -n VNet4GW \
      -l chinanorth \
      --public-ip-address VNet4GWIP \
      -g TestRG4 \
      --vnet TestVNet4 \
      --gateway-type Vpn \
      --sku VpnGw2 \
      --vpn-gateway-generation Generation2 \
      --no-wait
    

步骤 4 - 创建连接

现在有两个带 VPN 网关的 VNet。 下一步是创建虚拟网络网关之间的 VPN 网关连接。 如果使用了上面的示例,则 VNet 网关位于不同的资源组。 如果网关位于不同的资源组中,则在进行连接时需标识并指定每个网关的资源 ID。 如果 VNet 位于同一资源组中,则可使用第二组说明,因为不需指定资源 ID。

若要连接驻留在不同资源组中的 VNet,请执行以下步骤

  1. 从以下命令的输出中获取 VNet1GW 的资源 ID:

    az network vnet-gateway show -n VNet1GW -g TestRG1
    

    在输出中,找到 "id:" 行。 引号中的值是在下一部分创建连接所必需的。 将这些值复制到文本编辑器(例如记事本),这样就可以在创建连接时轻松地粘贴它们。

    示例输出:

    "activeActive": false, 
    "bgpSettings": { 
     "asn": 65515, 
     "bgpPeeringAddress": "10.12.255.30", 
     "peerWeight": 0 
    }, 
    "enableBgp": false, 
    "etag": "W/\"ecb42bc5-c176-44e1-802f-b0ce2962ac04\"", 
    "gatewayDefaultSite": null, 
    "gatewayType": "Vpn", 
    "id": "/subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW", 
    "ipConfigurations":
    

    复制引号中 "id": 后面的值。

    "id": "/subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW"
    
  2. 获取 VNet4GW 的资源 ID 并将值复制到文本编辑器。

    az network vnet-gateway show -n VNet4GW -g TestRG4
    
  3. 创建 TestVNet1 到 TestVNet4 的连接。 本步骤创建从 TestVNet1 到 TestVNet4 的连接。 示例中引用了一个共享密钥。 可以对共享密钥使用自己的值。 共享密钥必须与两个连接匹配,这一点非常重要。 创建连接短时间即可完成。

    az network vpn-connection create \
       -n VNet1ToVNet4 \
       -g TestRG1 \
       --vnet-gateway1 /subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW \
       -l chinaeast \
       --shared-key "aabbcc" \
       --vnet-gateway2 /subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG4/providers/Microsoft.Network/virtualNetworkGateways/VNet4GW 
    
  4. 创建 TestVNet4 到 TestVNet1 的连接。 此步骤与上述步骤类似,只不过是创建 TestVNet4 到 TestVNet1 的连接。 确保共享密钥匹配。 建立连接需要数分钟的时间。

    az network vpn-connection create \
       -n VNet4ToVNet1 \
       -g TestRG4 \
       --vnet-gateway1 /subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG4/providers/Microsoft.Network/virtualNetworkGateways/VNet4GW \
       -l chinanorth \
       --shared-key "aabbcc" \
       --vnet-gateway2 /subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW
    
  5. 验证连接。 请参阅验证连接

若要连接驻留在同一资源组中的 VNet,请执行以下步骤

  1. 创建 TestVNet1 到 TestVNet4 的连接。 本步骤创建从 TestVNet1 到 TestVNet4 的连接。 请注意,示例中的资源组是相同的。 还可以看到示例中引用了共享密钥。 可以对共享密钥使用你自己的值,但两个连接的共享密钥必须匹配。 创建连接短时间即可完成。

    az network vpn-connection create \
       -n VNet1ToVNet4 \
       -g TestRG1 \
       --vnet-gateway1 VNet1GW \
       -l chinaeast \
       --shared-key "eeffgg" \
       --vnet-gateway2 VNet4GW
    
  2. 创建 TestVNet4 到 TestVNet1 的连接。 此步骤与上述步骤类似,只不过是创建 TestVNet4 到 TestVNet1 的连接。 确保共享密钥匹配。 建立连接需要数分钟的时间。

    az network vpn-connection create \
       -n VNet4ToVNet1 \
       -g TestRG1 \
       --vnet-gateway1 VNet4GW \
       -l chinaeast \
       --shared-key "eeffgg" \
       --vnet-gateway2 VNet1GW
    
  3. 验证连接。 请参阅验证连接

连接不同订阅中的 VNet

在此方案中,连接 TestVNet1 和 TestVNet5。 VNet 驻留在不同订阅中。 订阅不需要与相同的租户相关联。 此配置的步骤将添加额外的 VNet 到 VNet 连接,将 TestVNet1 连接到 TestVNet5。

步骤 5 - 创建并配置 TestVNet1

以下说明是前述部分各步骤说明的继续。 必须完成步骤 1步骤 2,才能创建并配置 TestVNet1 及其 VPN 网关。 对于此配置,不需创建上一部分中的 TestVNet4,虽然即使创建了它,也不会与这些步骤冲突:来自 TestVNet4 的流量不会路由到 TestVNet5。 完成步骤 1 和步骤 2 后,继续执行步骤 6。

步骤 6 - 验证 IP 地址范围

创建其他连接时,必须验证新虚拟网络的 IP 地址空间是否不与任何其他的 VNet 范围或本地网关范围重叠。 对于本练习,可以对 TestVNet5 使用以下值:

TestVNet5 的值:

  • VNet 名称:TestVNet5
  • 资源组:TestRG5
  • 位置:中国东部 2
  • TestVNet5:10.51.0.0/16 和 10.52.0.0/16
  • FrontEnd:10.51.0.0/24
  • BackEnd:10.52.0.0/24
  • GatewaySubnet:10.52.255.0/27
  • GatewayName:VNet5GW
  • 公共 IP:VNet5GWIP
  • VPN 类型: RouteBased
  • 连接:VNet5toVNet1
  • 连接类型:VNet2VNet

步骤 7 - 创建并配置 TestVNet5

必须在新订阅(订阅 5)环境中完成此步骤。 此部分可能由拥有订阅的不同组织的管理员执行。 若要在订阅之间进行切换,请使用 az account list --all 列出可供帐户使用的订阅,然后使用 az account set --subscription <subscriptionID> 切换到要使用的订阅。

  1. 请确保连接到订阅 5,并创建资源组。

    az group create -n TestRG5  -l chinaeast2
    
  2. 创建 TestVNet5。

    az network vnet create \
       -n TestVNet5 \
       -g TestRG5 \
       --address-prefix 10.51.0.0/16 \
       -l chinaeast2 \
       --subnet-name FrontEnd \
       --subnet-prefix 10.51.0.0/24
    
  3. 添加子网。

    az network vnet update \
       -n TestVNet5 \
       --address-prefixes 10.51.0.0/16 10.52.0.0/16 \
       -g TestRG5 \
    
    az network vnet subnet create \
       --vnet-name TestVNet5 \
       -n BackEnd \
       -g TestRG5 \
       --address-prefix 10.52.0.0/24
    
  4. 添加网关子网。

    az network vnet subnet create \
       --vnet-name TestVNet5 \
       -n GatewaySubnet \
       -g TestRG5 \
       --address-prefix 10.52.255.0/27
    
  5. 请求公共 IP 地址。

    az network public-ip create \
       -g TestRG5 \
       --n VNet5GWIP \
       --sku Standard \
       --allocation-method Static \
       --l chinaeast2
    
  6. 创建 TestVNet5 网关

    az network vnet-gateway create \
      -n VNet5GW \
      -l chinaeast2 \
      --public-ip-address VNet5GWIP \
      -g TestRG5 \
      --vnet TestVNet5 \
      --gateway-type Vpn \
      --sku VpnGw2 \
      --vpn-gateway-generation Generation2 \
      --no-wait
    

步骤 8 - 创建连接

由于网关位于不同订阅中,因此将此步骤拆分成两个 CLI 会话,分别标记为“[订阅 1]”和“[订阅 5]”。 若要在订阅之间进行切换,请使用 az account list --all 列出可供帐户使用的订阅,然后使用 az account set --subscription <subscriptionID> 切换到要使用的订阅。

  1. [订阅 1] 登录并连接到订阅 1。 运行以下命令,从输出中获取网关的名称和 ID:

    az network vnet-gateway show -n VNet1GW -g TestRG1
    

    复制 id: 的输出。 通过电子邮件或其他方法将 VNet 网关 (VNet1GW) 的 ID 和名称发送到订阅 5 的管理员。

    示例输出:

    "id": "/subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW"
    
  2. [订阅 5] 登录并连接到订阅 5。 运行以下命令,从输出中获取网关的名称和 ID:

    az network vnet-gateway show -n VNet5GW -g TestRG5
    

    复制 id: 的输出。 通过电子邮件或其他方法将 VNet 网关 (VNet5GW) 的 ID 和名称发送到订阅 1 的管理员。

  3. [订阅 1] 在此步骤中,创建 TestVNet1 到 TestVNet5 的连接。 可以对共享密钥使用你自己的值,但两个连接的共享密钥必须匹配。 创建连接可能需要简短的一段时间才能完成。 请确保连接到订阅 1。

    az network vpn-connection create \
       -n VNet1ToVNet5 \
       -g TestRG1 \
       --vnet-gateway1 /subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW \
       -l chinaeast \
       --shared-key "eeffgg" \
       --vnet-gateway2 /subscriptions/e7e33b39-fe28-4822-b65c-a4db8bbff7cb/resourceGroups/TestRG5/providers/Microsoft.Network/virtualNetworkGateways/VNet5GW
    
  4. [订阅 5] 此步骤类似上一步骤,只不过是创建 TestVNet5 到 TestVNet1 的连接。 请确保共享密钥匹配,并且连接到订阅 5。

    az network vpn-connection create \
       -n VNet5ToVNet1 \
       -g TestRG5 \
       --vnet-gateway1 /subscriptions/e7e33b39-fe28-4822-b65c-a4db8bbff7cb/resourceGroups/TestRG5/providers/Microsoft.Network/virtualNetworkGateways/VNet5GW \
       -l chinaeast2 \
       --shared-key "eeffgg" \
       --vnet-gateway2 /subscriptions/d6ff83d6-713d-41f6-a025-5eb76334fda9/resourceGroups/TestRG1/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW
    

验证连接

重要

不支持网关子网上的网络安全组 (NSG)。 将网络安全组关联到此子网可能会导致虚拟网络网关(VPN 和 ExpressRoute 网关)停止按预期方式工作。 有关网络安全组的详细信息,请参阅什么是网络安全组?

可使用 az network vpn-connection show 命令来验证连接是否成功。 在此示例中,“--name”是指要测试的连接的名称。 当连接处于建立过程中时,连接状态会显示“正在连接”。 建立连接后,状态更改为“已连接”。 使用你的环境的值修改以下示例。

az network vpn-connection show --name <connection-name> --resource-group <resource-group-name>

VNet 到 VNet 常见问题

有关 VNet 到 VNet 的常见问题,请参阅 VPN 网关常见问题解答

后续步骤