てくなべ (tekunabe)

ansible / network automation / 学習メモ

BGP Unnumbered で遊んでみた

はじめに

2020/05/09 に、YouTube Live で「BGP Unnumbered で遊んでみた」というお話させていただきました。

BGP Unnumbered は インターフェースや BGP ネイバーの IPアドレス設定が不要な BGP の設定方法です。 IPv6RFC 5549 の仕組みが活用されています。

初めて知ったのは、JANOG43 の「LINEのネットワークをゼロから再設計した話」を聞いたときでした。その後、Cloud Native Data Center Networking という書籍(ここから無料ダウンロードも可能)で Cumulus Linux での実装が掲載されるのを見て、おもしろそうだったので、ためしたうえで、紹介させていただきました。

こちらのブログにも各種リソースを掲載します。

動画

www.youtube.com

補足

UPDATE メッセージで、 IPv6ネクストホップとした、IPv4 経路が広報されてきたときのパケットです。

f:id:akira6592:20200516102025p:plain
UPDATE メッセージ

資料

www.slideshare.net

デモ環境構築 Vagrantfile

github.com

f:id:akira6592:20200516092545p:plain:w300
構成

質疑応答

後日、社内でも同じ発表をしたところいくつか質問をもらいました。それに対する回答です。

Q1. (ネイバー間は IPv6 のみだが) IPv6 のトンネルで IPv4 パケットを運ぶ?

トンネルは利用しません。エンドツーエンドの IPv4 パケットは、ネイバー間も普通の IPv4 パケットです。

IPv6 アドレスは、インターフェースへの自動割当、BGP ネイバーの確立、ネクストホップのMACアドレス導出あたりまでしか利用されません。 ネクストホップの MAC アドレスまで分かれば、あとは普通に(もとの IPv4 ヘッダのアドレスのまま)ネクストホップに転送するだけで、トンネリングしません。

以下は、エンドツーエンド(sv02 > sv01 )で ping を実行した際の、途中の leaf01 で取得したパケットキャプチャです。普通の IPv4 のパケットであることが分かります。

f:id:akira6592:20200516091932p:plain
普通の IPv4 パケット

Q2. show ip bgp summary でネイバー名(spine01 など)が見えたがどういう仕組みで取得しているのか、LLDPか何か?

以下は、leaf01 での show ip bgp summary の結果の抜粋です。

Neighbor        V         AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
spine01(swp1)   4      65000     453     455        0    0    0 00:22:22            3
spine02(swp2)   4      65000     453     455        0    0    0 00:22:21            3

ネイバーのホスト名 spine01 が、spine02 が見えてみます。

BGP の OPEN メッセージを調べたところ、Capability として FQDN Capability というものがあり、ここでホスト名が通知されていました。おそらくこちらの値が利用されているのだと思います。

f:id:akira6592:20200516092059p:plain
FQDN Capability

Q3. エンドツーエンドで traceroute したときに途中のホップの ループバックアドレスが見えたが、どういうこと?

こちらの記事の traceroute の項で解説されています。

参考資料

参考資料の最後に掲載した参考資料を再掲します。

本・サイト

RFC

各社実装