OpenWrtにBirdをインストールする
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install bird3 bird3c
WireGuardを設定する
重要ポイント
インターフェイスにIPアドレスを割り当てる(10.0.0.1/24とか)
WireGuardでL3ルーティングする分にはインターフェイスIPを設定する必要はないですが、今回はPoint to PointでOSPFを広報するためセグメントを決めて設定しています。
OSPFを広報する対向のIPアドレスと0.0.0.0/0を許可IPに指定する
通信を許可する範囲を指定するだけなので対向IPは入れなくてOKでした。
0.0.0.0/0を入れることで、全てのIPv4トラフィックがトンネル内を通過できるようになります。
許可されたIPのルートにチェックを入れない
チェックを入れると勝手にルートが追加されますが、今回は0.0.0.0/0を許可する関係上、すべての通信がWireguardに勝手に持っていかれると困るのでチェックを入れてはいけません。実際にルートを制御するのはBirdが担当します。
Birdのコンフィグを入れる
router idは各環境ごとに変更してください。基本的にはWireguardのIPアドレスにしておくとわかりやすいかと思います。
それ以外はそのままでデバイスに直結した基本的なルートが広報されます。
広報する、されるルートを制限する場合はそれぞれのimportやexportのfilterを追加してください。
log syslog all;
router id 10.0.0.1;
protocol device {
scan time 10;
}
protocol direct {
ipv4;
}
protocol kernel {
ipv4 {
import all;
export all;
};
scan time 20;
persist;
learn;
}
protocol ospf v2 OSPF_WG {
tick 10;
rfc1583compat yes;
ipv4 {
import all;
export filter {
if ( source = RTS_DEVICE && net ~ [ 10.0.0.0/8+, 172.16.0.0/12+, 192.168.0.0/16+ ]) then accept;
# if net = 0.0.0.0/0 then accept;
reject;
};
};
area 0 {
interface "wg0" {
type ptp;
hello 10;
dead 40;
retransmit 5;
priority 0;
cost 10;
};
};
}
if net = 0.0.0.0/0 then accept;はインターネットへの出口をmwan3などで利用させたい場合に有効化してください。
Birdをリロードして動作チェックする
root@OpenWrt:~# service bird restart
root@OpenWrt:~# birdc show status
BIRD 3.0.1 ready.
BIRD 3.0.1
Router ID is 10.0.0.1
Hostname is OpenWrt
Current server time is 2025-12-05 23:41:09.271
Last reboot on 2025-12-05 21:51:24.325
Last reconfiguration on 2025-12-05 21:51:24.325
Daemon is up and running
root@OpenWrt:~# birdc show protocols
BIRD 3.0.1 ready.
Name Proto Table State Since Info
kernel1 Kernel master4 up 21:51:24.327
OSPF_WG OSPF master4 up 21:51:24.327 Running
device1 Device --- up 21:51:24.327
direct1 Direct --- up 21:51:24.327
root@OpenWrt:~# birdc show ospf topology
BIRD 3.0.1 ready.
area 0.0.0.0
router 10.0.0.1
distance 0
router 10.0.0.2 metric 10
router 10.0.0.2
distance 10
router 10.0.0.1 metric 10
root@OpenWrt:~# birdc show route
BIRD 3.0.1 ready.
Table master4:
### いい感じに経路が出てくるはず ###
ルートを確認する
luciを開き、状態→ルーティングで対向のルートが反映されているか確認する

感想
思ったより結構簡単に導入できました。
拠点数は2つしかありませんが、ネットワーク構成が変わっても勝手に広報してもらえるのでスタティックで切ったりWireGuard側に直接書いたりするより気楽に運用できるようになりました。
補足
0.0.0.0/0が複数ピアで定義出来ない問題について
WireGuardにおいて、1インターフェイスに設定できるAllowedIPsはユニークでなければなりません。
これはTable=offを定義していたとしてもです。
しかし、AllowedIPsはルーティングだけでなく、そのピアとの通信の非暗号化トラフィックを許可する範囲も同時に定義するため、0.0.0.0/0を複数定義できないということは複数のピアに対しOSPFやBGPなどでルート広報・交換し、同時にトラフィックを転送させるといったことが単一インターフェイスで実現できないということになります。
回避策としては主に2つあり、
- ①拠点数分のWireGuardインターフェイスを立ち上げて、1インターフェイスあたり1ピアで接続する
- ②WireGuardは単一インターフェイスでピア同士メッシュ接続し、そのピア同士でGREなどカプセル化を行う
のいずれかを選択することが出来ると考えられます。
①の場合、複数のWireGuardインターフェイスを立ち上げる必要があるため、接続する拠点数分のポートを消費してしまいますが、WireGuardのみで完結するため設定は比較的容易に行うことが出来ます。
②の場合、単一のWireGuardインターフェイスでピア同士をメッシュ接続出来ますが、その中でGREトンネルを立ち上げる形となるため複雑な設定になり、またオーバーヘッドが増加しトラフィックのスループットも低下する可能性があります。
(NATすれば通りそうじゃね?と思ってNATルール追加してみましたが残念ながら通りませんでした。)

