Ubuntu 22.04 上の FRR で、OSPF や BGP の経路は FRR 内では正常に見えているのに、Linux カーネルのルーティングテーブルから動的経路が消えることがあります。この記事では、FRR の RIB と Linux カーネル FIB がずれたときの確認と復旧を整理します。
ポイントは、show ip route で見える FRR 内部の経路と、ip route show で見えるカーネル経路は同じものではない、という点です。FRR が経路を保持していても、Zebra からカーネル FIB への反映が崩れると、実際の転送は失敗します。
現象
FRR 側では OSPF や BGP の経路が存在しているにもかかわらず、Linux 側の ip route show から動的経路が消えます。
vtysh -c 'show ip route'
O>* 10.129.192.1/32 [110/20] via 10.129.1.1, enp1s0, weight 1
O>* 10.201.0.0/21 [110/20] via 10.129.1.2, enp1s0, weight 1
B>* 10.193.8.0/24 [20/0] via 172.17.33.187, enp4s0, weight 1
B>* 10.193.10.0/24 [20/0] via 172.17.33.180, enp4s0, weight 1FRR 内部では経路が学習されており、選択経路として見えています。ところが、カーネル側では期待した動的経路が見えないことがあります。
ip route show
default via 10.129.1.1 dev enp1s0 proto static
10.129.1.0/24 dev enp1s0 proto kernel scope link src 10.129.1.3
172.17.33.0/24 dev enp4s0 proto kernel scope link src 172.17.33.10RIB と FIB を分けて見る
FRR 内部で扱う経路情報は RIB として見ます。一方、実際に Linux がパケット転送に使う経路はカーネル FIB です。FRR の Zebra は、この FRR 内部の経路をカーネルへ反映する役割を持ちます。
- FRR の
show ip routeは FRR 内部の経路を見る - Linux の
ip route showはカーネル FIB を見る - 実際のパケット転送はカーネル FIB に従う
- Zebra は FRR とカーネル FIB の間をつなぐ
- FRR 内で正常でも、カーネルへ反映されていなければ通信は失敗する
確認するコマンド
まず、FRR 側と Linux 側の経路を並べて確認します。
vtysh -c 'show ip route'
vtysh -c 'show ip route summary'
ip route show
ip route get <宛先 IP>BGP や OSPF のプロトコル状態も確認します。
vtysh -c 'show bgp summary'
vtysh -c 'show ip ospf neighbor'
systemctl status frr.serviceログを見る
Zebra や FRR のログに、カーネル経路反映の失敗や netlink 周辺のエラーが出ていないか確認します。
journalctl -u frr.service --no-pager | tail -100
journalctl -u frr.service --since '1 hour ago' --no-pager経路プロトコル自体が正常でも、Zebra とカーネルの間で反映が詰まっている場合があります。ログ、FRR 内部経路、カーネル経路をセットで見ます。
暫定復旧
暫定的には、FRR の再起動でカーネル FIB への反映が戻ることがあります。
sudo systemctl restart frr.service
systemctl status frr.service
ip route show
vtysh -c 'show ip route'復旧後は、FRR 側の経路と Linux 側の経路が再び一致しているか確認します。
再起動で直る場合の注意
FRR 再起動で直る場合でも、それは根本原因の特定ではありません。Zebra とカーネル FIB の同期が一時的に戻っただけです。再発する場合は、発生時刻、ログ、インターフェース状態、経路数、netlink 関連のエラーを記録しておきます。
- 発生時刻
- FRR 内の経路状態
- カーネル FIB の状態
- インターフェースの link up / down
- FRR / Zebra のログ
- 再起動で復旧したかどうか
Kubernetes や BGP 経路広告との関係
Kubernetes で Calico や MetalLB の BGP 経路広告を使う場合、FRR やルーター側の FIB 不整合はアプリケーション疎通に直結します。Kubernetes 側で Service や Pod が正常に見えても、外側の経路制御が壊れていれば通信は成立しません。
そのため、Kubernetes ネットワークを BGP と接続する場合は、Kubernetes 側のリソース状態だけでなく、FRR、ルーター、Linux カーネル FIB を合わせて確認する必要があります。
まとめ
FRR で経路が見えているのに通信できない場合、FRR 内部の RIB と Linux カーネル FIB を分けて確認します。show ip route が正常でも、ip route show に反映されていなければ、実際の転送はできません。
暫定復旧として FRR 再起動が有効な場合はありますが、再発するなら Zebra とカーネル FIB の同期がどこで崩れるのかを記録する必要があります。動的ルーティングをサーバーや Kubernetes と接続する場合、この責務分離を理解しておくと切り分けがかなり楽になります。
書籍
マスタリング TCP/IP ルーティング編
OSPF、IS-IS、BGP、経路制御、ルーティング設計の基礎を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
関連記事
- Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
- Kubernetes Calico eBPF の設計メモ – kube-proxy 代替、DualStack、高可用性をどう見るか
- MicroK8s MetalLB speaker が socket permission denied を出す原因 – L2 / 権限 / ホストネットワークを切り分ける
- OSPF の扱いづらさについての考察
- Kubernetes クラスター構築 – kubeadm で controlPlaneEndpoint と CNI を整理する


