BGP unnumberedを使ってSONiCとCumulus Linux(Cumulus VX)との間でBGPピアを張ってみた。
SONiCの新しいバージョン202106が8月中旬になってようやくダウンロード出来るようになった為、以前から試したかったSONiCのBGP unnumberedの機能を使用し、Cumulus VXとの間でBGPピアを確立させてみた。
BGP unnumberedとは?
インタフェースに設定されているIPv4なアドレスを使わずにBGPピアを張る事が出来る、BGPの設定方法。
関連する仕様はRFC5549(Advertising IPv4 Network Layer Reachability Information with an IPv6 Next Hop)となっている。
IPv6 link-localアドレスを利用し、経路情報をBGPのネクストホップ宛てにアドバタイズする事が出来るというもの。
BGP unnumberedの設定は、データセンタ内のLeaf-Spineな構成にて見かける事が有る。
Cumulus Linuxではバージョン3.6の頃には既にBGP unnumberedの設定が出来ていた。
SONiCではバージョン202106にて導入された。
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning
ただし、Edge-coreやNVIDIA等が出している商用版では本家版より早く設定が可能になっている。
当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.24
ゲストOS:SONiC 202106.29782-cbca676c2
ゲストOS:Cumulus VX 4.4.0
構成
SONiCはデプロイ完了の時点で、IPアドレスやBGP等の設定が既に入っていた状態だった為、BGPの設定は既存から大幅に設定を修正。
Cumulus VX側はSONiCの設定に合わせるような内容でIPアドレスとBGPを設定。
SONiCおよびCumulus Linuxの導入
SONiCの最新バージョン202106は以下のリンク先よりダウンロード可能。
ただし、開発者が個人的に立ち上げたサイトである為、永続的にダウンロードが可能であるかに関しては不明。
https://sonic.software/
ダウンロード後、.imgファイルをNHCというツールで.vhdファイルに変換し、VBoxManage.exeコマンドでUUIDを付与する必要が有る。
SONiCのデプロイに関しては、以下の記事をご参照ください。
https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた
Cumulus VXのデプロイに関しては、下記の動画をご参照ください。
https://www.youtube.com/watch?v=9AYYhBcDm1Q how to install Cumulus VX on Virtual Box
SONiC~Cumulus VX間を仮想的に1本づつ仮想的なケーブルで接続させるには、ネットワークアダプタの内部ネットワークの設定を変更する必要が有る。
設定変更の方法に関しては以下の記事をご参照ください。
https://debslink.hatenadiary.jp/entry/20201217/1608182777
Cumulus Linux (Cumulus VX)の設定内容
インタフェースやシステム周りはNCLUコマンドで設定を投入し、net commitコマンドで設定内容を保存。
BGPはvtyshモードに入りCisco IOSライクなコマンドで設定を投入し、write memoryコマンドで設定内容を保存。
以下は/etc/network/interfacesファイルの内容。
NCLUコマンドで投入したインタフェース周りの設定が書かれている。
link-speedとmtuの値はSONiCに合わせている。
auto lo iface lo inet loopback # The primary network interface address 10.1.1.98/32 auto eth0 iface eth0 address 192.168.3.246/24 vrf mgmt auto swp1 iface swp1 address 192.168.10.1/31 alias DEV=jpmtkvmsw99 IF=eth0 link-speed 40000 mtu 9100 auto swp2 iface swp2 address 192.168.10.3/31 alias DEV=jpmtkvmsw99 IF=eth4 link-speed 40000 mtu 9100 auto swp3 iface swp3 address 192.168.10.5/31 alias DEV=jpmtkvmsw99 IF=eth8 link-speed 40000 mtu 9100 auto swp4 iface swp4 address 192.168.10.7/31 alias DEV=jpmtkvmsw99 IF=eth12 link-speed 40000 mtu 9100 auto mgmt iface mgmt address 127.0.0.1/8 address ::1/128 vrf-table auto
以下は/etc/frr/frr.confファイルの内容。
vtyshモードに入り、Cisco IOSライクなコマンドで設定投入し、writeコマンドで設定内容を保存。
vtyshモードから抜けない状態でshow runコマンドを叩くと、以下が出力される。
frr version 7.5+cl4.4.0u4 frr defaults datacenter hostname cumulus log syslog informational hostname jpmtkvmsw98 service integrated-vtysh-config line vty interface swp1 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra interface swp2 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra interface swp3 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra interface swp4 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra router bgp 65098 bgp router-id 10.1.1.98 bgp bestpath as-path multipath-relax neighbor FABRIC peer-group neighbor FABRIC remote-as external neighbor FABRIC bfd neighbor FABRIC capability extended-nexthop neighbor swp1 interface peer-group FABRIC neighbor swp2 interface peer-group FABRIC neighbor swp3 interface peer-group FABRIC neighbor swp4 interface peer-group FABRIC address-family ipv4 unicast network 10.1.1.98/32 exit-address-family
SONiCの設定内容
以下は/etc/sonic/config_db.jsonファイルの内容。自分の場合、直接編集した。
"BGP_NEIGHBOR"の項目について。
"asn"はBGPピア側のAS番号。
"EthernetX interface"は元々は自側のIPアドレスが記載されていた箇所。
"keepalive"の下に有ったBGPピア側のアドレスの設定項目"local_addr"の行は削除した。
"name"は任意の文字列に修正。自分の場合、BGPピア側のインタフェース情報を記載した。
"DEVICE_METADATA"の項目は、"bgp_asn"の値のみ修正。自側のAS番号を記載。
"INTERFACE"と"LOOPBACK_INTERFACE"の項目は、該当するインタフェースにてIPアドレスを修正。
使用しないインタフェースは削除せず残している。
"MGMT_INTERFACE"の項目はデプロイ直後にNCLUコマンドで設定。
{ "BGP_NEIGHBOR": { "Ethernet0 interface": { "asn": "65098", "holdtime": "180", "keepalive": "60", "name": "CUMULUS-SWP1", "nhopself": "0", "rrclient": "0" }, "Ethernet4 interface": { "asn": "65098", "holdtime": "180", "keepalive": "60", "name": "CUMULUS-SWP2", "nhopself": "0", "rrclient": "0" }, "Ethernet8 interface": { "asn": "65098", "holdtime": "180", "keepalive": "60", "nhopself": "0", "rrclient": "0" }, "Ethernet12 interface": { "asn": "65098", "holdtime": "180", "keepalive": "60", "name": "CUMULUS-SWP4", "nhopself": "0", "rrclient": "0" } : : }, "DEVICE_METADATA": { "localhost": { "bgp_asn": "65099", "buffer_model": "traditional", "default_bgp_status": "up", "default_pfcwd_status": "disable", "hostname": "jpmtkvmsw99", "hwsku": "Force10-S6000", "mac": "52:54:00:12:34:56", "platform": "x86_64-kvm_x86_64-r0", "type": "LeafRouter" } }, "FEATURE": { "bgp": { "auto_restart": "enabled", "has_global_scope": "False", "has_per_asic_scope": "True", "has_timer": "False", "high_mem_alert": "disabled", "state": "enabled" }, : : }, "INTERFACE": { : "Ethernet0|192.168.10.0/31": {}, : "Ethernet12|192.168.10.6/31": {}, : "Ethernet4|192.168.10.2/31": {}, : "Ethernet8|192.168.10.4/31": {}, : }, "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.1.99/32": {} }, "MGMT_INTERFACE": { "eth0|192.168.3.247/24": { "gwaddr": "192.168.3.1" } },
以下は、show running-configの出力内容。
Cumulus VXと同様にvtyshモードに入り、Cisco IOSライクなコマンドで設定投入する。
BGPやルートマップの設定が既に入っていた為、不要な設定や修正すべき設定は一旦削除し修正。writeコマンドで設定内容が反映される為、/etc/sonic/frr/bgpd.confや/etc/sonic/frr/zebra.confファイルは直接編集していない。
ルートマップの設定は、AB番号とLoopbackアドレスの値のみ修正し、他はそのまま残した。
自分の環境だけだろうか、writeコマンドで保存した後にSONiCを再起動させると設定内容が元に戻る。以前のバージョン202012の際もそうだった。もうここは割り切って設定投入の後はSONiCを再起動させない事にした。
2021/9/11追記。show runの出力内容をもう少しシンプルにする事が出来た。
address-family ipv6 unicastのエントリを削除。
ルートマップはaddress-family ipv4 unicastのエントリのneighbor設定に係る最低限の行だけ残した。
ルートマップを全て削除すると、show ip bgp summaryのState/PfxRcdとPfxSntの欄にPrefixの本数ではなく(Policy)が出力される。
設定投入後、BGPのステータスがActiveで止まる事象が発生。これはTCP接続を試行している状態を示している。
解決方法をGoogleで検索したら、下記のリンク先(BGP unnumbered issue - Could not finish the TCP handshake)がヒットした為、内容に従いアドバタイズするIPv6のアドレスを別の値に修正した。
ここで思いもよらぬ苦戦を強いられていたが、以下の設定内容で落ち着いた。
Current configuration: ! frr version 7.5.1-sonic frr defaults traditional hostname jpmtkvmsw99 log syslog informational log facility local4 agentx no service integrated-vtysh-config ! password zebra enable password zebra ! ip route 0.0.0.0/0 192.168.3.1 200 ! router bgp 65099 bgp router-id 10.1.1.99 bgp log-neighbor-changes no bgp ebgp-requires-policy no bgp default ipv4-unicast bgp graceful-restart restart-time 240 bgp graceful-restart bgp graceful-restart preserve-fw-state bgp bestpath as-path multipath-relax neighbor FABRIC peer-group neighbor FABRIC remote-as external neighbor Ethernet0 interface peer-group FABRIC neighbor Ethernet4 interface peer-group FABRIC neighbor Ethernet8 interface peer-group FABRIC neighbor Ethernet12 interface peer-group FABRIC ! address-family ipv4 unicast network 10.1.1.99/32 neighbor FABRIC activate neighbor FABRIC soft-reconfiguration inbound neighbor FABRIC route-map FROM_BGP_PEER_V4 in neighbor FABRIC route-map TO_BGP_PEER_V4 out maximum-paths 64 exit-address-family ! ip prefix-list PL_LoopbackV4 seq 5 permit 10.1.1.99/32 ! route-map FROM_BGP_PEER_V4 permit 100 ! route-map TO_BGP_PEER_V4 permit 100 ! ip nht resolve-via-default ! line vty !
BGPテーブルの内容の確認
以下はCumulus Linux側のBGPピアの情報の確認。
ネイバの欄がBGPピアのホスト名と自側のインタフェース名になっている。
jpmtkvmsw98# show ip bgp summary IPv4 Unicast Summary: BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0 BGP table version 2 RIB entries 3, using 600 bytes of memory Peers 4, using 91 KiB of memory Peer groups 1, using 64 bytes of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt jpmtkvmsw99(swp1) 4 65099 271 271 0 0 0 00:13:19 1 2 jpmtkvmsw99(swp2) 4 65099 271 271 0 0 0 00:13:19 1 2 jpmtkvmsw99(swp3) 4 65099 271 271 0 0 0 00:13:19 1 2 jpmtkvmsw99(swp4) 4 65099 271 271 0 0 0 00:13:19 1 2 Total number of neighbors 4 jpmtkvmsw98#
以下はBGPテーブルの内容の確認。
10.1.1.98/32は、Cumulus VX自身がnetworkコマンドで生成した経路。
10.1.1.99/32は、SONiCからアドバタイズされた経路で、4本のNext Hopを持つ。
cumulus@jpmtkvmsw98:mgmt:~$ net show bgp show bgp ipv4 unicast ===================== BGP table version is 2, local router ID is 10.1.1.98, vrf id 0 Default local pref 100, local AS 65098 Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, i internal, r RIB-failure, S Stale, R Removed Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 10.1.1.98/32 0.0.0.0 0 32768 i *= 10.1.1.99/32 192.168.10.6 0 0 65099 i *= 192.168.10.4 0 0 65099 i *= 192.168.10.2 0 0 65099 i *> 192.168.10.0 0 0 65099 i Displayed 2 routes and 5 total paths show bgp ipv6 unicast ===================== No BGP prefixes displayed, 0 exist cumulus@jpmtkvmsw98:mgmt:~$
以下はSONiC側のBGPテーブルの内容。
ネイバの欄が自側のインタフェース名になっている。
jpmtkvmsw99# show ip bgp summary IPv4 Unicast Summary: BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0 BGP table version 2 RIB entries 3, using 576 bytes of memory Peers 4, using 85 KiB of memory Peer groups 1, using 64 bytes of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Ethernet0 4 65098 269 269 0 0 0 00:13:03 1 2 Ethernet4 4 65098 269 269 0 0 0 00:13:03 1 2 Ethernet8 4 65098 269 269 0 0 0 00:13:03 1 2 Ethernet12 4 65098 269 269 0 0 0 00:13:03 1 2 Total number of neighbors 4 jpmtkvmsw99#
以下はBGPテーブルの内容の確認。
10.1.1.99/32は、SONiC自身がnetworkコマンドで生成した経路。
10.1.1.98/32は、Cumulus VXからアドバタイズされた経路で、4本のNext Hopを持つ。
jpmtkvmsw99# show ip bgp BGP table version is 2, local router ID is 10.1.1.99, vrf id 0 Default local pref 100, local AS 65099 Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, i internal, r RIB-failure, S Stale, R Removed Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 10.1.1.98/32 192.168.10.1 0 0 65098 i *= 192.168.10.3 0 0 65098 i *= 192.168.10.5 0 0 65098 i *= 192.168.10.7 0 0 65098 i *> 10.1.1.99/32 0.0.0.0 0 32768 i Displayed 2 routes and 5 total paths jpmtkvmsw99#
今回はここまで。
SONiC~Cumulus VX間でBGP unnumberedでBGPピアを張る事が出来た。
Cumulus VX側は難無く進められたものの、SONiC側はサイトによって別の設定方法が紹介されていたり、IPv6アドレスを修正したり、vtyshモードのwriteコマンドが効いていなかったり(これが一番の不満点)...と思っていた以上に手間取った。
過去の記事(https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた) にて今回と同様にSONiCとCumulus VXとの間でBGPピアを張らせたが、その際は2本しかBGPピアを張れなかった事と比較すると、SONiCの動作が幾分か安定してきたように思える。
Cumulus Linuxのキャラクター「Rocket Turtle」が参考書 Cloud Native Data Center Networking (Dinesh著、O'Reilly刊)を眺めている。
316〜333ページにBGP Unnumberedに関する記載が有る。
参考になったサイト
開発者および先達の皆さまに感謝。
https://support.edge-core.com/hc/en-us/articles/900002377366--Edgecore-SONiC-BGP-Unnumbered [Edgecore SONiC] BGP Unnumbered
https://www.janog.gr.jp/meeting/janog46/wp-content/uploads/2020/06/JANOG46_SONiCSRv6P4.pdf SONiC + P4によるマルチテナントSRv6サービスチェイニングの実現
https://www.apresiatac.jp/blog/20190311992/ Cumulus LinuxでIP CLOS構築
https://tekunabe.hatenablog.jp/entry/202005/16/bgp_unnumbered BGP Unnumbered で遊んでみた
https://datatracker.ietf.org/doc/html/rfc5549 RFC5549
https://cyberagent.ai/blog/tech/658/ RFC5549の技術の導入を実現する方法とメリット
https://qiita.com/masru0714/items/f1505b5da626d34a2e7c SONiCの機能が動かないときの調査方法
https://github.com/Azure/sonic-frr/issues/16 BGP unnumbered issue - Could not finish the TCP handshake
SONiCに関する過去の記事
https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた
https://debslink.hatenadiary.jp/entry/20210214/1613279732 SONiCのWarm Bootの動作確認
https://debslink.hatenadiary.jp/entry/20210320/1616230057 Cumulus LinuxとSONiCの設定ファイル
https://debslink.hatenadiary.jp/entry/20210627/1624789102 SONiCの解説動画
https://debslink.hatenadiary.jp/entry/20210902/1630584311 SONiCとCumulus LinuxでBGP/EVPN/VXLAN
https://debslink.hatenadiary.jp/entry/20210912/1631418907 SONiCとCumulus Linuxで4byte ASなBGP + IP Clos構成
https://debslink.hatenadiary.jp/entry/20220122/1642852049 SONiCでL2 MC-LAGを組んでみた
https://debslink.hatenadiary.jp/entry/20240421/1713678733 DELL版のSONiCをVMware Fusionで動かす - 導入編