手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 FRR FIB 不整合の復旧 – Zebra とカーネル経路がずれた時に見ること

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 1

FRR 内部では経路が学習されており、選択経路として見えています。ところが、カーネル側では期待した動的経路が見えないことがあります。

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.10

RIB と 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 アソシエイトリンクです。

関連記事

Ubuntu 22.04 FRR FIB 不整合の復旧 – Zebra とカーネル経路がずれた時に見ること

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る