移動用戶想要同時訪問Azure不同站點的連接方法
最近有合作夥伴遇到一個需求,總結下是這樣的:用戶在國內和海外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站點上的應用數據。這個方案可以滿足用戶要求。
移動用戶想要同時訪問Azure不同站點的連接方法