你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

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

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

准备阶段

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

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

Azure PowerShell

本文使用 PowerShell cmdlet。 若要运行 cmdlet,可以使用 Azure Cloud Shell。 Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。

要打开 Cloud Shell,只需从代码块的右上角选择“打开 Cloudshell”。 也可以在单独的浏览器标签页中通过转到 https://shell.azure.com/powershell 打开 Cloud Shell。 选择“复制”以复制代码块,将其粘贴到 Cloud Shell 中,然后选择“Enter”键来运行这些代码。

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

示例值

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

#Example values

VnetName                = VNet1
ResourceGroup           = TestRG1
Location                = East US 
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.0.0.0/24, 20.0.0.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 和 ExpressRoute 网关)停止按预期方式工作。 有关网络安全组的详细信息,请参阅什么是网络安全组?

创建虚拟网络和网关子网

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

创建资源组:

New-AzResourceGroup -Name TestRG1 -Location 'East US'

创建虚拟网络。

  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 'East US' -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 'East US' -GatewayIpAddress '23.99.221.164' -AddressPrefix '10.0.0.0/24'

多地址前缀示例

New-AzLocalNetworkGateway -Name Site1 -ResourceGroupName TestRG1 `
-Location 'East US' -GatewayIpAddress '23.99.221.164' -AddressPrefix @('20.0.0.0/24','10.0.0.0/24')

3. 请求公共 IP 地址

VPN 网关必须使用公共 IP 地址。 请先请求 IP 地址资源,并在创建虚拟网关时参阅该资源。 创建 VPN 网关时,IP 地址是动态分配给资源的。 公共 IP 地址只在删除或重新创建网关时会更改。 该地址不会因为 VPN 网关大小调整、重置或其他内部维护/升级而更改。

请求一个用于虚拟网络 VPN 网关的公共 IP 地址。

$gwpip= New-AzPublicIpAddress -Name VNet1GWPIP -ResourceGroupName TestRG1 -Location 'East US' -AllocationMethod Static -Sku Standard

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 网关。 创建网关通常需要 45 分钟或更长的时间,具体取决于所选的网关 SKU。 示例使用以下值:

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

6.配置 VPN 设备

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

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

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

    Get-AzPublicIpAddress -Name VNet1GWPIP -ResourceGroupName TestRG1
    

根据所用的 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 'East US' -VirtualNetworkGateway1 $gateway1 -LocalNetworkGateway2 $local `
    -ConnectionType IPsec -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
    

连接到虚拟机

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

  1. 定位专用 IP 地址。 如需查找 VM 的专用 IP 地址,可以通过在 Azure 门户中查看 VM 的属性或通过使用 PowerShell 实现。

    • Azure 门户:在 Azure 门户中找到你的 VM。 查看 VM 的属性。 专用 IP 地址已列出。

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

      $VMs = Get-AzVM
      $Nics = Get-AzNetworkInterface | Where-Object 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. 验证是否已连接到虚拟网络。

  3. 通过在任务栏上的搜索框中输入“RDP”或“远程桌面连接”,打开远程桌面连接。 然后选择“远程桌面连接”。 也可在 PowerShell 中使用 mstsc 命令来打开远程桌面连接

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

如果无法通过 VPN 连接连接到 VM,请检查以下各项:

  • 验证 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 "East US" -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

后续步骤