COGNITIVE

Networking

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でも利用できるようになっています。
予めメッセージの内容を定義しておき、受信したメッセージに合わせて任意のイベントを走らせるようなことも実装次第でできそうです。

半年ぶりのブログ更新でリハビリにゆるーい内容を書きました。。