2026年10月3日
2026年10月3日
OSPFの設定方法(FRRouting)|Linux 2台でネイバーを確立して経路を交換するまで
FRRouting(FRR)を使うと、Linux サーバーを OSPF ルーターとして動かし、ほかのルーターと経路を自動で交換できます。この記事では、2台の Linux で検証用の OSPF を組み、FRR のインストール、ospfd の有効化、インターフェース単位の設定、ネイバー確立と経路の確認、よくある失敗の見分け方までを順に説明します。静的ルートの手作業での管理から、障害時に自動で迂回できる構成へ移りたい人向けの内容です。
OSPF の要点
OSPF はリンクステート型のルーティングプロトコルです。各ルーターは隣接するルーター(ネイバー)と Hello パケットを交換して関係を築き、自分のつながっているリンクの情報(LSA)を同じエリア内で共有します。全員が同じ地図(LSDB)を持ち、そこから最短経路を計算するため、リンクが切れたときも別の経路へ自動で切り替わります。
設定で押さえるべき用語は次の4つです。
- ルーターID:ルーターを識別する32ビットの値。IPアドレスの形で書き、OSPF ドメイン内で重複させてはいけません
- エリア:LSA を共有する範囲。小規模ならバックボーンエリア(エリア 0)だけで十分です
- コスト:経路の重み。小さいほど優先され、既定では帯域から自動計算されます
- ネットワークタイプ:broadcast(イーサネットの既定)や point-to-point など。2台を直結する区間では point-to-point にすると DR/BDR の選出が不要になり、構成が単純になります
検証構成
[LAN1 192.168.1.0/24] [LAN2 192.168.2.0/24]
| |
eth2 .1 eth2 .1
R1 ---eth1 10.0.12.1/30 ---- 10.0.12.2/30 eth1--- R2
router-id 10.255.0.1 router-id 10.255.0.2
R1 と R2 を 10.0.12.0/30 で直結し、それぞれの配下にある LAN の経路を OSPF で相手に教える構成です。インターフェース名は環境によって異なるので、ip -br addr で確認して読み替えてください。本番ネットワークに参加させる前に、仮想マシンなどの検証環境で一連の手順を試すことをおすすめします。誤った経路を広報すると、ほかの機器の通信まで止まる可能性があるためです。
FRR のインストールと ospfd の有効化
# Debian / Ubuntu
sudo apt install frr
# RHEL / AlmaLinux / Rocky Linux
sudo dnf install frr
# バージョンの確認
vtysh -c 'show version'
ディストリビューション標準のパッケージは、FRR の最新版より古いことがあります。新しい機能が必要な場合は、FRR プロジェクトが提供するパッケージリポジトリを検討してください。FRR は 10 系が開発の中心です(2026年10月現在)。この記事のコマンドは 8 系以降で使える基本的なものに絞っています。
FRR は機能ごとにデーモンが分かれていて、OSPF(IPv4 用の OSPFv2)は ospfd が担当します。/etc/frr/daemons で有効にしてから FRR を再起動します。
sudo sed -i 's/^ospfd=no/ospfd=yes/' /etc/frr/daemons
sudo systemctl restart frr
sudo systemctl status frr
カーネルとファイアウォールの準備
Linux をルーターとして動かすには、パケット転送を有効にする必要があります。また、OSPF のパケットは IP プロトコル番号 89 で、宛先はマルチキャストアドレス 224.0.0.5 と 224.0.0.6 です。ファイアウォールでこれを許可しないと、ネイバーが見つかりません。
# パケット転送を有効にする(永続化)
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/90-ip-forward.conf
sudo sysctl --system
# firewalld の例:OSPF(プロトコル 89)を許可する
sudo firewall-cmd --permanent --add-rich-rule='rule protocol value="ospf" accept'
sudo firewall-cmd --reload
OSPF の設定
FRR の設定は、vtysh という Cisco IOS に似たシェルで行います。R1 での設定例です。
sudo vtysh
configure terminal
router ospf
ospf router-id 10.255.0.1
log-adjacency-changes
exit
interface eth1
ip ospf area 0
ip ospf network point-to-point
exit
interface eth2
ip ospf area 0
ip ospf passive
exit
end
write memory
R2 では ospf router-id を 10.255.0.2 にし、インターフェースの設定は同じ内容で入れます。
それぞれの設定の意味は次のとおりです。
- ospf router-id:明示しない場合はインターフェースのアドレスから自動で選ばれますが、アドレス変更のたびに変わると混乱のもとになるため、固定しておくのが一般的です
- ip ospf area 0:そのインターフェースをエリア 0 で OSPF に参加させます。古い資料では
router ospfの下にnetwork 10.0.12.0/30 area 0と書く方法が多く載っていますが、同じ構成の中で2つの書き方を混在させると、どのインターフェースが参加しているのか分かりにくくなります。どちらか一方に統一してください - ip ospf network point-to-point:直結区間では DR/BDR の選出を省き、ネイバー確立が速くなります。両端で同じネットワークタイプにそろえることが重要です
- ip ospf passive:LAN 側のインターフェースでは Hello を送らず、経路の情報だけを広報します。サーバーやクライアントしかいないネットワークに不要な OSPF パケットを流さないため、また LAN 上の想定外の機器とネイバーを張らないための設定です
write memory で設定が /etc/frr/frr.conf に保存されます。保存し忘れると、再起動で設定が消えるので注意してください。設定ファイルを直接編集した場合は、sudo systemctl reload frr で反映できますが、その前に既存ファイルをコピーしておくと元に戻しやすくなります。
動作確認
ネイバーの状態
sudo vtysh -c 'show ip ospf neighbor'
相手のルーターIDが表示され、状態が Full になっていればネイバー確立は成功です。point-to-point では DR/BDR がないため、Full/- のように表示されます。broadcast のままの場合は、Full/DR や Full/Backup、3台以上の構成では 2-Way/DROther も正常な状態です。
インターフェースと LSDB
sudo vtysh -c 'show ip ospf interface eth1'
sudo vtysh -c 'show ip ospf database'
show ip ospf interface では、エリア、ネットワークタイプ、Hello と Dead の間隔、コストが確認できます。ネイバーが上がらないときは、ここに表示される値を両側で見比べるのが最初の一歩です。
経路表
sudo vtysh -c 'show ip route ospf'
R1 で 192.168.2.0/24 が OSPF の経路(先頭に O が付く)として表示され、R2 で 192.168.1.0/24 が表示されれば経路交換ができています。FRR の zebra デーモンが Linux カーネルの経路表にも反映するため、ip route を実行すると proto ospf の経路として見えます。最後に、LAN1 の端末から LAN2 の端末へ ping が通ることを確認します。
コストで経路を調整する
既定のコストは「参照帯域 ÷ インターフェース帯域」で計算され、FRR の参照帯域の既定値は 100Mbps です。この場合、1Gbps でも 10Gbps でもコストが 1 になり、帯域の違いが経路選択に反映されません。高速なリンクが混在するなら、すべてのルーターで同じ値に変更します。
router ospf
auto-cost reference-bandwidth 100000
値の単位は Mbps で、この例は 100Gbps を基準にしています。全ルーターでそろえないと、同じリンクでもルーターごとにコストが変わり、意図しない経路が選ばれます。特定のリンクだけ優先度を変えたい場合は、インターフェースで ip ospf cost 50 のように直接指定します。
認証を設定する
同じネットワークに想定外のルーターが参加して誤った経路を流すのを防ぐため、ネイバー間に認証を設定できます。両端で同じ方式・同じ鍵番号・同じ鍵を設定する必要があります。
interface eth1
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 your-ospf-key
鍵は例のまま使わず、推測されにくい値に変えてください。MD5 認証は古い方式で、より強いハッシュ方式に対応しているかは FRR の版によって異なります。使っている版のドキュメントで確認してください。認証を後から追加するときは、片側だけ設定した時点でネイバーが切れるため、作業時間を決めて両側を続けて設定します。
ネイバーが上がらないときの見分け方
ネイバーの状態から、原因をある程度絞り込めます。可能性の高い順に確認してください。
- 一覧に相手が出てこない:ファイアウォールでプロトコル 89 が遮断されている、インターフェースが passive になっている、エリア番号が違う、のいずれかが多いです。
sudo tcpdump -nn -i eth1 ip proto 89で Hello が届いているかを確かめます - Init のまま進まない:相手の Hello は届いているが、自分の Hello が相手に届いていない、または Hello と Dead の間隔が両側で違います。
show ip ospf interfaceで値を見比べます - ExStart や Exchange で止まる:インターフェースの MTU が両側で違う場合によく起きます。MTU をそろえるのが本来の対処で、
ip ospf mtu-ignoreは一時的な回避策です - Full なのに経路が入らない:ネットワークタイプが片側だけ point-to-point になっているなど、設定の食い違いが考えられます
より詳しい切り分けは、内部リンクのトラブルシューティング記事も参考にしてください。
まとめ
- FRR で OSPF を使うには、
/etc/frr/daemonsでospfdを有効にし、パケット転送とプロトコル 89 の通過を許可します - インターフェース単位で
ip ospf areaを設定し、直結区間は point-to-point、LAN 側は passive にすると構成が単純になります show ip ospf neighborでFullを、show ip route ospfで経路を確認し、write memoryで保存します- 参照帯域は全ルーターでそろえ、認証は両側を続けて設定します
- 本番ネットワークに参加させる前に、検証環境で手順と切り戻しを試しておきます