😺

ContainerLab を用いた FPM netlink NextHop Group テスト方法

2023/08/14に公開

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 がサポートされました。
https://zenn.dev/ebiken_sdn/articles/a2b05db7af8048

しかし、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 レポに格納してあります。

https://github.com/ebiken/sonic-book/tree/main/clab/fpm-nhg

なお、FRR FPM module には fpm と fplane_fpm_nl の2種類があります。FPMやfpm-loggerの詳細は以下記事や公式ドキュメント FPM (Forwarding Plane Manager) を参照してください。

https://zenn.dev/ebiken_sdn/articles/9318f4413dab22

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 の内容と共に解説します。

https://github.com/ebiken/sonic-book/blob/main/clab/fpm-nhg/topo.yaml

また、FRRの設定は <router-name>.frr.conf <router-name>.daemons という命名規則で以下フォルダに保存しています。

https://github.com/ebiken/sonic-book/tree/main/clab/fpm-nhg/frr

loggerr1 とネットワークスタックを共有する事により、fpm-loggerlocalhost (127.0.0.1:2620) を Listen する事で通信可能となります。topo.yamlnetwork-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 にも存在)

r1.frr.conf

r1.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) の例として、r5r2 r3 r4 のリンクにはIPv4アドレスは設定されていません。

https://github.com/ebiken/sonic-book/blob/main/clab/fpm-nhg/frr/r5.frr.conf

また、FRR/zebra が Multipath Route を FIB に投入するように、 bgp bestpath as-path multipath-relax 設定を利用しています。

r1.frr.conf

r1.frr.conf
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ページとして表示可能です。

  1. TCP port 50080 へのアクセスを許可 $ sudo ufw allow 50080/tcp
  2. トポロジー図(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
    
  3. ブラウザからアクセス http://<host-ip>:50080/

詳細はコマンドマニュアルを参照してください:https://containerlab.dev/cmd/graph/

Discussion