Azureでサイト間接続(Site to Site VPN)を用いて、オンプレミスと接続する方法を説明します。よく話題にあがるExpress Routeは物理的な機器と直接接続する方法でデータセンター事業者やISP事業者との契約が必要です。他方、サイト間接続(Site to Site VPN)はIPsecによる接続ですのでインターネット回線のみで接続が可能です。
このページではBGPを用いた接続方法を紹介します。staticを使用する場合は「Azure サイト間接続(Site to Site VPN) static route編」を参照ください。
グローバルIPアドレスの可否が話題にあがりますが、グローバルIPアドレスが変動しない環境ならばサイト間接続(Site to Site VPN)は技術上は確立可能です。オンプレミス側に付与されるIPアドレスはプライベートIPアドレスでも差し支えございません。
プライベートIPアドレスを用いたSite to Site VPNを確立する方法は、Azureの仕様ではなくIPsecの一般的な知識に基づいた設定です。MicroSoftがサポートする構成かどうかは不明である事にご注意ください(特に「自己責任」ではなく「サポート重視」の企業風土ならば注意が必要です)。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
事前設定
擬似オンプレミス側(JapanWest)
サイト間接続(Site to Site VPN)はオンプレミスとの接続を実現するためのマネージドサービスです。ですが、人によってはオンプレミス側で機器を準備するのが難しいかもしれません。そこで、JapanEastをクラウド側と見做し、JapanWestをオンプレミス側と見做します。
可能ならば、グローバルIPアドレスが付与された「物理」のCiscoルータを用意ください。Azureでオンプレミスを擬似する場合は多少の複雑な設定が必要になります。もし、「物理」のCiscoルータが準備できるならば、不要なトラブルを避けるために「物理」を使用しましょう。以下は「物理」のCiscoルータを準備できない方向けの操作方法です。
オンプレミス側とみなしたJapanWestには、オンプレミス同等の設定が可能なCisco CSRの仮想マシンを構築します。
まずは、リソースグループを作成します。
az group create --name ResourceGroupWest --location japanwest
仮想ネットワークとサブネットを作成します。
az network vnet create \ --resource-group ResourceGroupWest \ --name Vnet20 \ --address-prefix 172.20.0.0/16 az network vnet subnet create \ --resource-group ResourceGroupWest \ --name Subnet10 \ --vnet-name Vnet20 \ --address-prefixes 172.20.10.0/24
cisco CSRの仮想マシンを作成します。
az vm create \ --resource-group ResourceGroupWest \ --name router210 \ --image cisco:cisco-csr-1000v:17_3_3-byol:latest \ --size Standard_D2_v5 \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --priority Spot \ --private-ip-address 172.20.10.210
擬似オンプレミス側の仮想マシン作成時に表示されるパブリックIPアドレスはメモに控えておきましょう。後続の操作で使用します。
$ az vm create \ --resource-group ResourceGroupWest \ --name router210 \ --image cisco:cisco-csr-1000v:17_3_3-byol:latest \ --size Standard_D2_v5 \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --priority Spot \ --private-ip-address 172.20.10.210 { "fqdns": "", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/ResourceGroupWest/providers/Microsoft.Compute/virtualMachines/router210", "location": "japanwest", "macAddress": "00-0D-3A-40-2D-4D", "powerState": "VM running", "privateIpAddress": "172.20.10.210", "publicIpAddress": "20.210.140.4", "resourceGroup": "ResourceGroupWest", "zones": "" }
疎通確認用として、cisco CSRにLoopback Interfaceを2つ作成します。
interface Loopback100 ip address 172.20.100.100 255.255.255.0 ! interface Loopback200 ip address 172.20.200.200 255.255.255.0
クラウド側(JapanEast)
クラウド側のリソースグループを作成します。
az group create --name ResourceGroupEast --location japaneast
構成図
以下の構成でJapanWestとJapanEastが疎通可能な状態を目指します。
| | Lo200 | 172.20.200.200/24 Lo100 | 172.20.100.100/24 +------+------+ | router210 | | (cisco CSR) | +------+------+ G1 | .210 (グローバルIP:20.210.140.4) | | 172.20.10.0/24 | (Subnet10:JapanWest) | | | | +------+------+ | Internet | +------+------+ | | | | | | 20.210.93.46 +------+------------------+ | Virtual Network Gateway | +------+------------------+ | | | 172.16.0.0/27 | (GatewaySubnet:JapanEast) | | +------+-----------------+ | Azure Internal Network | +------+-----------------+ | | | 172.16.1.0/24 | (Subnet01:JapanEast) | eth0 | .10 +------+------+ | linux010 | | (UbuntuLTS) | +-------------+
Azure側のIPsec設定
サブネットの作成
後続の操作で作成する「仮想ネットワークゲートウェイ」が接続されるサブネットを作成します。これは任意の名前が指定可能ではなく、「GatewaySubnet」という名前にする必要があります。また、サブネット長は27以下とする必要があります。
az network vnet create \ --resource-group ResourceGroupEast \ --name Vnet16 \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group ResourceGroupEast \ --name GatewaySubnet \ --vnet-name Vnet16 \ --address-prefixes 172.16.0.0/27
パブリックIPアドレス
後続の操作で作成する「仮想ネットワークゲートウェイ」に付与されるパブリックIPアドレスを作成します。頻繁にIPアドレスが変動するのは不都合ですので、skuはStandardにしておきましょう。
az network public-ip create \ --resource-group ResourceGroupEast \ --name VpnGwPublicIp \ --sku Standard
付与されたパブリックIPアドレスをメモに控えます。このIPアドレスは後続操作で使用します。
$ az network public-ip show \ --resource-group ResourceGroupEast \ --name VpnGwPublicIp \ --query "ipAddress" "20.210.93.46"
仮想ネットワークゲートウェイ
仮想ネットワークゲートウェイを作成します。仮想ネットワークゲートウェイはクラウド側ルータのマネージドサービスに相当する機能です。
仮想ネットワークゲートウェイの作成には45分程の時間がかかりますので、no-waitオプションを付与しましょう。また、「Azure サイト間接続(Site to Site VPN) static route編」で紹介したstatic routeの場合と異なり、asnオプションでクラウド側のBGP AS番号を指定する必要があります。
なお、iBGPはサポートされませんので、クラウド側とオンプレミス側は異なるAS番号を割り当ててください。
az network vnet-gateway create \ --name VnetGw \ --public-ip-address VpnGwPublicIp \ --resource-group ResourceGroupEast \ --vnet Vnet16 \ --gateway-type Vpn \ --vpn-type RouteBased \ --sku VpnGw1 \ --asn 65010 \ --no-wait
以下のコマンドで仮想ネットワークゲートウェイ作成の進捗を確認できます。以下のようにprovisioningStateが「Updating」と表示される場合は完了していません。「Succeeded」と表示されるまで待ちます。
$ az network vnet-gateway show \ --name VnetGw \ --resource-group ResourceGroupEast \ --query "provisioningState" \ --output tsv Updating
CLIでの確認に自信が持てない方は、ポータル(GUI)を併用しても良いかもしれません。すべてのサービスから「ネットワーキング」「仮想ネットワークゲートウェイ」「仮想ネットワークゲートウェイ名(VnetGw)」の順に押下します。すると、「概要」画面で「更新中」の文字が確認できます。この「更新中」が消えるまで待ちます。
ローカルゲートウェイ
「ローカルゲートウェイ」はオンプレミス側の情報を定義する設定群です。gateway-ip-addressにはオンプレミス拠点のグローバルIPアドレスを指定します。asnオプションにはオンプレミス側のBGP AS番号を指定します。オンプレミス側でbgp-peering-addressオプションはBGP neighborを確立する時の送信元IPアドレスを指定します。IPsecトンネル経由でBGP neighborを確立するのでWAN側のinterfaceは不適切です。LAN側のinterfaceかLoopback interfaceを指定しましょう。
az network local-gateway create \ --gateway-ip-address 20.210.140.4 \ --name Site01 \ --resource-group ResourceGroupEast \ --asn 65020 \ --bgp-peering-address 172.20.100.100
接続
「接続」はオンプレミスとクラウド間のIPsecに関するパラメタを指定します。shared-keyには事前共有鍵を指定します。また、BPGを有効にする場合はenable-bgpオプションが必要です。
az network vpn-connection create \ --name ConnectToSite01 \ --resource-group ResourceGroupEast \ --vnet-gateway1 VnetGw \ --shared-key P@ssw0rd1234 \ --local-gateway2 Site01 \ --enable-bgp
オンプレミス側のIPsec設定
状態確認 (1)
すべてのサービスから「ネットワーキング」「接続」「接続名(ConnectToSite01)」の順に画面遷移すると、「概要」画面にて、「状態」欄が「不明」と表示されます。もし、IPsecが確立されれば「接続済み」に変わります。
CLIでは以下のように確認します。connectionStatusがNotConnectedになっています。
$ az network vpn-connection show \ --resource-group ResourceGroupEast \ --name ConnectToSite01 { "authorizationKey": null, "connectionMode": "Default", "connectionProtocol": "IKEv2", "connectionStatus": "NotConnected", "connectionType": "IPsec", "dpdTimeoutSeconds": 0, "egressBytesTransferred": 0, <omitted>
サンプル設定のダウンロード
すべてのサービスから「ネットワーキング」「接続」「接続名(ConnectToSite01)」の順に画面遷移します。「構成のダウンロード」を押下すると、オンプレミス側のルータの種類を指定する画面が現れますので、入力完了後、「構成のダウンロード」を押下するとサンプル設定をダウンロードできます。
サンプル設定の微修正と流し込み
IPsec関連の設定
Cisco CSRにグローバルIPアドレスが付与されている構成ならば、IPsecに関する部分はそのまま流し込んで差し支えございません。もし、プライベートIPアドレスが設定されているならば、微修正が必要です。以下、修正が必要となる部分を示します。
修正が不要な部分は掲載を省略しています。
crypto ikev2 policyをグローバルIPアドレスからプライベートIPアドレスに変更します。
crypto ikev2 policy Azure-Ikev2-Policy proposal Azure-Ikev2-Proposal ! match address local 20.210.140.4 match address local 172.20.10.210
crypto ikev2 profileをグローバルIPアドレスからプライベートIPアドレスに変更します。
crypto ikev2 profile Azure-Ikev2-Profile ! match address local 20.210.140.4 match address local 172.20.10.210 match identity remote address 20.210.93.46 255.255.255.255 authentication remote pre-share authentication local pre-share keyring local ConnectToSite01-keyring lifetime 28800 dpd 10 5 on-demand
トンネルインターフェースの送信元をグローバルIPアドレスからプライベートIPアドレスに変更します。
interface Tunnel11 ip address 169.254.0.1 255.255.255.255 ip tcp adjust-mss 1350 ! tunnel source 20.210.140.4 tunnel source 172.20.10.210 tunnel mode ipsec ipv4 tunnel destination 20.210.93.46 tunnel protection ipsec profile Azure-IPsecProfile
BGPに関する設定
BGPに関する設定は、そのまま流し込まず、環境に応じて適宜の変更をします。また、Loopback interfaceに関する設定も環境に合わないようならば適宜の修正をします。修正例は以下の通りです。
! interface Loopback 11 ! ip address 172.20.100.100 255.255.255.255 ! exit router bgp 65020 bgp log-neighbor-changes neighbor 172.16.0.30 remote-as 65010 neighbor 172.16.0.30 ebgp-multihop 255 ! neighbor 172.16.0.30 update-source loopback 11 neighbor 172.16.0.30 update-source loopback 100 address-family ipv4 ! network LOCAL_ROUTE mask LOCAL_MASK network 172.20.100.0 mask 255.255.255.0 network 172.20.200.0 mask 255.255.255.0 neighbor 172.16.0.30 activate exit exit
動作確認
設定の流し込み後、IPsecが確立された事を確認します。show crypto ikev2 saコマンドでStatusが「READY」と表示される事を確認します。
router210#show crypto ikev2 sa IPv4 Crypto IKEv2 SA Tunnel-id Local Remote fvrf/ivrf Status 1 172.20.10.210/4500 20.210.93.46/4500 none/none READY Encr: AES-CBC, keysize: 256, PRF: SHA1, Hash: SHA96, DH Grp:2, Auth sign: PSK, Auth verify: PSK Life/Active Time: 28800/569 sec IPv6 Crypto IKEv2 SA router210# router210# router210#show crypto ipsec sa interface: Tunnel11 Crypto map tag: Tunnel11-head-0, local addr 172.20.10.210 protected vrf: (none) local ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0) remote ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0) current_peer 20.210.93.46 port 4500 PERMIT, flags={origin_is_acl,} #pkts encaps: 33, #pkts encrypt: 33, #pkts digest: 33 #pkts decaps: 28, #pkts decrypt: 28, #pkts verify: 28 #pkts compressed: 0, #pkts decompressed: 0 #pkts not compressed: 0, #pkts compr. failed: 0 #pkts not decompressed: 0, #pkts decompress failed: 0 #send errors 0, #recv errors 0
BGP neighborが確立された事を確認しhます。
router210#show ip bgp neighbors BGP neighbor is 172.16.0.30, remote AS 65010, external link BGP version 4, remote router ID 172.16.0.30 BGP state = Established, up for 00:10:01 Last read 00:00:36, last write 00:00:32, hold time is 180, keepalive interval is 60 seconds Neighbor sessions: 1 active, is not multisession capable (disabled) Neighbor capabilities: Route refresh: advertised and received(new) Four-octets ASN Capability: advertised and received Address family IPv4 Unicast: advertised and received Address family IPv6 Unicast: received Graceful Restart Capability: received Remote Restart timer is 120 seconds Address families advertised by peer: IPv4 Unicast (was not preserved) <omitted>
想定通りのprefixをadvertiseできている事を確認します。
router210#show ip bgp neighbors 172.16.0.30 advertised-routes BGP table version is 4, local router ID is 172.20.200.200 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, x best-external, a additional-path, c RIB-compressed, t secondary path, L long-lived-stale, Origin codes: i - IGP, e - EGP, ? - incomplete RPKI validation codes: V valid, I invalid, N Not found Network Next Hop Metric LocPrf Weight Path *> 172.20.100.0/24 0.0.0.0 0 32768 i *> 172.20.200.0/24 0.0.0.0 0 32768 i Total number of prefixes 2
状態確認 (2)
すべてのサービスから「ネットワーキング」「接続」「接続名(ConnectToSite01)」の順に画面遷移します。、「概要」画面の「状態」欄が「接続済み」に変わった事を確認します。
CLIでは以下のように確認します。connectionStatusがConnectedになっています。
$ az network vpn-connection show \ --resource-group ResourceGroupEast \ --name ConnectToSite01 { "authorizationKey": null, "connectionMode": "Default", "connectionProtocol": "IKEv2", "connectionStatus": "Connected", "connectionType": "IPsec", "dpdTimeoutSeconds": 0, "egressBytesTransferred": 200, "egressNatRules": null, <omitted>
疎通確認
疎通確認用の仮想マシンの作成
疎通確認用の仮想マシンを作成します。まずは、仮想マシンが収容されるセグメントを作成します。
az network vnet subnet create \ --resource-group ResourceGroupEast \ --name Subnet01 \ --vnet-name Vnet16 \ --address-prefixes 172.16.1.0/24
疎通確認用の仮想マシンを作成します。
az vm create \ --resource-group ResourceGroupEast \ --name linux010 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name Vnet16 \ --subnet Subnet01 \ --private-ip-address 172.16.1.10
仮想マシンに付与されたグローバルIPアドレスをメモに控えます。
$ az vm create \ --resource-group ResourceGroupEast \ --name linux010 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name Vnet16 \ --subnet Subnet01 \ --private-ip-address 172.16.1.10 { "fqdns": "", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/ResourceGroupEast/providers/Microsoft.Compute/virtualMachines/linux010", "location": "japaneast", "macAddress": "00-22-48-68-9B-64", "powerState": "VM running", "privateIpAddress": "172.16.1.10", "publicIpAddress": "20.222.241.34", "resourceGroup": "ResourceGroupEast", "zones": "" }
ルートテーブル
linux010の仮想NICの画面にて、「有効なルート」を確認します。JapanEast向けである172.16.100.0/24と172.16.200.0/24が仮想ネットワークゲートウェイに向いている事を確認します。
オンプレミスのBGPルータからadvertiseされたprefixは、すべてのsubnetに伝播する仕様になっています。もし、この画面で想定通りの「有効なルート」が見当たらない場合はオンプレミスのBGPルータの設定を見直してください。
疎通確認
JapanEastのLinux機(linux010:172.16.1.10)からならば、以下のようなpingコマンドで動作確認をします。
azureuser@linux010:~$ ping 172.20.100.100 -c 3 PING 172.20.100.100 (172.20.100.100) 56(84) bytes of data. 64 bytes from 172.20.100.100: icmp_seq=1 ttl=255 time=11.1 ms 64 bytes from 172.20.100.100: icmp_seq=2 ttl=255 time=11.6 ms 64 bytes from 172.20.100.100: icmp_seq=3 ttl=255 time=11.2 ms --- 172.20.100.100 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 11.184/11.331/11.604/0.193 ms azureuser@linux010:~$
JapanWestのCisco機(router210:172.20.100.100)からならば、以下のようなpingコマンドで動作確認をします。送信元を指定しないと、Tunnel 11(169.254.0.1)が送信元になってしまい疎通不能になります。送信元インターフェースを明示指定しないとpingに成功しない事に注意ください。
router210#ping 172.16.1.10 source Loopback 100 repeat 100 Type escape sequence to abort. Sending 100, 100-byte ICMP Echos to 172.16.1.10, timeout is 2 seconds: Packet sent with a source address of 172.20.100.100 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Success rate is 100 percent (100/100), round-trip min/avg/max = 11/12/16 ms router210#