使用 PowerShell 创建具有站点到站点 VPN 连接的 VNet

本文介绍如何使用 PowerShell 创建站点到站点 VPN 网关连接,以便从本地网络连接到 VNet。 本文中的步骤适用于 Resource Manager 部署模型。 也可使用不同的部署工具或部署模型来创建此配置,方法是从以下列表中选择另一选项:

使用站点到站点 VPN 网关连接,通过 IPsec/IKE(IKEv1 或 IKEv2)VPN 隧道将本地网络连接到 Azure 虚拟网络。 此类型的连接要求位于本地的 VPN 设备分配有一个面向外部的公共 IP 地址。 有关 VPN 网关的详细信息,请参阅关于 VPN 网关

站点到站点 VPN 网关跨界连接示意图

准备工作

在开始配置之前,请验证你是否符合以下条件:

  • 确保有一台兼容的 VPN 设备,并且可对其进行配置。 有关兼容的 VPN 设备和设备配置的详细信息,请参阅关于 VPN 设备
  • 确认 VPN 设备有一个面向外部的公共 IPv4 地址。
  • 如果不熟悉本地网络配置中的 IP 地址范围,则需咨询能够提供此类详细信息的人员。 创建此配置时,必须指定 IP 地址范围前缀,Azure 会将该前缀路由到本地位置。 本地网络的任何子网都不得与要连接到的虚拟网络子网重叠。

Azure PowerShell

可以在计算机本地安装并运行 Azure PowerShell cmdlet。 PowerShell cmdlet 经常更新。 如果尚未安装最新版本,说明中指定的值可能会导致出错。 若要查找计算机上安装的 Azure PowerShell 的版本,请使用 Get-Module -ListAvailable Az cmdlet。 若要进行安装或更新,请参阅安装 Azure PowerShell 模块

示例值

本文中的示例使用以下值。 可使用这些值创建测试环境,或参考这些值以更好地理解本文中的示例。

#Example values

VnetName                = VNet1
ResourceGroup           = TestRG1
Location                = China North 
AddressSpace            = 10.1.0.0/16 
SubnetName              = Frontend 
Subnet                  = 10.1.0.0/24 
GatewaySubnet           = 10.1.255.0/27
LocalNetworkGatewayName = Site1
LNG Public IP           = <On-premises VPN device IP address> 
Local Address Prefixes  = 10.101.0.0/24, 10.101.1.0/24
Gateway Name            = VNet1GW
PublicIP                = VNet1GWPIP
Gateway IP Config       = gwipconfig1 
VPNType                 = RouteBased 
GatewayType             = Vpn 
ConnectionName          = VNet1toSite1

1.创建虚拟网络和网关子网

如果还没有虚拟网络,请创建。 创建虚拟网络时,请确保指定的地址空间不与本地网络的任一个地址空间相重叠。

备注

为了让此 VNet 连接到本地位置,需与本地网络管理员协调操作,指定一个 IP 地址范围,将其专用于此虚拟网络。 如果 VPN 连接的两侧存在重复的地址范围,则流量不会按预期的方式路由。 另外,若要将此 VNet 连接到其他 VNet,则地址空间不能与其他 VNet 重叠。 请注意对网络配置进行相应的计划。

关于网关子网

虚拟网络网关使用称作“网关子网”的特定子网。 网关子网是虚拟网络 IP 地址范围的一部分,该范围是在配置虚拟网络时指定的。 网关子网包含虚拟网络网关资源和服务使用的 IP 地址。 要使 Azure 能够部署网关资源,必须将子网命名为“GatewaySubnet”。 不能指定要将网关资源部署到的其他子网。 如果没有名为“GatewaySubnet”的子网,则无法创建 VPN 网关。

创建网关子网时,请指定子网包含的 IP 地址数。 所需的 IP 地址数目取决于要创建的 VPN 网关配置。 有些配置需要具有比其他配置更多的 IP 地址。 我们建议创建使用 /27 或 /28 的网关子网。

如果出现错误,指出地址空间与子网重叠,或者子网不包含在虚拟网络的地址空间中,请检查 VNet 地址范围。 出错的原因可能是为虚拟网络创建的地址范围中没有足够的可用 IP 地址。 例如,如果默认子网包含整个地址范围,则不会有剩余的 IP 地址用于创建更多子网。 可以调整现有地址空间中的子网以释放 IP 地址,或指定额外的地址范围并在其中创建网关子网。

重要

使用网关子网时,避免将网络安全组 (NSG) 与网关子网关联。 将网络安全组与此子网关联可能会导致虚拟网络网关(VPN、Express Route 网关)停止按预期方式工作。 有关网络安全组的详细信息,请参阅什么是网络安全组?

创建虚拟网络和网关子网

此示例创建虚拟网络和网关子网。 如果已经有一个虚拟网络且需要向其添加网关子网,请参阅向已创建的虚拟网络添加网关子网

创建资源组:

New-AzResourceGroup -Name TestRG1 -Location 'China North'

创建虚拟网络。

  1. 设置变量。

    $subnet1 = New-AzVirtualNetworkSubnetConfig -Name 'GatewaySubnet' -AddressPrefix 10.1.255.0/27
    $subnet2 = New-AzVirtualNetworkSubnetConfig -Name 'Frontend' -AddressPrefix 10.1.0.0/24
    
  2. 创建 VNet。

    New-AzVirtualNetwork -Name VNet1 -ResourceGroupName TestRG1 `
    -Location 'China North' -AddressPrefix 10.1.0.0/16 -Subnet $subnet1, $subnet2
    

将网关子网添加到已创建的虚拟网络

如果已经有虚拟网络,但需添加网关子网,则请使用此部分的步骤。

  1. 设置变量。

    $vnet = Get-AzVirtualNetwork -ResourceGroupName TestRG1 -Name VNet1
    
  2. 创建网关子网。

    Add-AzVirtualNetworkSubnetConfig -Name 'GatewaySubnet' -AddressPrefix 10.1.255.0/27 -VirtualNetwork $vnet
    
  3. 设置配置。

    Set-AzVirtualNetwork -VirtualNetwork $vnet
    

2.创建本地网关

本地网关 (LNG) 通常是指本地位置。 它与虚拟网关不同。 可以为站点提供一个名称供 Azure 引用,并指定本地 VPN 设备的 IP 地址,以便创建一个连接来连接到该设备。 此外还可指定 IP 地址前缀,以便通过 VPN 网关将其路由到 VPN 设备。 指定的地址前缀是位于本地网络的前缀。 如果本地网络出现变化,可以轻松更新这些前缀。

使用以下值:

  • GatewayIPAddress 是本地 VPN 设备的 IP 地址。
  • AddressPrefix 是本地地址空间。

若要添加具有单个地址前缀的局域网网关:

New-AzLocalNetworkGateway -Name Site1 -ResourceGroupName TestRG1 `
-Location 'China North' -GatewayIpAddress '23.99.221.164' -AddressPrefix '10.101.0.0/24'

若要添加具有多个地址前缀的局域网网关:

New-AzLocalNetworkGateway -Name Site1 -ResourceGroupName TestRG1 `
-Location 'China North' -GatewayIpAddress '23.99.221.164' -AddressPrefix @('10.101.0.0/24','10.101.1.0/24')

若要为本地网关修改 IP 地址前缀:

有时局域网网关前缀会有变化。 修改 IP 地址前缀时采取的步骤取决于是否已创建 VPN 网关连接。 请参阅本文的 修改本地网关的 IP 地址前缀 部分。

3.请求公共 IP 地址

VPN 网关必须具有公共 IP 地址。 请先请求 IP 地址资源,并在创建虚拟网关时参阅该资源。 创建 VPN 网关时,IP 地址是动态分配给资源的。

VPN 网关当前仅支持动态 公共 IP 地址分配。 不能请求静态公共 IP 地址分配。 但这并不意味着 IP 地址在分配到 VPN 网关后会更改。 公共 IP 地址只在删除或重新创建网关时更改。 该地址不会因为 VPN 网关大小调整、重置或其他内部维护/升级而更改。

请求一个公共 IP 地址,该地址将分配给虚拟网络 VPN 网关。

$gwpip= New-AzPublicIpAddress -Name VNet1GWPIP -ResourceGroupName TestRG1 -Location 'China North' -AllocationMethod Dynamic

4.创建网关 IP 寻址配置

网关配置定义要使用的子网(“GatewaySubnet”)和公共 IP 地址。 使用以下示例创建网关配置:

$vnet = Get-AzVirtualNetwork -Name VNet1 -ResourceGroupName TestRG1
$subnet = Get-AzVirtualNetworkSubnetConfig -Name 'GatewaySubnet' -VirtualNetwork $vnet
$gwipconfig = New-AzVirtualNetworkGatewayIpConfig -Name gwipconfig1 -SubnetId $subnet.Id -PublicIpAddressId $gwpip.Id

5.创建 VPN 网关

创建虚拟网络 VPN 网关。

使用以下值:

  • 站点到站点配置的 -GatewayTypeVpn。 网关类型永远是你要实现的配置的特定类型。 例如,其他网关配置可能需要 -GatewayType ExpressRoute。
  • -VpnType 可以是 RouteBased(在某些文档中称为动态网关)或 PolicyBased(在某些文档中称为静态网关)。 有关 VPN 网关类型的详细信息,请参阅关于 VPN 网关
  • 选择要使用的网关 SKU。 某些 SKU 存在配置限制。 有关详细信息,请参阅网关 SKU。 如果创建 VPN 网关时出错(不管 -GatewaySku 是什么),请检查是否已安装最新版本的 PowerShell cmdlet。
New-AzVirtualNetworkGateway -Name VNet1GW -ResourceGroupName TestRG1 `
-Location 'China North' -IpConfigurations $gwipconfig -GatewayType Vpn `
-VpnType RouteBased -GatewaySku VpnGw1

运行此命令以后,可能需要长达 45 分钟的时间才能完成网关配置。

6.配置 VPN 设备

通过站点到站点连接连接到本地网络需要 VPN 设备。 在此步骤中,请配置 VPN 设备。 配置 VPN 设备时,需要以下项:

  • 共享密钥。 此共享密钥就是在创建站点到站点 VPN 连接时指定的共享密钥。 在示例中,我们使用基本的共享密钥。 建议生成更复杂的可用密钥。

  • 虚拟网络网关的“公共 IP 地址”。 可以通过 Azure 门户、PowerShell 或 CLI 查看公共 IP 地址。 若要使用 PowerShell 查找虚拟网关的公共 IP 地址,请使用以下示例。 在此示例中,VNet1GWPIP 是在前面步骤中创建的公共 IP 地址资源的名称。

    Get-AzPublicIpAddress -Name VNet1GWPIP -ResourceGroupName TestRG1
    

下载 VPN 设备配置脚本:

根据所用的 VPN 设备,有时可以下载 VPN 设备配置脚本。 有关详细信息,请参阅下载 VPN 设备配置脚本

参阅以下链接了解其他配置信息:

7.创建 VPN 连接

接下来,会在虚拟网络网关和 VPN 设备之间创建站点到站点 VPN 连接。 请务必替换成自己的值。 共享密钥必须与用于 VPN 设备配置的值匹配。 请注意,站点到站点的“-ConnectionType”为 IPsec

  1. 设置变量。

    $gateway1 = Get-AzVirtualNetworkGateway -Name VNet1GW -ResourceGroupName TestRG1
    $local = Get-AzLocalNetworkGateway -Name Site1 -ResourceGroupName TestRG1
    
  2. 创建连接。

    New-AzVirtualNetworkGatewayConnection -Name VNet1toSite1 -ResourceGroupName TestRG1 `
    -Location 'China North' -VirtualNetworkGateway1 $gateway1 -LocalNetworkGateway2 $local `
    -ConnectionType IPsec -RoutingWeight 10 -SharedKey 'abc123'
    

在一小段时间后,将建立该连接。

8.验证 VPN 连接

VPN 连接有几种不同的验证方式。

可以验证连接是否成功,方法是使用“Get-AzVirtualNetworkGatewayConnection”cmdlet,带或不带“-Debug”。

  1. 使用以下 cmdlet 示例,配置符合自己需要的值。 如果出现提示,请选择“A”运行“所有”。 在此示例中,“ -Name”是指要测试的连接的名称。

    Get-AzVirtualNetworkGatewayConnection -Name VNet1toSite1 -ResourceGroupName TestRG1
    
  2. cmdlet 运行完毕后,查看该值。 在以下示例中,连接状态显示为“已连接”,且可以看到入口和出口字节数。

    "connectionStatus": "Connected",
    "ingressBytesTransferred": 33509044,
    "egressBytesTransferred": 4142431
    

连接到虚拟机

可以连接到已部署到 VNet 的 VM,方法是创建到 VM 的远程桌面连接。 若要通过初始验证来确认能否连接到 VM,最好的方式是使用其专用 IP 地址而不是计算机名称进行连接。 这种方式是测试能否进行连接,而不是测试名称解析是否已正确配置。

  1. 定位专用 IP 地址。 查找 VM 的专用 IP 地址时,可以通过 Azure 门户或 PowerShell 查看 VM 的属性。

    • Azure 门户 - 在 Azure 门户中定位虚拟机。 查看 VM 的属性。 专用 IP 地址已列出。

    • PowerShell - 通过此示例查看资源组中的 VM 和专用 IP 地址的列表。 在使用此示例之前不需对其进行修改。

      $VMs = Get-AzVM
      $Nics = Get-AzNetworkInterface | Where VirtualMachine -ne $null
      
      foreach($Nic in $Nics)
      {
      $VM = $VMs | Where-Object -Property Id -eq $Nic.VirtualMachine.Id
      $Prv = $Nic.IpConfigurations | Select-Object -ExpandProperty PrivateIpAddress
      $Alloc = $Nic.IpConfigurations | Select-Object -ExpandProperty PrivateIpAllocationMethod
      Write-Output "$($VM.Name): $Prv,$Alloc"
      }
      
  2. 验证你是否已使用点到站点 VPN 连接连接到 VNet。

  3. 打开 远程桌面连接,方法是:在任务栏的搜索框中键入“RDP”或“远程桌面连接”,并选择“远程桌面连接”。 也可在 PowerShell 中使用“mstsc”命令打开远程桌面连接。

  4. 在远程桌面连接中,输入 VM 的专用 IP 地址。 可以通过单击“显示选项”来调整其他设置,并进行连接。

排查连接问题

如果无法通过 VPN 连接连接到虚拟机,请查看以下项目:

  • 验证 VPN 连接是否成功。

  • 验证是否已连接到 VM 的专用 IP 地址。

  • 如果可以使用专用 IP 地址连接到 VM,但不能使用计算机名称进行连接,则请验证是否已正确配置 DNS。 若要详细了解如何对 VM 进行名称解析,请参阅针对 VM 的名称解析

  • 若要详细了解 RDP 连接,请参阅排查远程桌面连接到 VM 的问题

修改本地网关的 IP 地址前缀

如果需要路由到本地位置的 IP 地址前缀更改,则可修改本地网关。 使用这些示例时,修改这些值以匹配你的环境。

添加其他地址前缀:

  1. 设置 LocalNetworkGateway 的变量。

    $local = Get-AzLocalNetworkGateway -Name Site1 -ResourceGroupName TestRG1
    
  2. 修改前缀。

    Set-AzLocalNetworkGateway -LocalNetworkGateway $local `
    -AddressPrefix @('10.101.0.0/24','10.101.1.0/24','10.101.2.0/24')
    

删除地址前缀:

省去你不再需要的前缀。 在此示例中,我们不再需要前缀 10.101.2.0/24(来自前面的示例),因此需更新本地网关,排除该前缀。

  1. 设置 LocalNetworkGateway 的变量。

    $local = Get-AzLocalNetworkGateway -Name Site1 -ResourceGroupName TestRG1
    
  2. 使用更新的前缀设置网关。

    Set-AzLocalNetworkGateway -LocalNetworkGateway $local `
    -AddressPrefix @('10.101.0.0/24','10.101.1.0/24')
    

修改本地网关的 IP 地址

如果要连接的 VPN 设备已更改其公共 IP 地址,则需根据该更改修改本地网关。 修改此值时,还可同时修改地址前缀。 请务必使用本地网关的现有名称来覆盖当前设置。 如果使用其他名称,请创建一个新的本地网关,而不是覆盖现有的。

New-AzLocalNetworkGateway -Name Site1 `
-Location "China North" -AddressPrefix @('10.101.0.0/24','10.101.1.0/24') `
-GatewayIpAddress "5.4.3.2" -ResourceGroupName TestRG1

删除网关连接

如果不知道连接的名称,可以使用“Get-AzVirtualNetworkGatewayConnection”cmdlet 找到它。

Remove-AzVirtualNetworkGatewayConnection -Name VNet1toSite1 `
-ResourceGroupName TestRG1

后续步骤