FreeBSDではsetfib(1)を使って複数の経路を使い分けることができる。
FIBの仕組みについては下記の記事で許さんが解説されているので参照していただくとして、
FreeBSD 14.2ではまったので記録しておく。
FreeBSDにおけるFIB [Share FreeBSD based information]
インターフェースへの経路
net.add_addr_allfibsのデフォルトは0に変わっているので、/boot/loader.confで
net.fibs="2"
net.add_addr_allfibs="1"
と書かないとFIBが0以外の場合にインターフェースへの経路が自動的に追加されない。
net.add_addr_allfibsを1に設定しても、
% netstat -rn4 -F 1
Routing tables (fib: 1)
Internet:
Destination Gateway Flags Netif Expire
127.0.0.1 link#3 UH lo0
172.26.xxx.0/24 link#2 U re1
192.168.xx.0/24 link#1 U re0
と自分のアドレスへの経路が追加されない。このため、/etc/rc.confで
static_routes="re0 re1"
route_re0="-host 192.168.xx.x -iface lo0 -fib 1"
route_re1="-host 172.26.xxx.xx -iface lo0 -fib 1"
と明示的に設定する必要がある。
% netstat -rn4 -F 1
Routing tables (fib: 1)
Internet:
Destination Gateway Flags Netif Expire
127.0.0.1 link#3 UH lo0
172.26.xxx.0/24 link#2 U re1
172.26.xxx.xx link#3 UHS lo0
192.168.xx.0/24 link#1 U re0
192.168.xx.x link#3 UHS lo0
default route設定がエラーになる
FIBが0以外の場合のdefault routeは/etc/rc.confで
defaultrouter_fib1="172.26.xxx.1"
とすればいいはずだが、route(8)が
Invalid argument
のエラーで設定できないことがある。
# route add default 172.26.xxx.1 -fib 1
add net default: gateway 172.26.xxx.1 fib 1: Invalid argument
同様の問題はFreeBSD bugzillaなどでもいくつか報告がある。
私が試した範囲では、
default routeを設定しようとしたインターフェースのstatusがactiveではないときにこの問題が発生した。
適当なswitchなどにつないでactiveにすれば大丈夫らしい。
# route add default 172.26.xxx.1 -fib 1
add net default: gateway 172.26.xxx.1 fib 1
ネットワークに接続しない状態で設定を試していたので、
これに気付くまで無駄な時間をかなり費やしてしまいました...。