0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenWrt + WireGuard + Bird + OSPFで動的ルーティング

Last updated at Posted at 2025-12-05

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トラフィックがトンネル内を通過できるようになります。

image.png

許可されたIPのルートにチェックを入れない

チェックを入れると勝手にルートが追加されますが、今回は0.0.0.0/0を許可する関係上、すべての通信がWireguardに勝手に持っていかれると困るのでチェックを入れてはいけません。実際にルートを制御するのはBirdが担当します。

image.png

Birdのコンフィグを入れる

router idは各環境ごとに変更してください。基本的にはWireguardのIPアドレスにしておくとわかりやすいかと思います。
それ以外はそのままでデバイスに直結した基本的なルートが広報されます。
広報する、されるルートを制限する場合はそれぞれのimportやexportのfilterを追加してください。

/etc/bird.conf
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を開き、状態ルーティングで対向のルートが反映されているか確認する
image.png

感想

思ったより結構簡単に導入できました。
拠点数は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ルール追加してみましたが残念ながら通りませんでした。)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?