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


51

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

回答:


61
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アドレスが含まれるため、機能します。


7
うわー、これはまさに私が探していたものです。RHベースのディストリビューションの場合、誰かが探している場合、関連するルールとルートコマンドを「rule-eth0」または「route-eth0」(たとえば)という名前のファイルに入れて、ifup / ifdownで追加または削除できます。これらのファイルをifcfg-eth0ファイルと一緒に配置します。IPv6には、「route6-eth0」機能が組み込まれていますが、「rule6-eth0」は組み込まれていません(まだ)。
カイルブラントレー

18
私が去ったときに私のためにそれだけで働いていたdev中でのparamをip ruleので実行し、コマンドip rule add from <interface_IP> table isp2
cdauth

2
あなたは、インターフェイスが追加することによって、上がるときに、これらを作成することができますup ip rule add from <interface_IP> table isp2し、up ip route add default via <gateway_IP> dev ppp0 table isp2関連するインタフェースの下には/ etc / network / interfacesをします。
-g.rocket

4
私のボックスで動作させるには、から削除dev <interface>するip rule必要がありました。私が正しいと理解dev <interface>している場合、オーバーライドされたルートによって正しいインターフェイスにレスリングする必要がある間違ったインターフェイスに何らかの形で設定されたパケットをフィルタリングしていましたが、インターフェイスによるルールフィルタリングはそれを防ぎます。
ビンキ

2
他のほとんどの人と同様に、これを機能させるためにdev <interface>ip ruleコマンドから削除する必要がありました。答えを更新してください!その細部を除いて、それは魅力のように働いた。どうもありがとう、@ピーター!
MoonSweep

6

次のコマンド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モジュールにそれらを追跡するように指示するために、着信パケットに別のルールが必要になる可能性があります。


いいね マーキングについてすべて忘れていました。それで私はそこに着くはずです。
ショーンJ.ゴフ

5

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

いろいろ試してみましたが、私のシナリオでは何もうまくいきませんでした。
アガギ

3

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

別の強力な推奨事項は、ARPフィルタリングを有効にすることです。これにより、デュアルネットワーク構成に関連する他の問題が防止されます。RH / CentOSで、次のコンテンツを/etc/sysctl.confファイルに追加します。

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.