メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

SONiCとCumulus LinuxでBGP unnumbered

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を設定。
※図をクリックすると拡大表示します
(2021/8/26 構成図を一部修正)



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で動かす - 導入編