はじめに
SONiCのfrr-mgmt-frameworkを使ってBGP Unnumberedの設定を行ったので、設定方法についてまとめます。
SONiCについて学習を始めたところ、routing-modeという概念があることを知りました。どうやらルーティングの中核であるFRRの設定の管理をどうするか、といことらしいです。
Community版SONiCのrouting-modeはデフォルトで unified になっており、FRRの設定はそのほかの設定と同様config_db.jsonから生成されます。
ただ、デフォルトのsonic-bgpcfgdはBGPのみサポートとなり、OSPF他のルーティングプロトコルはサポートされておらず、結果としてFRRの設定(frr.conf)を別に管理する split モードが主流になっているようです。
config_db.jsonとfrr.confの両方を管理するのは面倒なので、config_db.jsonからFRRのすべての設定を管理しようというのが、今回触ってみたfrr-mgmt-frameworkになります。
この記事では、frr-mgmt-frameworkを使ったBGP Unnumberedの設定方法についての日本語記事が見当たらなかったので、自宅のGNS3環境で設定した内容についてまとめてみました。
環境
- GNS3 2.2.53
- SONiC
SONiC Software Version: SONiC.master.0-e959d77be SONiC OS Version: 12 Distribution: Debian 12.10 Kernel: 6.1.0-22-2-amd64 Build commit: e959d77be Build date: Sat Mar 15 15:40:46 UTC 2025 Built by: ueda@ubuntu- SONiCのイメージは自身でビルドしたものを使用しています。
構成
トポロジ
シンプルで主流なCLOSトポロジとします。
serverは仮想ルータ想定でFRRを動かし、仮想マシンを想定した端末を接続します。
アドレス
BGP Unnumberedのためスイッチ間のアドレスは設定せず、LoopbackアドレスとASNのみを設定します。
アドレス
- loopback: 10.0.0.x/32
- spine-0: 10.0.0.0/32
- spine-1: 10.0.0.1/32
- leaf-0: 10.0.1.0/32
- leaf-1: 10.0.1.1/32
- leaf-2: 10.0.1.2/32
- leaf-3: 10.0.1.3/32
- server-0: 10.1.0.0/32
- server-1: 10.1.0.1/32
- VM0: 192.168.0.1/24 (gw: .255)
- VM1: 192.168.1.1/24 (gw: .255)
ASN
せっかくなので4byte ASNを使ってみることにしました。
spineは共通のASNを使用し、その他は固有のASNとします。
- spine-0: 4200000000
- spine-1: 4200000000
- leaf-0: 4210000000
- leaf-1: 4210000001
- leaf-2: 4210000002
- leaf-3: 4210000003
- server-0: 4220000000
- server-1: 4220000001
設定
デフォルト設定の削除
コミュニティ版SONiCを公式手順で普通にビルドした場合、デフォルトでBGP関連の設定がされいます。
いくつかの設定がされているので、これらを削除しておきます。
いちいちvimで設定を削除するのも面倒なので、適当にjqを使ってconfig_db.jsonを編集します。
# config_db.jsonの編集
cat /etc/sonic/config_db.json | jq 'del(.INTERFACE, .BGP_NEIGHBOR, .LOOPBACK_INTERFACE, .DEVICE_METADATA.localhost.bgp_asn)' | sudo tee /etc/sonic/config_db.json
# 設定の再読み込み
sudo config reload -y
ルーティングモードの変更とfrr-mgmt-frameworkの有効化
SONiCのルーティングモードをunifiedに変更し、frr-mgmt-frameworkを有効化します。
こちらも同じくjqコマンドを使っていきます。便利。
cat /etc/sonic/config_db.json | jq '.DEVICE_METADATA.localhost |= .+{"frr_mgmt_framework_config": "true"}' | jq '.DEVICE_METADATA.localhost |= .+{"docker_routing_config_mode ": "unified"}' | sudo tee /etc/sonic/config_db.json
# 設定の再読み込み
sudo config reload -y
各機器ごとの設定
ここからは各機器ごとの設定を行います。
といっても、ほとんど同じ設定をconfig_db.jsonに追記していくだけです。
コンフィグの設定項目やパラメータはfrr-mgmt-frameworkのHLDドキュメントと実際のYANGモデルを参考にしました。
YANGモデルの読み方に関してはAPRESIA社さんのSONiC YANGを使った設定パラメータの確認方法が分かりやすかったです。
また場合によってはfrr-mgmt-frameworkのソースコードも参考にしました。
spineとleafの設定
ホスト名とloopbackをCLIで設定しました。
config_db.jsonを編集しても良いのですが、CLIで設定した方が手軽なので。
sudo config hostname spine-0
sudo config interface ip add Loopback0 10.0.0.0/32
sudo config save -y
続いてconfig_db.jsonにBGP関連の設定を追記します。jqコマンドを使ったりviで編集するなり、お好きな方法で編集してください。
{
"BGP_GLOBALS": {
"default": {
"router_id": "10.0.0.0",
"local_asn": 4200000000,
"load_balance_mp_relax": "true"
}
},
"BGP_PEER_GROUP": {
"default|FABRIC": {
"peer_type": "external"
}
},
"BGP_NEIGHBOR": {
"default|Ethernet0": {
"peer_group_name": "FABRIC"
},
"default|Ethernet4": {
"peer_group_name": "FABRIC"
},
"default|Ethernet8": {
"peer_group_name": "FABRIC"
},
"default|Ethernet12": {
"peer_group_name": "FABRIC"
}
},
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": ["FABLIC-IN"],
"route_map_out": ["FABLIC-OUT"]
}
},
"ROUTE_MAP": {
"FABLIC-IN|10": {
"route_operation": "permit"
},
"FABLIC-OUT|10": {
"route_operation": "permit"
}
},
"ROUTE_REDISTRIBUTE": {
"default|connected|bgp|ipv4": {}
}
}
no bgp ebgp-requires-policyを設定するためのパラメータが作成時にはなかったため、
許可のみのルートマップを作成しています。
sudo config reload -yで設定を反映すれば、FRR上に以下のような設定が追加されるはずです。
admin@spine-0:~$ show runningconfiguration bgp
Building configuration...
Current configuration:
!
frr version 10.0.1
frr defaults traditional
hostname spine-0
log syslog informational
log facility local4
agentx
no service integrated-vtysh-config
!
password zebra
enable password zebra
!
router bgp 4200000000
bgp router-id 10.0.0.0
no bgp default ipv4-unicast
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
redistribute connected
neighbor FABRIC activate
neighbor FABRIC route-map FABLIC-IN in
neighbor FABRIC route-map FABLIC-OUT out
exit-address-family
exit
!
route-map FABLIC-IN permit 10
exit
!
route-map FABLIC-OUT permit 10
exit
!
end
以下、spine-1とleafに関してもほぼ同様(loopbackとASNのみ違うだけ)の設定になるため、気になる方は展開してください。
spine-1
sudo config hostname spine-1
sudo config interface ip add Loopback0 10.0.0.1/32
sudo config save -y
{
"BGP_GLOBALS": {
"default": {
"router_id": "10.0.0.1",
"local_asn": 4200000000,
"load_balance_mp_relax": "true"
}
},
"BGP_PEER_GROUP": {
"default|FABRIC": {
"peer_type": "external"
}
},
"BGP_NEIGHBOR": {
"default|Ethernet0": {
"peer_group_name": "FABRIC"
},
"default|Ethernet4": {
"peer_group_name": "FABRIC"
},
"default|Ethernet8": {
"peer_group_name": "FABRIC"
},
"default|Ethernet12": {
"peer_group_name": "FABRIC"
}
},
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": ["FABLIC-IN"],
"route_map_out": ["FABLIC-OUT"]
}
},
"ROUTE_MAP": {
"FABLIC-IN|10": {
"route_operation": "permit"
},
"FABLIC-OUT|10": {
"route_operation": "permit"
}
},
"ROUTE_REDISTRIBUTE": {
"default|connected|bgp|ipv4": {}
}
}
leaf-0
sudo config hostname leaf-0
sudo config interface ip add Loopback0 10.0.1.0/32
sudo config save -y
{
"BGP_GLOBALS": {
"default": {
"router_id": "10.0.1.0",
"local_asn": 4210000000,
"load_balance_mp_relax": "true"
}
},
"BGP_PEER_GROUP": {
"default|FABRIC": {
"peer_type": "external"
}
},
"BGP_NEIGHBOR": {
"default|Ethernet0": {
"peer_group_name": "FABRIC"
},
"default|Ethernet4": {
"peer_group_name": "FABRIC"
},
"default|Ethernet8": {
"peer_group_name": "FABRIC"
}
},
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": ["FABLIC-IN"],
"route_map_out": ["FABLIC-OUT"]
}
},
"ROUTE_MAP": {
"FABLIC-IN|10": {
"route_operation": "permit"
},
"FABLIC-OUT|10": {
"route_operation": "permit"
}
},
"ROUTE_REDISTRIBUTE": {
"default|connected|bgp|ipv4": {}
}
}
leaf-1
sudo config hostname leaf-1
sudo config interface ip add Loopback0 10.0.1.1/32
sudo config save -y
{
"BGP_GLOBALS": {
"default": {
"router_id": "10.0.1.1",
"local_asn": 4210000001,
"load_balance_mp_relax": "true"
}
},
"BGP_PEER_GROUP": {
"default|FABRIC": {
"peer_type": "external"
}
},
"BGP_NEIGHBOR": {
"default|Ethernet0": {
"peer_group_name": "FABRIC"
},
"default|Ethernet4": {
"peer_group_name": "FABRIC"
},
"default|Ethernet8": {
"peer_group_name": "FABRIC"
}
},
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": ["FABLIC-IN"],
"route_map_out": ["FABLIC-OUT"]
}
},
"ROUTE_MAP": {
"FABLIC-IN|10": {
"route_operation": "permit"
},
"FABLIC-OUT|10": {
"route_operation": "permit"
}
},
"ROUTE_REDISTRIBUTE": {
"default|connected|bgp|ipv4": {}
}
}
leaf-2
sudo config hostname leaf-2
sudo config interface ip add Loopback0 10.0.1.2/32
sudo config save -y
{
"BGP_GLOBALS": {
"default": {
"router_id": "10.0.1.2",
"local_asn": 4210000002,
"load_balance_mp_relax": "true"
}
},
"BGP_PEER_GROUP": {
"default|FABRIC": {
"peer_type": "external"
}
},
"BGP_NEIGHBOR": {
"default|Ethernet0": {
"peer_group_name": "FABRIC"
},
"default|Ethernet4": {
"peer_group_name": "FABRIC"
},
"default|Ethernet8": {
"peer_group_name": "FABRIC"
}
},
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": ["FABLIC-IN"],
"route_map_out": ["FABLIC-OUT"]
}
},
"ROUTE_MAP": {
"FABLIC-IN|10": {
"route_operation": "permit"
},
"FABLIC-OUT|10": {
"route_operation": "permit"
}
},
"ROUTE_REDISTRIBUTE": {
"default|connected|bgp|ipv4": {}
}
}
leaf-3
sudo config hostname leaf-3
sudo config interface ip add Loopback0 10.0.1.3/32
sudo config save -y
{
"BGP_GLOBALS": {
"default": {
"router_id": "10.0.1.3",
"local_asn": 4210000003,
"load_balance_mp_relax": "true"
}
},
"BGP_PEER_GROUP": {
"default|FABRIC": {
"peer_type": "external"
}
},
"BGP_NEIGHBOR": {
"default|Ethernet0": {
"peer_group_name": "FABRIC"
},
"default|Ethernet4": {
"peer_group_name": "FABRIC"
},
"default|Ethernet8": {
"peer_group_name": "FABRIC"
}
},
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": ["FABLIC-IN"],
"route_map_out": ["FABLIC-OUT"]
}
},
"ROUTE_MAP": {
"FABLIC-IN|10": {
"route_operation": "permit"
},
"FABLIC-OUT|10": {
"route_operation": "permit"
}
},
"ROUTE_REDISTRIBUTE": {
"default|connected|bgp|ipv4": {}
}
}
server(FRR)の設定
serverはFRRを利用します。
vtyshで設定していくだけで、内容的にはSONiCと大きな違いはありません。
設定は以下。
- server-0
!
hostname server-0-FRR
!
interface eth0
description To_leaf-0
ipv6 nd ra-interval 10
no ipv6 nd suppress-ra
no shutdown
exit
!
interface eth1
description To_Leaf-1
ipv6 nd ra-interval 10
no ipv6 nd suppress-ra
no shutdown
exit
!
interface eth3
ip address 192.168.0.254/24
no shutdown
exit
!
interface lo
ip address 10.1.0.0/32
no shutdown
exit
!
router bgp 4220000000
bgp router-id 10.1.0.0
no bgp ebgp-requires-policy
no bgp default ipv4-unicast
bgp bestpath as-path multipath-relax
neighbor FABRIC peer-group
neighbor FABRIC remote-as external
neighbor eth0 interface peer-group FABRIC
neighbor eth0 capability extended-nexthop
neighbor eth1 interface peer-group FABRIC
neighbor eth1 capability extended-nexthop
!
address-family ipv4 unicast
redistribute connected
neighbor FABRIC activate
exit-address-family
exit
!
ip nht resolve-via-default
!
ipv6 nht resolve-via-default
!
end
server-1
- server-1
hostname server-1
!
interface eth3
no shutdown
ip address 192.168.1.254/24
exit
!
interface lo
no shutdown
ip address 10.1.0.1/32
exit
!
interface eth0
no shutdown
exit
!
interface eth1
no shutdown
exit
!
router bgp 4220000001
bgp router-id 10.1.0.1
no bgp default ipv4-unicast
no bgp ebgp-requires-policy
bgp bestpath as-path multipath-relax
neighbor FABRIC peer-group
neighbor FABRIC remote-as external
neighbor FABRIC capability extended-nexthop
neighbor eth0 capability extended-nexthop
neighbor eth0 interface peer-group FABRIC
neighbor eth1 capability extended-nexthop
neighbor eth1 interface peer-group FABRIC
!
address-family ipv4 unicast
redistribute connected
neighbor FABRIC activate
exit-address-family
exit
!
ip nht resolve-via-default
!
ipv6 nht resolve-via-default
!
end
再起動するとinterfaceがshutdownされたりno neighbor ethX capability extended-nexthopが勝手に設定されてたりするので注意してください。(なにか対処方法があるかもしれませんが、都度設定していました)
確認
各ノードでBGP状態やルーティングを確認し、
隣接関係が確立されていることと、ルーティングテーブルに必要なルートが登録されていることを確認します。
Unnumberedのため、Neighborはインタフェース、nexthopはIPv6 Link-Localアドレスとなります。
spine-0
admin@spine-0:~$ show ip bgp summary
IPv4 Unicast Summary:
BGP router identifier 10.0.0.0, local AS number 4200000000 vrf-id 0
BGP table version 21
RIB entries 17, using 2176 bytes of memory
Peers 4, using 82368 KiB of memory
Peer groups 1, using 64 bytes of memory
Neighbhor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd NeighborName
----------- --- ---------- --------- --------- -------- ----- ------ --------- -------------- --------------
Ethernet0 4 4210000000 427 418 21 0 0 06:36:35 3 NotAvailable
Ethernet4 4 4210000001 418 417 21 0 0 06:36:40 3 NotAvailable
Ethernet8 4 4210000002 428 418 21 0 0 06:36:34 3 NotAvailable
Ethernet12 4 4210000003 420 420 21 0 0 06:36:40 3 NotAvailable
Total number of neighbors 4
admin@spine-0:~$ show ip bgp network
BGP table version is 21, local router ID is 10.0.0.0, vrf id 0
Default local pref 100, local AS 4200000000
Status codes: s suppressed, d damped, h history, u unsorted, * 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
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.0.0/32 0.0.0.0 0 32768 ?
*> 10.0.1.0/32 Ethernet0 0 0 4210000000 ?
*> 10.0.1.1/32 Ethernet4 0 0 4210000001 ?
*> 10.0.1.2/32 Ethernet8 0 0 4210000002 ?
*> 10.0.1.3/32 Ethernet12 0 0 4210000003 ?
*> 10.1.0.0/32 Ethernet0 0 4210000000 4220000000 ?
*= Ethernet4 0 4210000001 4220000000 ?
*> 10.1.0.1/32 Ethernet8 0 4210000002 4220000001 ?
*= Ethernet12 0 4210000003 4220000001 ?
*> 192.168.0.0/24 Ethernet0 0 4210000000 4220000000 ?
*= Ethernet4 0 4210000001 4220000000 ?
*> 192.168.1.0/24 Ethernet8 0 4210000002 4220000001 ?
*= Ethernet12 0 4210000003 4220000001 ?
Displayed 9 routes and 13 total paths
admin@spine-0:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued route, r - rejected route
C>*10.0.0.0/32 is directly connected, Loopback0, 06:37:03
B>*10.0.1.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, Ethernet0, 06:36:44
B>*10.0.1.1/32 [20/0] via fe80::20bd:b3ff:fe9b:5c8f, Ethernet4, 06:36:50
B>*10.0.1.2/32 [20/0] via fe80::2037:8dff:fe17:ca80, Ethernet8, 06:36:44
B>*10.0.1.3/32 [20/0] via fe80::204b:bcff:fe55:7962, Ethernet12, 06:36:50
B>*10.1.0.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, Ethernet0, 00:07:46
* via fe80::20bd:b3ff:fe9b:5c8f, Ethernet4, 00:07:46
B>*10.1.0.1/32 [20/0] via fe80::2037:8dff:fe17:ca80, Ethernet8, 00:06:48
* via fe80::204b:bcff:fe55:7962, Ethernet12, 00:06:48
B>*192.168.0.0/24 [20/0] via fe80::2039:8aff:fedb:e3dd, Ethernet0, 00:07:46
* via fe80::20bd:b3ff:fe9b:5c8f, Ethernet4, 00:07:46
B>*192.168.1.0/24 [20/0] via fe80::2037:8dff:fe17:ca80, Ethernet8, 00:06:48
* via fe80::204b:bcff:fe55:7962, Ethernet12, 00:06:48
admin@spine-0:~$
leaf-0
admin@leaf-0:~$ show ip bgp summary
IPv4 Unicast Summary:
BGP router identifier 10.0.1.0, local AS number 4210000000 vrf-id 0
BGP table version 24
RIB entries 19, using 2432 bytes of memory
Peers 3, using 61776 KiB of memory
Peer groups 1, using 64 bytes of memory
Neighbhor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd NeighborName
----------- --- ---------- --------- --------- -------- ----- ------ --------- -------------- --------------
Ethernet0 4 4200000000 418 428 24 0 0 06:37:56 6 NotAvailable
Ethernet4 4 4200000000 427 421 24 0 0 06:37:51 6 NotAvailable
Ethernet8 4 4220000000 441 461 24 0 0 00:08:58 3 NotAvailable
Total number of neighbors 3
admin@leaf-0:~$ show ip bgp network
BGP table version is 24, local router ID is 10.0.1.0, vrf id 0
Default local pref 100, local AS 4210000000
Status codes: s suppressed, d damped, h history, u unsorted, * 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
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.0.0/32 Ethernet0 0 0 4200000000 ?
*> 10.0.0.1/32 Ethernet4 0 0 4200000000 ?
*> 10.0.1.0/32 0.0.0.0 0 32768 ?
*> 10.0.1.1/32 Ethernet0 0 4200000000 4210000001 ?
*= Ethernet4 0 4200000000 4210000001 ?
*= Ethernet8 0 4220000000 4210000001 ?
*> 10.0.1.2/32 Ethernet0 0 4200000000 4210000002 ?
*= Ethernet4 0 4200000000 4210000002 ?
*> 10.0.1.3/32 Ethernet0 0 4200000000 4210000003 ?
*= Ethernet4 0 4200000000 4210000003 ?
*> 10.1.0.0/32 Ethernet8 0 0 4220000000 ?
*> 10.1.0.1/32 Ethernet0 0 4200000000 4210000002 4220000001 ?
*= Ethernet4 0 4200000000 4210000002 4220000001 ?
*> 192.168.0.0/24 Ethernet8 0 0 4220000000 ?
*> 192.168.1.0/24 Ethernet0 0 4200000000 4210000002 4220000001 ?
*= Ethernet4 0 4200000000 4210000002 4220000001 ?
Displayed 10 routes and 16 total paths
admin@leaf-0:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued route, r - rejected route
B>*10.0.0.0/32 [20/0] via fe80::20ce:43ff:fe8f:761e, Ethernet0, 06:38:10
B>*10.0.0.1/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 06:38:06
C>*10.0.1.0/32 is directly connected, Loopback0, 06:38:27
B>*10.0.1.1/32 [20/0] via fe80::e3e:88ff:fe2f:0, Ethernet8, 00:09:12
* via fe80::2016:18ff:fec7:a84c, Ethernet4, 00:09:12
* via fe80::20ce:43ff:fe8f:761e, Ethernet0, 00:09:12
B>*10.0.1.2/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 06:38:06
* via fe80::20ce:43ff:fe8f:761e, Ethernet0, 06:38:06
B>*10.0.1.3/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 06:38:06
* via fe80::20ce:43ff:fe8f:761e, Ethernet0, 06:38:06
B>*10.1.0.0/32 [20/0] via fe80::e3e:88ff:fe2f:0, Ethernet8, 00:09:12
B>*10.1.0.1/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 00:08:14
* via fe80::20ce:43ff:fe8f:761e, Ethernet0, 00:08:14
B>*192.168.0.0/24 [20/0] via fe80::e3e:88ff:fe2f:0, Ethernet8, 00:09:12
B>*192.168.1.0/24 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 00:08:14
* via fe80::20ce:43ff:fe8f:761e, Ethernet0, 00:08:14
admin@leaf-0:~$
server-0
server-0-FRR# show ip bgp
BGP table version is 31, local router ID is 10.1.0.0, vrf id 0
Default local pref 100, local AS 4220000000
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
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*= 10.0.0.0/32 eth1 0 4210000001 4200000000 ?
*> eth0 0 4210000000 4200000000 ?
*= 10.0.0.1/32 eth1 0 4210000001 4200000000 ?
*> eth0 0 4210000000 4200000000 ?
* 10.0.1.0/32 eth1 0 4210000001 4200000000 4210000000 ?
*> eth0 0 0 4210000000 ?
*> 10.0.1.1/32 eth1 0 0 4210000001 ?
* eth0 0 4210000000 4200000000 4210000001 ?
*= 10.0.1.2/32 eth1 0 4210000001 4200000000 4210000002 ?
*> eth0 0 4210000000 4200000000 4210000002 ?
*= 10.0.1.3/32 eth1 0 4210000001 4200000000 4210000003 ?
*> eth0 0 4210000000 4200000000 4210000003 ?
*> 10.1.0.0/32 0.0.0.0 0 32768 ?
*> 10.1.0.1/32 eth0 0 4210000000 4200000000 4210000002 4220000001 ?
*= eth1 0 4210000001 4200000000 4210000002 4220000001 ?
*> 192.168.0.0/24 0.0.0.0 0 32768 ?
*> 192.168.1.0/24 eth0 0 4210000000 4200000000 4210000002 4220000001 ?
*= eth1 0 4210000001 4200000000 4210000002 4220000001 ?
Displayed 10 routes and 18 total paths
server-0-FRR#
server-0-FRR# show ip bgp summary
IPv4 Unicast Summary (VRF default):
BGP router identifier 10.1.0.0, local AS number 4220000000 vrf-id 0
BGP table version 31
RIB entries 19, using 3496 bytes of memory
Peers 2, using 1433 KiB of memory
Peer groups 1, using 64 bytes of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
eth0 4 4210000000 456 441 0 0 0 00:10:03 8 10 N/A
eth1 4 4210000001 446 445 0 0 0 00:10:03 8 10 N/A
Total number of neighbors 2
server-0-FRR#
server-0-FRR# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure
B>* 10.0.0.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
* via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.0.1/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
* via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.1.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
B>* 10.0.1.1/32 [20/0] via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.1.2/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
* via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.1.3/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
* via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
C>* 10.1.0.0/32 is directly connected, lo, 06:42:32
B>* 10.1.0.1/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:09:07
* via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:09:07
C>* 192.168.0.0/24 is directly connected, eth3, 06:42:32
B>* 192.168.1.0/24 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:09:07
* via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:09:07
server-0-FRR#
BGPセッションのパケットキャプチャも確認してみます。
OpenMessageではMultiprotocol extension、Extended Next Hop、Support for 4-octet AS numberが確認できます。
つづいてUpdateMessage。
MP_REACH_NLRIパス属性を確認すると、IPv4ネットワークのNexthopがIPv6 Link-Localアドレスであることがわかります。
VM間の疎通確認もできて、無事にBGP Unnumberedの環境が構築できました。
つまづき
以下、蛇足として当方のつまづきポイントになります。
もともとSONiCもBGPもほとんど経験がなかい中でわざわざfrr-mgmt-frameworkを使ったので、いろいろハマりました。
Neighborのアクティベートができない。
以下の設定でneighbor FABRIC activateを設定しようとしても反映されない問題が発生。
{
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true"
}
}
}
デフォルトでno bgp default ipv4-unicastが入っているため、activateを設定しないとNeighborが張れません。
かといってno bgp default ipv4-unicastを削除しようとconfig_db.jsonのi"BGP_GROBALS"に"default_ipv4_unicast": "true"を追加したところ、
今度はno neighbor FABRIC activateが入っちゃって、絶対にActivateさせないという強い意思を感じます。
どうやらYANGモデルとfrr-mgmt-frameworkのソースコードに不整合(YANGモデル上はtrue/falseなのにソースコードではup/downの選択)があるようで、気づいたときにはすでにプルリクが上がっていました。
マージされたバージョンを利用することで解決。
show intコマンドの不具合
参考にしていた記事と同様の事象です。
SONiC と FRR -- sonic-frr-mgmt-framework 編 不具合
構築当時は同様の事象が確認できましたが、途中でアップデートしたところ、問題なく動作するようになりました。
ルートマップが想定通りに動かない
最初に、以下のようにルートマップを設定しました。
{
"BGP_PEER_GROUP_AF": {
"default|FABRIC|ipv4_unicast": {
"admin_status": "true",
"route_map_in": "FABLIC-IN",
"route_map_out": "FABLIC-OUT"
}
}
}
出力されたFRRのコンフィグがこちら。
address-family ipv4 unicast
neighbor FABRIC activate
neighbor FABRIC route-map N in
neighbor FABRIC route-map T out
exit-address-family
exit
一文字しかない。。。
こちら、YANGモデルをちゃんと確認したところLISTで指定しないといけないっぽいことがわかりました。
https://github.com/sonic-net/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-bgp-common.yang#L385-L399
https://github.com/sonic-net/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-route-map.yang#L125-L134
でもHLDを見た感じだと普通に文字列で指定のように思うんですよね......HLDを実装に合わせるべきなんでしょうか......
https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/SONiC_Design_Doc_Unified_FRR_Mgmt_Interface.md#3219-bgp_peer_group_af
時間があるときに最新のCommitを確認してみたいと思います。
まとめ
そのほかにもいろいろハマってはいますが、なんとかBGP Unnumberedの環境を構築できました。
frr-mgmt-framework自体はまだ開発途中という印象でしたが、構築中も日々アップデートされてバグが解消されており、SONiC自体も含めてスピード感におどきました。
FRRを触らずに済むメリットはかなり大きそうですね。sonic-cli-genを利用すればCLIで設定できたりもするみたいなので、試してみたいです。
各ドキュメント、ソースコードを確認しながらの作業はハードル高めに感じましたが、最悪コードを読めばなんとかなるというのは強味に感じています。
次はこのままfrr-mgmt-frameworkを使って、BGP EVPNの環境を構築してみたいと思います。






