ContainerLab を用いた FPM netlink NextHop Group テスト方法
please find English version here:
https://github.com/ebiken/sonic-book-archive/blob/main/clab/fpm.md
FRR on SONiC では FPM (Forwarding Plane Manager) を用いてルーティング情報(FIB情報)をSONiCに伝えています。
また、SONiC側では fpmsyncd というデーモンがFPMメッセージを受け取り APPL_DB の更新を通じ SONiC データプレーンへ情報を伝えています。
以下記事で解説した通り、SONiC.202111 で APPL_DB にて NextHop Group がサポートされました。
しかし、HLD: Routing and Next Hop Table Enhancement に記載の通り、現在(SONiC.202305) fpmsyncd では NextHop Group がサポートされていません。
2.5 Restrictions: fpmsyncd is not updated to use the new NEXT_HOP_GROUP_TABLE as part of this enhancement. Anyone wishing to use this feature must use a modified version of fpmsyncd, or program the table directly.
では、FRRはNextHop Group (Multipath Route) を利用する際にFPMでどのようなメッセージを流しているのでしょうか?
このような複数のインスタンスを用いてテストするのに便利なツールとして ContainerLab があります。
以降、 ContainerLab を用いた FPM netlink で NextHop Group を用いたメッセージをモニタリング方法を紹介します。
テスト環境
本テストは以下環境にて実施しました。
- host: Ubuntu 20.04.4 LTS (5.4.0-153-generic)
- FRR: v8.2.2 (image: frrouting/frr:v8.2.2)
- FRR FPM module: dplane_fpm_nl
- ContainerLab: v0.43.0 (commit: c90be25c, 2023-07-26T16:29:09Z)
- fpm-logger: yutarohayakawa/fpm-logger:latest
利用している設定ファイルは GitHub レポに格納してあります。
なお、FRR FPM module には fpm と fplane_fpm_nl の2種類があります。FPMやfpm-loggerの詳細は以下記事や公式ドキュメント FPM (Forwarding Plane Manager) を参照してください。
ContainerLab セットアップ
ContainerLab は以下1行でインストールできます。
$ bash -c "$(curl -sL https://get.containerlab.dev)"
インストール後、トポロジーファイル(例:topo.yaml)を作成します。
テストトポロジー
今回利用したトポロジーは、5つのFRRノードである r1 r2 r3 r4 r5 コンテナとfpm-loggerが動作する logger コンテナで構成されます。logger コンテナは r1 とネットワークスタックを共有しており、r1 のFPMモジュール(dplane_fpm_nl)とローカルで通信しています。r1 が Multipath Route (NHG) を受け取るように r2 r3 r4 を経由して r5 に接続するトポロジーになっています。

トポロジーの定義
ContainerLabのトポロジーはYAMLファイルで定義します。
今回のトポロジーの意図について、topo.yaml の内容と共に解説します。
また、FRRの設定は <router-name>.frr.conf <router-name>.daemons という命名規則で以下フォルダに保存しています。
https://github.com/ebiken/sonic-book-archive/tree/main/clab/fpm-nhg/frr
logger が r1 とネットワークスタックを共有する事により、fpm-logger は localhost (127.0.0.1:2620) を Listen する事で通信可能となります。topo.yaml の network-mode: container:r1 が該当します。
logger:
kind: linux
image: yutarohayakawa/fpm-logger:latest
network-mode: container:r1
startup-delay: 3
cmd: "bash -c \"fpm-logger | ip monitor all file /dev/stdin\""
NextHop を IPv4 Address として受け取りたかったため、r1 と中継3コンテナ間のリンクには ip address コマンドでIPv4アドレスを設定しています。(同様の設定が [r2|r3|r4].frr.conf にも存在)
interface eth12
ip address 192.168.12.1/24
!
interface eth13
ip address 192.168.13.1/24
!
interface eth14
ip address 192.168.14.1/24
"extended-nexthop" (RFC8950) の例として、r5 と r2 r3 r4 のリンクにはIPv4アドレスは設定されていません。
また、FRR/zebra が Multipath Route を FIB に投入するように、 bgp bestpath as-path multipath-relax 設定を利用しています。
router bgp 65001
bgp router-id 10.0.0.1
no bgp ebgp-requires-policy
bgp bestpath as-path multipath-relax
neighbor 192.168.12.2 remote-as external
neighbor 192.168.13.3 remote-as external
neighbor 192.168.14.4 remote-as external
テスト
ContainerLab の起動
ContainerLab の起動には clab deploy コマンドを利用します。(containerlabコマンドのエイリアス)
$ cd fpm-nhg
$ sudo clab deploy -t topo.yaml
clab destroy で停止できます。
$ sudo clab destroy -t topo.yaml
fpm-logger の起動
$ docker logs clab-fpm-nhg-logger -f
multipath route の生成&モニタ
r5 から経路情報を生成すると、r2 r3 r4 を経由して r1 に multipath route (NHG) が通知されます。今回 r5 のBGPに redistribute connected を設定しましたので、r5 の loopback (lo) にIPv4アドレスをアサインすると経路情報が生成されます。
経路情報の追加
docker exec -it clab-fpm-nhg-r5 ip addr add 10.99.0.0/32 dev lo
docker exec -it clab-fpm-nhg-r5 ip addr add 10.99.0.1/32 dev lo
docker exec -it clab-fpm-nhg-r5 ip addr add 10.99.0.2/32 dev lo
以下のようにFPM netlinkメッセージがログされます。2,3個目の経路では既存のNHGを利用してROUTEを設定している事が分かります。
[NEXTHOP]id 26 via 192.168.12.2 dev eth12 proto zebra
[NEXTHOP]id 27 via 192.168.13.3 dev eth13 proto zebra
[NEXTHOP]id 28 via 192.168.14.4 dev eth14 proto zebra
[NEXTHOP]id 25 group 26/27/28 proto zebra
[ROUTE]10.99.0.0 nhid 25 proto bgp metric 20
[ROUTE]10.99.0.1 nhid 25 proto bgp metric 20
[ROUTE]10.99.0.2 nhid 25 proto bgp metric 20
経路情報の削除
docker exec -it clab-fpm-nhg-r5 ip addr del 10.99.0.0/32 dev lo
docker exec -it clab-fpm-nhg-r5 ip addr del 10.99.0.1/32 dev lo
docker exec -it clab-fpm-nhg-r5 ip addr del 10.99.0.2/32 dev lo
経路情報を削除した場合も、FPM netlink メッセージがログされます。
[ROUTE]Deleted none 10.99.0.0 proto bgp metric 20
[ROUTE]Deleted none 10.99.0.1 proto bgp metric 20
[ROUTE]Deleted none 10.99.0.2 proto bgp metric 20
Appendix: トポロジー図の表示方法
clab graph コマンドで、トポロジー図をHTTPページとして表示可能です。
- TCP port 50080 へのアクセスを許可
$ sudo ufw allow 50080/tcp - トポロジー図(graph)を表示するHTTPサーバを起動
$ sudo clab graph -t topo.yaml INFO[0000] Parsing & checking topology file: topo.yaml INFO[0000] Serving static files from directory: /etc/containerlab/templates/graph/nextui/static INFO[0000] Serving topology graph on http://0.0.0.0:50080 - ブラウザからアクセス
http://<host-ip>:50080/
詳細はコマンドマニュアルを参照してください:https://containerlab.dev/cmd/graph/
Discussion