IPパケットルーターとして動作しているLinuxマシンにおいて、
到達した特定のパケットのみを、異なるルーティングルールに基づいて、
別のデフォルトゲートウェイへ転送させる。(ポリシールーティング)
次のような処理で上記の動作は可能である。
1、特定のパケットをマークして識別可能にする。
2、マークされたパケットを指定したルーティングテーブルで処理する。
例えば、特定の送信元からのパケットのみ、指定したデフォルトゲートウェイを使うようにできる。
まず、最初、次の通常のデフォルトルートに従って、
192.168.100.0/24からのパケットが、192.168.0.1をゲートウェイとして、
192.168.200.0/24へ流れるようになっているものとする。
○通常のデフォルトルート設定
# ip route add default via 192.168.0.1 dev eth0
# ip route list
default via 192.168.0.1 dev eth0 proto static metric 100
そして、以下の設定を加えることによって、
さきのパケットのみ、別のデフォルトルートへ流れるようにする。
■新しいルーティングテーブルの編集
新しいテーブル101上にデフォルトルート設定
# ip route add default via 192.168.9.1 dev eth9 table 101
(ここで、同様にしてその他のネットワークへのルートを設定することもできる。)
登録したルートを確認
# ip route list table 101
default dev eth9 scope link
■マークされたパケットと作成したルーティングテーブルの関連付け
101(=0x65)でマークされたパケットが、作成済みルーティングテーブル101を使って、
ルーティング処理を行われるようにルール作成
# ip rule add fwmark 101 table 101
# ip rule list
0: from all lookup local
32765: from all fwmark 0x65 lookup 101
32766: from all lookup main
32767: from all lookup default
■作成したルーティングテーブルを用いて処理したいパケットの識別
ルーティング前の対象のパケットに対して、101をマークしている。
このマークはカーネル内で有効な情報である。
# iptables -t mangle -A PREROUTING -s 192.168.100.0/24 -d 192.168.200.0/24 -j MARK --set-mark 101
# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK all -- 192.168.100.0/24 192.168.200.0/24 MARK set 0x65
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
変更に伴って、FORWARDのフィルタも適切に変更しておくこと。
これで、他のパケットがデフォルトゲートウェイ 192.168.0.1 へ流れる一方で、
この対象パケットのみデフォルトゲートウェイ 192.168.9.1 へ流れるようになる。
以上