FRR v3.0でRFC8203 - BGP Administrative Shutdown Communication を試したメモ
仕事柄ルーティングソフトウェアにFRRを使うことがよくあり、先日version3.0.2 がリリースされたので、マージされた新機能の一つを試してみました。
15分でできるとても簡単な内容です。
RFC8203について
RFC8203 はBGPのpeerを明示的に閉塞する時に、neighborに対してNOTIFICATIONで任意のメッセージ(文字列)を通知できる機能です。
イケてない運用現場では突然深夜にpeerが落ちて問い合わせをしたら、メンテナンスで事前の通知を見逃していたor忘れていただけだったということが発生することがあります。
メンテナンスなどでpeerをadmin shutdownするのに合わせて、事前通知したチケットやMLの番号がメッセージと一緒に書かれていると、不毛なメール問い合わせを減らせるかもしれません。
メッセージのエンコード規定は以下です。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Error Code 6 | Subcode | Length | ... \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / \ \ / ... Shutdown Communication ... / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
文字列はUTF-8でエンコードされる必要があります。
使用例:
"[TICKET-1-1438367390] software upgrade; back in 2 hours"
FRRの設定
FRR はQuaggaからforkしたUnixおよびLinuxプラットフォームで動作するIPルーティングプロトコルスイート(ルーティングデーモン)のprojectで、Linux Foundationが管轄しています。
主にDCでの利用を想定したRFC5549 BGP Unnumberedや基本的なMPLS、EVPNを実装しており、Cumulus Linuxも最近のバージョンからルーティングのコアコンポーネントをFRRに変更しています。
構成
Vagrant upしたUbuntu 16.04を2台接続します。諸事情でカーネルを4.10にしています。
+---------------+ | Ubuntu1 16.04 | | FRR v3.0 | +---------------+ | eBGP 172.168.0.0/30 | +---------------+ | Ubuntu2 16.04 | | FRR v3.0 | +---------------+
# uname -a Linux ubuntu1 4.10.0-42-generic #46~16.04.1-Ubuntu SMP Mon Dec 4 15:57:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
BGPの設定
ただShutdown Communicationで遊びたいだけなので経路広報はせずにpeerを張る設定だけします
!ubuntu1 router bgp 4200000001 neighbor 172.168.0.2 remote-as external !
!ubuntu2 router bgp 4200000002 neighbor 172.168.0.1 remote-as external !
ubuntu1# sh ip bgp sum IPv4 Unicast Summary: BGP router identifier 10.0.0.1, local AS number 4200000001 vrf-id 0 BGP table version 0 RIB entries 0, using 0 bytes of memory Peers 1, using 21 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 172.168.0.2 4 4200000002 322 380 0 0 0 00:00:14 0
ubuntu2# sh ip bgp sum IPv4 Unicast Summary: BGP router identifier 10.0.0.2, local AS number 4200000002 vrf-id 0 BGP table version 0 RIB entries 0, using 0 bytes of memory Peers 1, using 21 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 172.168.0.1 4 4200000001 283 532 0 0 0 00:01:11 0 Total number of neighbors 1
BGPのdebugを有効にし、イベントをログに吐かせます。
! debug bgp neighbor-events log file /var/log/frr/frr.log !
Shutdown Communication
- 送信側
ネット中立性も廃止されたし、もうお前とpeerはしないという世界を想定して以下のようなメッセージを送ります。
We'll shut down the peering session with you because net neutrality was abolished.
ubuntu1(config-router)# neighbor 172.168.0.2 shutdown message We'll shut down the peering session with you because net neutrality was abolished.
- 受信側
Error Code 6 , Subcode 2("Administrative Shutdown")で送信側のメッセージがlogに表示されています(1行目)
2017/12/17 10:07:18 BGP: %NOTIFICATION: received from neighbor 172.168.0.1 6/2 (Cease/Administratively Shutdown) "We'll shut down the peering session with you because net neutrality was abolished." 2017/12/17 10:07:18 BGP: 172.168.0.1 [FSM] Receive_NOTIFICATION_message (Established->Clearing), fd 10 2017/12/17 10:07:18 BGP: 172.168.0.1 went from Established to Clearing 2017/12/17 10:07:18 BGP: 172.168.0.1 [FSM] Clearing_Completed (Clearing->Idle), fd -1 2017/12/17 10:07:18 BGP: 172.168.0.1 went from Clearing to Idle 2017/12/17 10:07:20 BGP: 172.168.0.1 [FSM] Timer (start timer expire). 2017/12/17 10:07:20 BGP: 172.168.0.1 [FSM] BGP_Start (Idle->Connect), fd -1 2017/12/17 10:07:20 BGP: 172.168.0.1 [Event] Connect start to 172.168.0.1 fd 10 2017/12/17 10:07:20 BGP: 172.168.0.1 [FSM] Non blocking connect waiting result, fd 10 2017/12/17 10:07:20 BGP: 172.168.0.1 went from Idle to Connect 2017/12/17 10:07:20 BGP: 172.168.0.1 [FSM] TCP_connection_open (Connect->OpenSent), fd 10 2017/12/17 10:07:20 BGP: 172.168.0.1 open active, local address 172.168.0.2 2017/12/17 10:07:20 BGP: 172.168.0.1 Sending hostname cap with hn = ubuntu2, dn = (none) 2017/12/17 10:07:20 BGP: 172.168.0.1 sending OPEN, version 4, my as 4200000002, holdtime 180, id 10.0.0.2 2017/12/17 10:07:20 BGP: 172.168.0.1 went from Connect to OpenSent 2017/12/17 10:07:20 BGP: 172.168.0.1 [Event] BGP connection closed fd 10 2017/12/17 10:07:20 BGP: 172.168.0.1 [FSM] TCP_connection_closed (OpenSent->Active), fd 10 2017/12/17 10:07:20 BGP: 172.168.0.1 went from OpenSent to Active
以上です。簡単です。
まとめ
直接相手に言いにくい本音をBGPで伝えることができる、コミュ障エンジニアにとって優しい機能です(^^)
RFC8203はBIRD v2.0でも利用できるようになっています。
予めメッセージの内容を定義しておき、受信したメッセージに合わせて任意のイベントを走らせるようなことも実装次第でできそうです。
半年ぶりのブログ更新でリハビリにゆるーい内容を書きました。。