私の質問は基本的に、特定のインターフェイスで特定のアウトバウンドトラフィックのみを許可することと同じです。
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
しかし、それもうまくいきませんでした。だから私はここで立ち往生しています。何か提案はありますか?
承認された回答:
あなたは近くにいます。
アプリケーションがリターントラフィックを認識しない実際の理由は、カーネルに組み込まれているIPスプーフィング保護が原因です。つまり、リターントラフィックはルーティングテーブルと一致しないため、ドロップされます。これを修正するには、次のようになりすまし保護をオフにします。
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
しかし、私はそれをお勧めしません。より適切な方法は、代替ルーティングインスタンスを作成することです。
- マークが必要です。保管してください。
- ソースNATも必要です。
- 最終的な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