ContainerLab を用いた FPM netlink NextHop Group テスト方法
please find English version here:
https://github.com/ebiken/sonic-book/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/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
multipass 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