web-dev-qa-db-ja.com

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

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

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

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

25
rumpel

あなたは近いです。

アプリケーションがリターントラフィックを認識しない実際の理由は、カーネルの組み込み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
25
bahamat

バハマトの解 は正しいです。ただし、この作業を行う唯一の方法は、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 -そこに投稿されたリンクはもう存在しませんが、ウェイバックマシンで見つけました)

10
Davide C

1つの提案:常に--sport の代わりに --dport出力チェーン内。

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

0
user73451

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

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
0
user181234