FreeBSDでは、FIB(Forwarding Informations Base)を複数持つことができる。
以下、経路表(以下RI)とFIBの違いを不正確を承知で簡単にまとめておく
このFIBが複数あるということで、例えばJail環境におけるPrisoner毎に利用するFIBを変えたり、pfなどを利用してPolicy Routingを行ったりすることが容易になる(と思われる)。
FreeBSDにおいて、sysctl net.fibs
を実行すると、現在のFreeBSD kernel内のFIB数がわかる。
FIBには0から順番に番号が付与されている。また、 FIBはプロセス単位で割り当てることが可能である。 FreeBSD 7.1-RELEASE以降、特に設定しなければ、FIBは1個で、FIB 0が利用される。
setfib(1)を利用することでプロセスにFIBを割り当てることができる。
# setfib -1 ping www.example.com
この場合、ping には FIB 1が割り当てられる。
コマンドによってはFIBを指定するオプションが用意されている。たとえばrouteコマンドは次のようにして、経路情報の変更をどのFIBに反映させるかを指定できる。
route add -net -inet 192.168.2.0/24 10.0.0.1 -fib 2
netstat -rの場合は、次のように指定する。
netstat -r -F 2
FIBを複数用意して、"netstat -nrF 1" のように実行してみると、感じがつかめる筈。
FIBが複数ある場合の利用FIBの決定アルゴリズムは以下の通り。
ifconfig gif0 create tunnelfib 1
とした場合、gif0でカプセル化されたパケットはFIB 1で処理されるifconfig gif0 create fib 1
とした場合、受信してgif0でカプセル化解除されたパケットがFIB 1で処理される上記決定ロジックによってFIBが決定されるので、FIB 1に適当に経路を追加・削除しても、FIB 0を修正しない限り影響はない(筈)。
FIB数は、カーネルオプションの他、loader tunableでも変更可能。(/etc/sysctl.confでは変更不能)。以下主要なtunables.
なお、FIBはIPFWでも設定可能。allowの代わりにsetfibというアクションルールを指定すれば良い。
# ipfw add 1000 setfib 番号 from any to any
この条件にマッチするパケットが指定された番号の FIB に割り当てられます。そしてルールの処理は、マッチしようがしまいが、 そのまま直後のルールに続く。