宛先ポートに基づいて異なるインターフェイスで出力トラフィック


23

私の質問は基本的に特定のインターフェースで特定のアウトバウンドトラフィックのみを許可すると同じです。

2つのインターフェイスeth1(10.0.0.2)とwlan0(192.168.0.2)があります。私のデフォルトのルートはですeth1。すべてのhttps-trafficを通過させたいとしましょうwlan0。ここで、他の質問で提案されたソリューションを使用すると、httpsトラフィックは通過しますwlan0が、送信元アドレスはeth1(10.0.0.2)のままです。このアドレスはwlan0ゲートウェイにルーティングできないため、回答が返されることはありません。簡単な方法は、アプリケーションでbind-addrを適切に設定することですが、この場合は適用できません。

私はsrc-addrを書き換える必要があると考えています:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

現在、tcpdumpは発信パケットを正常に認識し、着信パケットは192.168.0.2に到着しますが、おそらくアプリケーションに到達することはありません。これは、アプリケーションがSYNパケットを再送信しているということです。 ACKはすでに受信されています。

だから、着信アドレスも書き直す必要があるかもしれないと思った。

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

しかし、それもうまくいきませんでした。だからここで立ち往生しています。助言がありますか?

回答:


24

あなたは近いです。

アプリケーションがリターントラフィックを認識しない実際の理由は、カーネルに組み込まれたIPスプーフィング保護が原因です。つまり、リターントラフィックはルーティングテーブルと一致しないため、ドロップされます。これを修正するには、次のようなスプーフィング保護をオフにします。

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

しかし、私はそれをお勧めしません。より適切な方法は、代替ルーティングインスタンスを作成することです。

  1. マークが必要です。保管してください。
  2. 送信元NATも必要です。
  3. 最終的なDNATは不要なので、削除できます。

iprouteパッケージがインストールされていることを確認してください。ipコマンドがある場合は設定されています(これはあなたのように見えますが、そうでない場合は最初に取得します)。

/etc/iproute2/rt_tables次の行を追加して、新しいテーブルを編集および追加します。

200 wlan-route

次にwlan-route、デフォルトゲートウェイで名前が付けられた新しいルーティングテーブルを構成し、そのテーブルに条件付きでトラフィックを送信するルールを作成する必要があります。デフォルトゲートウェイは192.168.0.1であると仮定します。当然、これは私の仮定だけでなく、実際のネットワークに一致する必要があります。

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

最終的な注釈付きスクリプトは次のようになります。

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

これを見てくれてありがとう。ただし、これはすでに使用しているものです(他の質問で説明しているように)。追加のルートを設定していますが、それでも同じです。SYN-ACKは192.168.0.2に戻りますが、明らかにアプリケーションには到達しません。
ランペル

戻って私の答えをもう一度読んでください。私はそれに対処しました。
バハマ

なりすましの保護に関する部分は?試しても変化はありません。申し訳ありませんが、何度か読み直してください。しかし、私がまだ見逃しているものはまだ得ていません。
ランペル

正しい送信元アドレスを指定するにはsrcip routeコマンドにオプションを追加する必要があります。
デビッドシュワルツ

@DavidSchwartz:それPOSTROUTING SNATはそれの世話をします。
バハマ

8

バハマの解決策は正しいです。ただし、この作業を行う唯一の方法は、NATに関係する2つ(この場合はeth1とwlan0)だけでなく、システム内のすべてのインターフェイスのrp_filterを無効にすることであることに注意してください。

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(このページの最後にある重要な注意事項を参照してください:Advanced Routing Howto-そこに投稿されたリンクはもう存在しませんが、ウェイバックマシンで見つけました)


この回答をありがとう、私もあなたの答えを考慮してバハマのソリューションを動作させることができました。
ダイナロン

かなり標準的なubuntu 12.04 LTSボックスで私にとっては、rp_filterを無効にしてルートキャッシュをフラッシュすることに加えて、iptables引数からインターフェース名を取り除く必要がありました。理由を調査するのに十分な時間がありませんでした。
Costin Gușă 14年

0

1つの提案:出力チェーン--sport--dportはなく、常に使用する必要があります。

NATが変化dportするため、ルールが使用できなくなります。


2
取得できないものはありますか?宛先ポートのように、dportは変更できません。これは、セッションが到達しようとしているサービスのポートです(例:http、ssh、smtp)。あなたはスポーツを得て混乱してdportするか、私は明らかな何かを見逃しています。:P
誰か

0

以下が必要だと思います:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.