ExpressRoute はなかなか触れるものでは無いので、仮想ネットワーク ゲートウェイ で BGP を試してみました。
対向のデバイスは RTX810 です。
IPSec に関して、以前はルートベース(IKEv2)のコンフィグが公開されていませんでしたが、今は対応しているコンフィグが公開されているので基本コピペで行けます。
BGP の設定に関しては、neighbor の ignore-capability=on さえ忘れなければうまくつながる(はず)です。
Azure の設定
Azure の設定としては、次のリソースの設定をする必要があります。
後で変更できなくて一番時間がかかるのは 仮想ネットワーク ゲートウェイ なので SKU の選択だけは慎重にする必要があります。
仮想ネットワーク ゲートウェイ
仮想ネットワークゲートウェイ(以下VNetGW)は、BGP が利用できる SKU が決まっており、VpnGw1/VpnGw2/VpnGw3 を選択する必要があります。
VNetGW は特に作成に20~30分かかるので SKU 選択は注意しましょう。
最初の作成画面で BGP の ASN の設定とかもできますが、後で変更できます。
ちなみに BGP の設定は構成の画面から設定できます。この設定は、あとでルーターに設定するときに使います。
この ASN は、Azure 側のルーターの ASN です。
ローカル ネットワーク ゲートウェイ
Azure から見たローカルの設定です。こちらも構成から設定します。
- IP アドレス : ルーターのグローバル IP アドレスです。
- アドレス : ルーター配下のローカルのネットワークですが、BGP の場合は、ピアとなるルーターの IP アドレスのみでいいので、/32で指定できます。
- BGP 設定の構成 : こちらはローカル側の ASN/ピアの設定です。
接続
ローカルとの接続設定です。ここで設定するのは IPSec のための 共有キー と BGP の有効化の設定です。
特に共有キーは間違えないようにしましょう。BGP は有効にするだけです。が、これまでの設定ができていないとエラーが出ます。
とりあえず BGP と接続するだけなら Azure の設定はこれくらいで複雑な設定はありません。
このあたりのドキュメントが参考になります。
Azure VPN Gateways: Resource Manager: PowerShell で BGP を構成する | Microsoft Docs
ルーター
ルーター側の設定としては、まずは IPSec で接続して、そのあとに BGP でピアを張る形になります。
IPSec の設定
基本↓の設定でそのまま行けます。VPN よく張ってる人なら悩むことはないと思います。
Microsoft AzureとVPN(IPsec IKEv2)接続するルーターの設定 : コマンド設定
ここでは ipsec sa policy 1 1 esp aes256-cbc sha256-hmac anti-replay-check=off とかのゲートウェイ IDをそのままコピペしないように(1であればもちろん問題ないですが)しましょう。
(恥ずかしながら私はこんなところではまってました。。)
BGP の設定
BGP に関しても基本こちらのドキュメントの設定で行けます。
BGP-4 設定ガイド
が、1点、ignore-capability=on という設定を入れてあげる必要があります。ここに一番はまりました。。
BGP のプロトコルとして、使用できる機能(capability)という概念があるのですが、そのネゴシエーションで一致しなかった場合でも接続してしまうかどうか(無視するかどうか)を設定するオプションです。
色々調べていた時に、↓のJANOG の資料を何となく眺めていてもしやと思い、これを on にすると無事接続できました。
https://www.attn.jp/maz/p/t/pdf/janog41-bgp-tutorial.pdf
ちなみに、こんなエラーが出てきます。
2018/10/29 12:35:25: [BGP] Neighbor 172.21.1.254 (External AS 65001) Event [Start] State [Idle] -> [Active] 2018/10/29 12:35:25: [BGP] Neighbor 172.21.1.254 (External AS 65001) Event [RecvOpen] State [OpenSent] -> [Idle] ↑------------------------------------------------- ここ ------------------------------------------------- ↑ 2018/10/29 12:35:25: [BGP] SEND 192.168.1.1 -> 172.21.1.254 type 3 (Notification) length 21 2018/10/29 12:35:25: [BGP] RECV 172.21.1.254 -> 192.168.1.1 type 1 (Open) length 63 2018/10/29 12:35:25: [BGP] SEND 192.168.1.1 -> 172.21.1.254 type 1 (Open) length 29 2018/10/29 12:35:25: [BGP] Neighbor 172.21.1.254 (External AS 65001) Event [Open] State [Connect] -> [OpenSent] 2018/10/29 12:35:25: [BGP] Neighbor 172.21.1.254 (External AS 65001) Event [ConnectRetry] State [Active] -> [Connect]
BGP の遷移として、OpenSent -> OpenConfirm となるべきところが、Idle に戻ってしまっています。
これが延々繰り返されます。
ちなみに最終的な設定です。
bgp use on bgp autonomous-system 65050 # ロギングの設定。設定中は必須。 bgp log neighbor packet # 東日本(bgptest-gw) へのピア bgp neighbor 1 65001 172.21.1.254 hold-time=30 gateway=tunnel5 local-address=192.168.1.1 ignore-capability=on # 西日本(bgptest-gw-west) へのピア bgp neighbor 2 65002 10.10.1.254 hold-time=30 gateway=tunnel1 local-address=192.168.1.1 ignore-capability=on bgp router id 192.168.1.1 # ローカルのルートをアドバタイズする設定 bgp import filter 1 include 192.168.0.0/16 # 全てのルートをアドバタイズする設定 bgp import filter 100 include 0.0.0.0/0 # 静的経路のうち、192.168.0.0/16(filter 1で定義) のルートを ASN:65001 にアドバタイズ bgp import 65001 static filter 1 # BGP の経路のすべて(filter 100)のルートを ASN:65001 にアドバタイズ bgp import 65001 bgp 65002 filter 100 # 静的経路のうち、192.168.0.0/16(filter 1で定義) のルートを ASN:65002 にアドバタイズ bgp import 65002 static filter 1 # BGP の経路のすべて(filter 100)のルートを ASN:65002 にアドバタイズ bgp import 65002 bgp 65001 filter 100
最後に、 bgp configure refresh を忘れずに。
やってみた構成
せっかく時間をかけて GW を作ってみたのでいろいろ検証してみました。
構成を以下の様にしてみました。
- RTX からそれぞれ IPSec で接続
- 東日本と西日本に GW を作成
- 東日本、西日本にそれぞれ複数の仮想ネットワークを接続し、VNet ピアリングで接続
- RTX の ASN は 65050、東日本は 65001、西日本は 65002
- 東日本のルートを西日本へ、西日本のルートを東日本にアドバタイズ
- ホールドタイムを 30 に(特に意味はなく本当に変わるのかの確認)
RTX の状態
それぞれの AS からルートが流れていることが確認できます。
(抜粋) RTX810# show ip route Destination Gateway Interface Kind Additional Info. default - PP[01] static filter:20,21,22,40,41 default - PP[01] static filter:9,12 default - PP[01] static filter:11 10.2.1.0/24 - TUNNEL[3] static 10.10.0.0/16 - TUNNEL[1] BGP path=65002 10.10.1.254/32 - TUNNEL[1] static 10.12.0.0/16 - TUNNEL[1] BGP path=65002 172.21.0.0/16 - TUNNEL[5] BGP path=65001 172.21.1.254/32 - TUNNEL[5] static 172.24.0.0/24 - TUNNEL[5] BGP path=65001 172.24.1.0/24 - TUNNEL[5] BGP path=65001 172.24.2.0/24 - TUNNEL[5] BGP path=65001 192.168.1.0/24 192.168.1.1 VLAN1 implicit 192.168.1.1/32 - TUNNEL[5] BGP path=65001 192.168.2.0/24 192.168.2.2 VLAN2 implicit 192.168.10.0/24 - TUNNEL[2] static
東日本から受け取ったルート、アドバタイズしたルートが確認できます。
RTX810# show status bgp neighbor 172.21.1.254 received-routes Total routes: 5 *: valid route Network Next Hop Metric LocPrf Path * 172.21.0.0/16 0.0.0.0 65001 IGP * 172.24.0.0/24 0.0.0.0 65001 IGP * 172.24.1.0/24 0.0.0.0 65001 IGP * 192.168.1.1/32 0.0.0.0 65001 IGP * 172.24.2.0/24 0.0.0.0 65001 IGP RTX810# show status bgp neighbor 172.21.1.254 advertised-routes Total routes: 4 *: valid route Network Next Hop Metric LocPrf Path * 192.168.1.0/24 192.168.1.1 65050 IGP * 192.168.2.0/24 192.168.1.1 65050 IGP * 10.10.0.0/16 192.168.1.1 65050 65002 IGP * 10.12.0.0/16 192.168.1.1 65050 65002 IGP
西日本から受け取ったルート、アドバタイズしたルートが確認できます。
RTX810# show status bgp neighbor 10.10.1.254 received-routes Total routes: 3 *: valid route Network Next Hop Metric LocPrf Path * 10.10.0.0/16 0.0.0.0 65002 IGP * 10.12.0.0/16 0.0.0.0 65002 IGP 192.168.1.1/32 0.0.0.0 65002 IGP RTX810# show status bgp neighbor 10.10.1.254 advertised-routes Total routes: 7 *: valid route Network Next Hop Metric LocPrf Path * 172.21.0.0/16 192.168.1.1 65050 65001 IGP * 172.24.0.0/24 192.168.1.1 65050 65001 IGP * 172.24.1.0/24 192.168.1.1 65050 65001 IGP * 172.24.2.0/24 192.168.1.1 65050 65001 IGP * 192.168.1.0/24 192.168.1.1 65050 IGP * 192.168.1.1/32 192.168.1.1 65050 65001 IGP * 192.168.2.0/24 192.168.1.1 65050 IGP
あとはキープアライブ、ホールドタイムがちゃんと変わっているか見てみました。
RTX の場合、キープアライブは、ホールドタイムの 1/3 なので今回は10秒です。
IPSec を切断してみたところ、Update も大体30秒後くらいに出て、ルーティングテーブルから消えていました。
2018/10/31 21:36:18: [BGP] RECV 10.10.1.254 -> 192.168.1.1 type 4 (KeepAlive) length 19 2018/10/31 21:36:12: [BGP] SEND 192.168.1.1 -> 172.21.1.254 type 4 (KeepAlive) length 19 2018/10/31 21:36:10: [BGP] SEND 192.168.1.1 -> 10.10.1.254 type 4 (KeepAlive) length 19 2018/10/31 21:36:09: [BGP] RECV 172.21.1.254 -> 192.168.1.1 type 4 (KeepAlive) length 19 2018/10/31 21:36:08: [BGP] RECV 10.10.1.254 -> 192.168.1.1 type 4 (KeepAlive) length 19 2018/10/31 21:36:02: [BGP] SEND 192.168.1.1 -> 172.21.1.254 type 4 (KeepAlive) length 19 2018/10/31 21:36:01: [BGP] RECV 172.21.1.254 -> 192.168.1.1 type 4 (KeepAlive) length 19
Azure の状態
Azure の PowerShell で見てみます。
まずは GW の状態。
> Get-AzureRmVirtualNetworkGatewayBGPPeerStatus -VirtualNetworkGatewayName bgptest-gw -ResourceGroupName bgptest LocalAddress Neighbor Asn State ConnectedDuration RoutesReceived MessagesSent MessagesReceived ------------ -------- --- ----- ----------------- -------------- ------------ ---------------- 172.21.1.254 192.168.1.1 65050 Connected 00:45:11.8993646 4 816 800 > Get-AzureRmVirtualNetworkGatewayBGPPeerStatus -VirtualNetworkGatewayName bgptest-gw-west -ResourceGroupName bgptest LocalAddress Neighbor Asn State ConnectedDuration RoutesReceived MessagesSent MessagesReceived ------------ -------- --- ----- ----------------- -------------- ------------ ---------------- 10.10.1.254 192.168.1.1 65050 Connected 00:45:39.2323757 6 401 380
東日本の GW からアドバタイズしたルート、RTXから受け取ったルート
> $VgwName = 'bgptest-gw' > Get-AzureRmVirtualNetworkGatewayAdvertisedRoute -VirtualNetworkGatewayName $VgwName -ResourceGroupName $RGName -Peer 192.168.1.1 LocalAddress Network NextHop SourcePeer Origin AsPath Weight ------------ ------- ------- ---------- ------ ------ ------ 172.21.1.254 172.21.0.0/16 172.21.1.254 Igp 65001 0 172.21.1.254 172.24.0.0/24 172.21.1.254 Igp 65001 0 172.21.1.254 172.24.1.0/24 172.21.1.254 Igp 65001 0 172.21.1.254 192.168.1.1/32 172.21.1.254 Igp 65001 0 172.21.1.254 172.24.2.0/24 172.21.1.254 Igp 65001 0 > Get-AzureRmVirtualNetworkGatewayLearnedRoute -VirtualNetworkGatewayName $VgwName -ResourceGroupName $RGName LocalAddress Network NextHop SourcePeer Origin AsPath Weight ------------ ------- ------- ---------- ------ ------ ------ 172.21.1.254 172.21.0.0/16 172.21.1.254 Network 32768 172.21.1.254 172.24.0.0/24 172.21.1.254 Network 32768 172.21.1.254 172.24.1.0/24 172.21.1.254 Network 32768 172.21.1.254 192.168.1.1/32 172.21.1.254 Network 32768 172.21.1.254 192.168.1.0/24 192.168.1.1 192.168.1.1 EBgp 65050 32768 172.21.1.254 192.168.2.0/24 192.168.1.1 192.168.1.1 EBgp 65050 32768 172.21.1.254 172.24.2.0/24 172.21.1.254 Network 32768 172.21.1.254 10.12.0.0/16 192.168.1.1 192.168.1.1 EBgp 65050-65002 32768 172.21.1.254 10.10.0.0/16 192.168.1.1 192.168.1.1 EBgp 65050-65002 32768
西日本の GW からアドバタイズしたルート、RTXから受け取ったルート
> $VgwName = 'bgptest-gw-west' > Get-AzureRmVirtualNetworkGatewayAdvertisedRoute -VirtualNetworkGatewayName $VgwName -ResourceGroupName $RGName -Peer 192.168.1.1 LocalAddress Network NextHop SourcePeer Origin AsPath Weight ------------ ------- ------- ---------- ------ ------ ------ 10.10.1.254 10.10.0.0/16 10.10.1.254 Igp 65002 0 10.10.1.254 10.12.0.0/16 10.10.1.254 Igp 65002 0 10.10.1.254 192.168.1.1/32 10.10.1.254 Igp 65002 0 > Get-AzureRmVirtualNetworkGatewayLearnedRoute -VirtualNetworkGatewayName $VgwName -ResourceGroupName $RGName LocalAddress Network NextHop SourcePeer Origin AsPath Weight ------------ ------- ------- ---------- ------ ------ ------ 10.10.1.254 10.10.0.0/16 10.10.1.254 Network 32768 10.10.1.254 10.12.0.0/16 10.10.1.254 Network 32768 10.10.1.254 192.168.1.1/32 10.10.1.254 Network 32768 10.10.1.254 192.168.1.0/24 192.168.1.1 192.168.1.1 EBgp 65050 32768 10.10.1.254 192.168.2.0/24 192.168.1.1 192.168.1.1 EBgp 65050 32768 10.10.1.254 172.24.2.0/24 192.168.1.1 192.168.1.1 EBgp 65050-65001 32768 10.10.1.254 172.24.1.0/24 192.168.1.1 192.168.1.1 EBgp 65050-65001 32768 10.10.1.254 172.24.0.0/24 192.168.1.1 192.168.1.1 EBgp 65050-65001 32768 10.10.1.254 172.21.0.0/16 192.168.1.1 192.168.1.1 EBgp 65050-65001 32768
Azure の仮想マシンから確認
JPEAST-Stagin の仮想マシン
JPEAST-Staging に VM を立ててみて、有効なルートから見てみました。
ちゃんと RTX からアドバタイズされているものが登録されています。
また、JPWEST-Production に traceroute してみたところ、RTX を経由してたどり着きました。
[tsunomur@vm2 ~]$ traceroute 10.12.0.4 traceroute to 10.12.0.4 (10.12.0.4), 30 hops max, 60 byte packets 1 192.168.1.1 (192.168.1.1) 10.572 ms 11.485 ms 12.123 ms 2 10.12.0.4 (10.12.0.4) 28.158 ms 28.156 ms 28.145 ms
まとめ
BGP の機能としてはもっとありますが、ちょっと触ってみるくらいであればそんなに難しくはないなと思いました。
ただNW機器は、ベンダーやファームウェアのバージョンの違いで相性みたいなものがあるので検証は必須だなというのを身をもって思い知らされました。。
さらに大きな規模な環境・複雑な構成で運用するとなった場合、日々の監視やHWのメンテ、HW故障時(もしくは Azure 障害時)の対応とか考えるとちゃんと運用できる体制を整えておかないといけないですね。