私の質問は基本的に同じです 特定のインターフェイスで特定の送信トラフィックのみを許可する 。
2つのインターフェースeth1
(10.0.0.2)とwlan0
(192.168.0.2)があります。私のデフォルトルートはeth1
です。すべてのhttpsトラフィックに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-packetが再送信されていることを確認します。 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
しかし、私はそれをお勧めしません。より適切な方法は、代替ルーティングインスタンスを作成することです。
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
バハマトの解 は正しいです。ただし、この作業を行う唯一の方法は、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 -そこに投稿されたリンクはもう存在しませんが、ウェイバックマシンで見つけました)
1つの提案:常に--sport
の代わりに --dport
出力チェーン内。
NATはdport
を変更するため、ルールが使用できなくなります。
以下が必要だと思います:
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