最近有合作伙伴遇到一个需求,总结下是这样的:用户在国内和海外Azure上都部署了应用,用户有一批扛着笔记本到处出差的人需要访问这些资源,但是由于应用设计原因,需要能够同时访问国内和海外Azure上的应用数据。通常对于这样的移动用户访问Azure的需求,我们会建议采用P2S VPN,实现单点到Azure上站点的VPN连接,就可以访问了。但是这次的问题在于用户希望可以同时访问国内和海外的Azure。很自然的一个想法就是能不能让用户先用P2S VPN连接到一个站点,比如美国的Azure,然后通过Azure站点间的VPN连接起来,使得终端用户可以通过一个站点作为跳板,访问另一个站点的应用。
在这其中涉及两段设置:1、站点到站点的IPSEC VPN,需要启用BGP。2、用户终端到某个Azure站点的P2S VPN。
具体配置如下:
首先,要Azure的VPN Gateway要开启BGP,是需要通过命令行来实现的,步骤记录如下:
首先建立2个VNET,一个记做 localvnet,一个记做remotevnet,创建gateway subnet,这些步骤可以在portal界面里完成,然后设置VPN GW所需的参数。
设置localvnet
$RG1 = "lyqvpn"
$Location1 = "China North"
$VNetName1 = "localvnet"
$GWSubName1 = "GatewaySubnet"
$GWIPName1 = "lyqGWIP01"
$GWIPconfName1 = "gwipconf1"
$gwpip1 = New-AzureRmPublicIpAddress -Name $GWIPName1 -ResourceGroupName $RG1 -Location $Location1 -AllocationMethod Dynamic
$vnet1 = Get-AzureRmVirtualNetwork -Name $VNetName1 -ResourceGroupName $RG1
$subnet1 = Get-AzureRmVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet1
$gwipconf1 = New-AzureRmVirtualNetworkGatewayIpConfig -Name $GWIPconfName1 -Subnet $subnet1 -PublicIpAddress $gwpip1
设置 remotevnet
$VNetName2 = "remotevnet"
$GWSubName2 = "GatewaySubnet"
$GWIPName2 = "lyqGWIP02"
$GWIPconfName2 = "gwipconf2"
$gwpip2 = New-AzureRmPublicIpAddress -Name $GWIPName2 -ResourceGroupName $RG1 -Location $Location1 -AllocationMethod Dynamic
$vnet2 = Get-AzureRmVirtualNetwork -Name $VNetName2 -ResourceGroupName $RG1
$subnet2 = Get-AzureRmVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet2
$gwipconf2 = New-AzureRmVirtualNetworkGatewayIpConfig -Name $GWIPconfName2 -Subnet $subnet2 -PublicIpAddress $gwpip2
以上步骤分别为localvnet和remotevnet的VPN网关创建了公网地址,并获得了对应的subnet信息和VPN设置。
接下来创建开启了BGP的VPN Gateway,注意不同vnet的ASN不能相同
$VNet1ASN = 65010
$VNet2ASN = 65020
$GWName1 = "localVNetGW"
$GWName2 = "remoteVNetGW"
New-AzureRmVirtualNetworkGateway -Name $GWName1 -ResourceGroupName $RG1 -Location $Location1 -IpConfigurations $gwipconf1 -GatewayType Vpn -VpnType RouteBased -GatewaySku HighPerformance -Asn $VNet1ASN
New-AzureRmVirtualNetworkGateway -Name $GWName2 -ResourceGroupName $RG1 -Location $Location1 -IpConfigurations $gwipconf2 -GatewayType Vpn -VpnType RouteBased -GatewaySku HighPerformance -Asn $VNet2ASN
创建VPN Gateway需要很长时间,耐心等待所有工作完成。
通过以下命令可以查看创建的结果:
$vnet1gw = Get-AzureRmVirtualNetworkGateway -Name $GWName1 -ResourceGroupName $RG1
$vnet1gw.BgpSettingsText
$vnet2gw = Get-AzureRmVirtualNetworkGateway -Name $GWName2 -ResourceGroupName $RG1
$vnet2gw.BgpSettingsText
看到的返回应当像下面这个格式:
{
"Asn": 65010,
"BgpPeeringAddress": "10.3.0.78",
"PeerWeight": 0
}
创建完VPN Gateway后,需要为每段建立本地网关,来配合VPN GW。
$LNGName1 = "remoteLN"
$LNGPrefix1 = "10.6.0.78/32"
$LNGIP1 = "139.xxx.xxx.xxx"
$LNGASN1 = 65020
$BGPPeerIP1 = "10.6.0.78"
New-AzureRmLocalNetworkGateway -Name $LNGName1 -ResourceGroupName $RG1 -Location $Location1 -GatewayIpAddress $LNGIP1 -AddressPrefix $LNGPrefix1 -Asn $LNGASN1 -BgpPeeringAddress $BGPPeerIP1
$LNGName2 = "localLN"
$LNGPrefix2 = "10.3.0.78/32"
$LNGIP2 = "139.xxx.xxx.xxx"
$LNGASN2 = 65010
$BGPPeerIP2 = "10.3.0.78"
New-AzureRmLocalNetworkGateway -Name $LNGName2 -ResourceGroupName $RG1 -Location $Location1 -GatewayIpAddress $LNGIP2 -AddressPrefix $LNGPrefix2 -Asn $LNGASN2 -BgpPeeringAddress $BGPPeerIP2
在这里要注意本地网关设置是代表了VPN GW需要去连接的那一端。
等待两个本地网关创建完成,用以下命令获得localvnet两个网关的设置
$vnet1gw = Get-AzureRmVirtualNetworkGateway -Name $GWName1 -ResourceGroupName $RG1
$lng1gw = Get-AzureRmLocalNetworkGateway -Name $LNGName1 -ResourceGroupName $RG1
在localvnet上创建VPN连接
$Connection1 = "local2remote"
New-AzureRmVirtualNetworkGatewayConnection -Name $Connection1 -ResourceGroupName $RG1 -VirtualNetworkGateway1 $vnet1gw -LocalNetworkGateway2 $lng1gw -Location $Location1 -ConnectionType IPsec -SharedKey 'AzureA1b2C3' -EnableBGP $True
获得remotevnet的两个网关的设置
$vnet2gw = Get-AzureRmVirtualNetworkGateway -Name $GWName2 -ResourceGroupName $RG1
$lng2gw = Get-AzureRmLocalNetworkGateway -Name $LNGName2 -ResourceGroupName $RG1
为remotevnet创建VPN连接
$Connection2 = "remote2local"
New-AzureRmVirtualNetworkGatewayConnection -Name $Connection2 -ResourceGroupName $RG1 -VirtualNetworkGateway1 $vnet2gw -LocalNetworkGateway2 $lng2gw -Location $Location1 -ConnectionType IPsec -SharedKey 'AzureA1b2C3' -EnableBGP $True
到这里,VPN Gateway的配置就完成了,等待一会,看到VPN连接状态为已连接就好了。
接下来在localvnet上做一个P2S的VPN配置,这个可以在Portal里实现:
找到以下位置,按要求输入地址池地址(与VNET地址不能重复),以及VPN所需的证书。
证书可以是企业已有的证书,或自签名的证书
获得自签名证书的方法如下:
在笔记本上用以下命令创建一个名为P2SRootCert的根证书
$cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature `
-Subject "CN=P2SRootCert" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" -KeyUsageProperty Sign -KeyUsage CertSign
把证书导出成cer文件,注意导出的文件里含有回车符,而Azure界面上只接受一个完整的字符串输入,所以要手工把回车符都去掉,才可以复制。
然后依据所生成的根证书,用以下命令生成客户端证书:
New-SelfSignedCertificate -Type Custom -KeySpec Signature `
-Subject "CN=P2SChildCert" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")
这些都完成后,就可以从Azure的界面上下载一个配置安装文件,执行后自动为用户的笔记本创建了一个VPN连接。
所以,到现在为止,我们有了从国内到海外的一个VPN,支持BGP。有了从客户端到Azure的P2S VPN。开始测试,诶呀,为什么不通呢?
检查了下配置没问题,2个VPN也都打通了。再看一下笔记本的配置,发现笔记本的路由只有到Localvnet的路由,没有到remotevnet的路由,这是因为BGP并不会把路由推送到本地客户端。所以需要在笔记本上加一条去remotevnet的路由,指向到P2S VPN的网关。
route add 10.6.0.0 mask 255.255.255.0 192.168.10.128
这下就都好了,用户可以从笔记本上直接访问到2个Azure站点上的应用数据。这个方案可以满足用户要求。