2つのインターフェースを持つシステムがあります。どちらのインターフェースもインターネットに接続されています。それらの1つがデフォルトルートとして設定されます。これの副作用は、パケットがデフォルト以外のルートのインターフェースに到着した場合、応答がデフォルトのルートインターフェースを介して返送されることです。 iptables(または他の何か)を使用して接続を追跡し、接続元のインターフェースを介して返信を返す方法はありますか?
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アドレスを持つためです。
次のコマンドは、マークが1のパケット(localhostへのパケットを除く)に対して、eth1
を介して代替ルーティングテーブルを作成します。 ip
コマンドは iproute2 スイート(Ubuntu: iprouteInstall iproute http://bit.ly/software-small からのものです=、 iproute-docInstall 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モジュールに追跡するように指示するために、着信パケットに別のルールが必要な場合があります。
ピーターが提案した解決策を使用してローカルで生成されたパケットに問題がありましたが、次のように修正されています:
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
もう1つの強力な推奨事項は、arpフィルタリングを有効にすることです。これにより、デュアルネットワーク構成での他の関連する問題が回避されます。 RH/CentOSを使用して、次の内容を/etc/sysctl.confファイルに追加します。
net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1