echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 prio 1
ip route add default via <gateway_IP> dev <interface> table isp2
上記では、ipfilter によるパケットのマーキングは必要ありません。発信 (応答) パケットには、2 番目のインターフェイスに接続するために最初に使用された IP アドレスが発信パケットの送信元 (送信元) アドレスとして含まれるため、これが機能します。
次のコマンドは、eth1
を介して代替ルーティング テーブルを作成します。 マーク 1 を持つパケット (localhost へのパケットを除く)。 ip
コマンドは iproute2 スイートからのものです (Ubuntu:iproute インストール iproute http://bit.ly/software-small, iproute-doc インストール iproute-doc http://bit.ly/software-small)。
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1
ジョブの残りの半分は、マーク 1 を取得する必要があるパケットを認識することです。次に iptables -t mangle -A OUTPUT … -j MARK --set-mark 1
を使用します これらのパケットに対して、ルーティング テーブル 1 を介してルーティングされるようにします。次のようにする必要があると思います (1.2.3.4 を非デフォルト ルート インターフェイスのアドレスに置き換えます):
iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1
これで十分かどうかはわかりませんが、着信パケットを追跡するように conntrack モジュールに指示する別のルールが必要になるかもしれません。
Peter が提案した解決策では、ローカルで生成されたパケットに問題がありました。次の方法で解決できることがわかりました:
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2
注: 上記の 4 行目で構文の問題が発生する可能性があります。このような場合、4 番目のコマンドの構文は次のようになります:
ip rule add iif <interface> table isp2 priority 1000