Yamaha RTX 810 で Azure の VNet ゲートウェイと BGP 接続する

ExpressRoute はなかなか触れるものでは無いので、仮想ネットワーク ゲートウェイ で BGP を試してみました。
対向のデバイスは RTX810 です。

IPSec に関して、以前はルートベース(IKEv2)のコンフィグが公開されていませんでしたが、今は対応しているコンフィグが公開されているので基本コピペで行けます。
BGP の設定に関しては、neighbor の ignore-capability=on さえ忘れなければうまくつながる(はず)です。

Azure の設定

Azure の設定としては、次のリソースの設定をする必要があります。

後で変更できなくて一番時間がかかるのは 仮想ネットワーク ゲートウェイ なので SKU の選択だけは慎重にする必要があります。

仮想ネットワーク ゲートウェイ

仮想ネットワークゲートウェイ(以下VNetGW)は、BGP が利用できる SKU が決まっており、VpnGw1/VpnGw2/VpnGw3 を選択する必要があります。
VNetGW は特に作成に20~30分かかるので SKU 選択は注意しましょう。

f:id:mitsuki0820:20181029103409p:plain

最初の作成画面で BGP の ASN の設定とかもできますが、後で変更できます。
ちなみに BGP の設定は構成の画面から設定できます。この設定は、あとでルーターに設定するときに使います。
この ASN は、Azure 側のルーターの ASN です。
f:id:mitsuki0820:20181029103731p:plain

ローカル ネットワーク ゲートウェイ

Azure から見たローカルの設定です。こちらも構成から設定します。

  • IP アドレス : ルーターのグローバル IP アドレスです。
  • アドレス : ルーター配下のローカルのネットワークですが、BGP の場合は、ピアとなるルーターの IP アドレスのみでいいので、/32で指定できます。
  • BGP 設定の構成 : こちらはローカル側の ASN/ピアの設定です。

f:id:mitsuki0820:20181029104227p:plain

接続

ローカルとの接続設定です。ここで設定するのは IPSec のための 共有キー と BGP の有効化の設定です。
特に共有キーは間違えないようにしましょう。BGP は有効にするだけです。が、これまでの設定ができていないとエラーが出ます。
f:id:mitsuki0820:20181029104819p:plain

とりあえず 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 に(特に意味はなく本当に変わるのかの確認)

f:id:mitsuki0820:20181031201416p:plain

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 を立ててみて、有効なルートから見てみました。
f:id:mitsuki0820:20181031210305p:plain
ちゃんと 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
他やってみたこと
  • JPEAST-Staging - bgptest-vnet 間のピアリング削除した状態 : JPEAST-Stagin -> bgptest-vnet の通信はできない。当然 RTX への通信もできない。
  • [ゲートウェイ転送を許可する]、[リモートゲートウェイを使用する]オプションを無効 : JPEAST-Stagin -> bgptest-vnet の通信はできない。

また、JPEAST-Common の VM から、JPWEST-Production への VM は、グローバル VNet ピアリングが優先されるため、RTX を通ることはありません。

まとめ

BGP の機能としてはもっとありますが、ちょっと触ってみるくらいであればそんなに難しくはないなと思いました。
ただNW機器は、ベンダーやファームウェアのバージョンの違いで相性みたいなものがあるので検証は必須だなというのを身をもって思い知らされました。。
さらに大きな規模な環境・複雑な構成で運用するとなった場合、日々の監視やHWのメンテ、HW故障時(もしくは Azure 障害時)の対応とか考えるとちゃんと運用できる体制を整えておかないといけないですね。