web-dev-qa-db-ja.com

着信と同じインターフェイスで返信しますか?

2つのインターフェースを持つシステムがあります。どちらのインターフェースもインターネットに接続されています。それらの1つがデフォルトルートとして設定されます。これの副作用は、パケットがデフォルト以外のルートのインターフェースに到着した場合、応答がデフォルトのルートインターフェースを介して返送されることです。 iptables(または他の何か)を使用して接続を追跡し、接続元のインターフェースを介して返信を返す方法はありますか?

54
Shawn J. Goff
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アドレスを持つためです。

64
Peter

次のコマンドは、マークが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
5

Linuxを実行していて、さらにRedHat/CentOSベースのディストリビューションを利用していると想定しています。他のUnixやディストリビューションでも同様の手順が必要になりますが、詳細は異なります。


テストから始めます(これは@Peterの回答と非常に似ていることに注意してください。私は以下を想定しています:

  • eno0はisp0であり、全体的なデフォルトゲートウェイがあります。
  • eno1はisp1で、ゲートウェイ192.168.1.1のIP /範囲192.168.1.2/24があります。

コマンドは次のとおりです。

$ 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つのオプションのいずれかを実行する必要があります。

  • デフォルトを使用しないNetworkManager.service;代わりにnetwork.serviceを使用してください。これに必要な正確な手順については調べていません。サービスを有効/無効にする標準のchkconfigまたはsystemctlコマンドが含まれていると思います。
  • NetworkManager-dispatcher-routing-rulesパッケージをインストールする

個人的には、ルールパッケージをインストールする方が簡単です。サポートされる方が簡単な方法だからです。

$ 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
3
zaTricky