回答:
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2
上記では、ipfilterによるパケットマーキングは必要ありません。発信(返信)パケットには、発信パケットの送信元(送信元)アドレスとして2番目のインターフェイスに接続するために最初に使用されたIPアドレスが含まれるため、機能します。
dev
中でのparamをip rule
ので実行し、コマンドip rule add from <interface_IP> table isp2
up ip rule add from <interface_IP> table isp2
し、up ip route add default via <gateway_IP> dev ppp0 table isp2
関連するインタフェースの下には/ etc / network / interfacesをします。
dev <interface>
するip rule
必要がありました。私が正しいと理解dev <interface>
している場合、オーバーライドされたルートによって正しいインターフェイスにレスリングする必要がある間違ったインターフェイスに何らかの形で設定されたパケットをフィルタリングしていましたが、インターフェイスによるルールフィルタリングはそれを防ぎます。
dev <interface>
はip rule
コマンドから削除する必要がありました。答えを更新してください!その細部を除いて、それは魅力のように働いた。どうもありがとう、@ピーター!
次のコマンド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
Linuxを実行していること、さらにRedHat / CentOSベースのディストリビューションを利用していることを前提としています。他のUnixおよびディストリビューションでも同様の手順が必要になりますが、詳細は異なります。
テストから始めます(これは@Peterの答えに非常に似ていることに注意してください。以下を想定しています。
コマンドは次のとおりです。
$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1
ファイアウォールはいかなる形でも関与していません。返信パケットは常に正しいIPから送信されていましたが、以前は間違ったインターフェイスを介して送信されていました。これで、正しいIPからのこれらのパケットが正しいインターフェイスを介して送信されます。
上記が機能すると仮定すると、ルールとルートの変更を永続的にすることができます。これは、使用しているUnixのバージョンによって異なります。前と同じように、RH / CentOSベースのLinuxディストリビューションを想定しています。
$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1
ネットワークの変更が永続的であることをテストします。
$ ifdown eno1 ; ifup eno1
それがうまくいかなかった場合、RH / CentOSの以降のバージョンでは、次の2つのオプションのいずれかを使用する必要があります。
個人的には、ルールパッケージをインストールする方が、よりシンプルでよりサポートされたアプローチであるためです。
$ yum install NetworkManager-dispatcher-routing-rules
別の強力な推奨事項は、ARPフィルタリングを有効にすることです。これにより、デュアルネットワーク構成に関連する他の問題が防止されます。RH / CentOSで、次のコンテンツを/etc/sysctl.confファイルに追加します。
net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1