FreeBSD から始める
FreeBSD は Ubuntu や NixOS と同じ routerd リソースモデルを使います。
ただし、生成されるホスト成果物は FreeBSD の機構に合わせます。
routerd は rc.conf.d、rc.d スクリプト、pf.conf、dhclient.conf、
dnsmasq 設定、mpd5.conf、DS-Lite 用の動的な ifconfig gif 操作を扱います。
このチュートリアルは FreeBSD 14 系を前提にします。
インストール先は /usr/local 配下です。
参照設定として examples/freebsd-edge.yaml を使います。
1. 開発ホストでビルドする
通常は開発用ホストで routerd をビルドし、FreeBSD ルーターへ転送します。 これにより、エッジ側のホストへ Go のビルド環境一式を入れずに済みます。
make build
バイナリを転送します。
scp bin/routerd bin/routerctl bin/routerd-* admin@freebsd-router:/tmp/
ルーター側へ配置します。
sudo install -d -m 0755 /usr/local/sbin
sudo install -m 0755 /tmp/routerd /usr/local/sbin/routerd
sudo install -m 0755 /tmp/routerctl /usr/local/sbin/routerctl
sudo install -m 0755 /tmp/routerd-* /usr/local/sbin/
2. FreeBSD パッケージを導入する
YAML では Package リソースとして宣言します。
初回準備では同じ内容を手で導入するか、生成された install-packages.sh を確認します。
sudo pkg install -y dnsmasq bind-tools wireguard-tools tailscale strongswan mpd5
FreeBSD の base system には ifconfig、sysctl、service、sysrc、
pfctl、pflog0、netstat、sockstat、ping、traceroute があります。
3. ルーター設定を配置する
sudo install -d -m 0755 /usr/local/etc/routerd
sudo install -m 0600 examples/freebsd-edge.yaml /usr/local/etc/routerd/router.yaml
適用前に、インターフェース名、アドレス、秘密値を編集してください。 初回は管理 SSH を別インターフェースに置くか、ハイパーバイザーのコンソールを用意してください。
4. 検証し、生成ファイルを確認する
設定を検証します。
routerd validate --config /usr/local/etc/routerd/router.yaml
FreeBSD 用の成果物を一時ディレクトリへ生成します。
rm -rf /tmp/routerd-freebsd-render
routerd render freebsd \
--config /usr/local/etc/routerd/router.yaml \
--out-dir /tmp/routerd-freebsd-render
主な出力は次の通りです。
rc.conf.d-routerddhclient.confmpd5.confpf.confdnsmasq.confinstall-packages.shrc.d-*
実ホストへ反映する前に内容を確認します。
less /tmp/routerd-freebsd-render/rc.conf.d-routerd
less /tmp/routerd-freebsd-render/pf.conf
less /tmp/routerd-freebsd-render/dnsmasq.conf
5. FreeBSD 側の役割を理解する
routerd はリソースを次の FreeBSD 機構へ対応付けます。
| 機構 | 役割 |
|---|---|
rc.conf.d-routerd | インターフェース別名、転送、複製インターフェース、静的経路、pf、pflog、mpd5 の有効化 |
rc.d-* スクリプト | dnsmasq、firewall logger、healthcheck、Tailscale、DHCP クライアントなどの管理対象デーモン |
pf.conf | ゾーンフィルター、管理対象サービス用の許可、NAT、ファイアウォールログ |
pflog0 | routerd-firewall-logger が読むファイアウォールログ |
dnsmasq.conf | DHCPv4、DHCPv6、DHCP 中継、RA |
dhclient.conf | 引き継いだ上流インターフェースの DHCPv4 クライアント動作 |
mpd5.conf | PPPoE の bundle、link、認証、MTU/MRU、既定経路 |
ifconfig gif | 静的な rc.conf だけで足りない DS-Lite tunnel の動的適用 |
6. 適用する
先に計画を確認します。
routerd plan --config /usr/local/etc/routerd/router.yaml
生成ファイルと計画が想定通りなら適用します。
sudo routerd apply --config /usr/local/etc/routerd/router.yaml
routerd は pf.conf を読み込む前に pfctl -nf で検証します。
dnsmasq も再起動前に dnsmasq --test で検証します。
7. 状態とログを確認する
routerd の状態を確認します。
routerctl status
routerctl events --limit 20
システムログを追います。
tail -f /var/log/routerd.log
pf の状態を確認します。
sudo pfctl -ss -v
pflog0 でファイアウォールログを確認します。
sudo tcpdump -n -e -ttt -i pflog0
FirewallLog を有効にすると、routerd は pflog0 の内容を取り込みます。
取り込んだログは routerctl と Web Console から確認できます。