policyベースのipルーティングについて、毎回調べているのでメモとしてまとめておく。
ルーティングテーブル
Linuxではipルーティングテーブルを複数設定できる。ip route add
でテーブルを指定せずにルートを追加した場合は、mainテーブルに追加される。
テーブルの一覧は、/etc/iproute2/rt_tables
に保存されている。テーブルを追加したいときはここを変更する。
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspectacular
#
# local
#
#1 inr.ruhep
第一列はテーブル番号で、第二列はテーブル名である。例えば、vlanに関するルーティングを設定するためのvlanテーブルを追加するには、
$ echo "200 vlan" >> /etc/iproute2/rt_tables
とする。これにより、テーブル番号200、テーブル名vlanのテーブルが登録される。
ルーティングポリシー
Linuxではルーティングポリシーを元に、参照するルーティングテーブルを決定する。各ポリシーには優先順位があり、優先度が高いものからマッチングされる。ポリシー一覧は、ip rule
で表示できる。
$ ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
特に何も設定していない場合は、上のような構成となっている。各行先頭の数字は優先度を表している。優先度は数字が小さいほど高く、同じ値は複数回使用してはならない。優先度の後には、マッチングの条件(この場合は全てのパケットにマッチする)が示されている。また、lookupの後に続いているのは参照するテーブル名である。
マッチングの条件を満たすが、参照先のテーブルにマッチするルーティングがない場合は、次に優先度が低いルーティングポリシーが使用される。
例えば、192.168.0.0/24サブネットへ向かうパケットについて、先ほど作成したvlanテーブルを参照させたい場合は、
$ ip rule add to 192.168.0.0/24 table 200 priority 100
とする。100は優先度で、省略した場合はまだ使われていない番号のうち最大のものが使用される。すなわち、デフォルトでは32765が用いられる。
ルーティング
例えば、192.168.0.0/24サブネットへ向かうパケットは、先ほど行った設定により、vlanテーブルを参照する。そのため、このパケットのルーティングはvlanテーブルで行うことができる。このパケットをeth0.1@eth0から送り出したい場合には、
$ ip route add to 192.168.0.0/24 dev eth0.1@eth0 table vlan
とする。table vlan
でvlanテーブルに追加することを指示している。
同一ルーティングテーブル内では、マッチング条件がより細かい方が優先される。つまり、default via 192.168.0.1 dev eth0.1
よりもto 192.168.0.0/24 dev eth0.1
の方が優先される。もし、この判定方法で同順だった場合、metricが小さい方が優先される。metricは明示的に設定できるが、指定されていなかった場合、カーネルが自動的に決定する。iproute2以前は0となっていたが、iproute2ではそうではない可能性がある(参考: In Linux, what metric has a route with no metric?)。metricも同じだった場合、最後に追加したルーティングが選択される。
参考