質問: 宛先ポートに基づいて、異なるインターフェースでトラフィックを出力します 私の質問は基本的に同じです 特定のインターフェイスで特定の送信トラフィックのみを許可する 。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 しかし、それもうまくいきませんでした。だから私はちょっとここで立ち往生しています。助言がありますか?
回答: バハマトの解 は正しいです。ただし、この作業を行う唯一の方法は、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 -そこに投稿されたリンクはもう存在しませんが、ウェイバックマシンで見つけました)