宛先ポートに応じてさまざまなインターフェイスにトラフィックを出力

宛先ポートに応じてさまざまなインターフェイスにトラフィックを出力

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

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

私の考えでは、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受信にもかかわらず、アプリケーションがSYNパケットを再送信するため、アプリケーションで終了しない可能性があります.

だから私は受信アドレスも書き換える必要があるかもしれないと思いました。

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

しかし、それも動作しません。だから私はここに閉じ込められています。どんな提案がありますか?

答え1

あなたは近いです。

アプリケーションが戻りトラフィックを表示できない実際の理由は、カーネルに組み込まれた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

答え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

(このページの最後にある重要な注意事項を参照してください。高度なルーティングガイド--そこに投稿されたリンクはもう存在しませんが、リターンマシンで見つけました.)

答え3

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

NATが変更され、dportルールが利用できなくなります。

答え4

私は似たようなことをしようとします。 wwan0(メトリック700)とeth0(メトリック100)の2つのインターフェースがあります。すべてのhttps(443)トラフィックがwwan0を通過したいです。上記の例に従い、最初のいくつかのパケットで動作しましたが、FIN-WAIT-1のステータスが表示され始めた後、動作が停止し、FIN-WAIT-1のリストが大きくなりました。何が起こったのかわかりません。システムが起動し、約443個のトラフィックがeth0に送信され始め、スクリプトが実行され、トラフィックがwwan0に移動しますが、何百ものパケットの後に何かが飽和してFIN-WAIT-1を提供し続けます。

私は次のように設定しました。

ip route add default dev wwan0 table wwan-route
ip rule add fwmark 0x1 table wwan-route
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 1
nft add table nat
nft add chain nat post { type nat hook postrouting priority 0 \; }
nft add rule ip nat post oifname wwan0 tcp dport 443 masquerade

ルーティングテーブル:

default via 192.168.1.1 dev eth0 proto dhcp metric 100 
default via 10.5.1.101 dev wwan0 proto static metric 700 
10.5.1.96/29 dev wwan0 proto kernel scope link src 10.5.1.100 metric 700 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.127 metric 100 

すべてのIPルーティング表示テーブル:

# ip route show table all
default via 192.168.1.1 dev eth0 table eth0rule 
default dev wwan0 table wwan-route scope link 
default via 192.168.1.1 dev eth0 proto dhcp metric 100 
default via 10.5.1.101 dev wwan0 proto static metric 700 
10.5.1.96/29 dev wwan0 proto kernel scope link src 10.5.1.100 metric 700 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.127 metric 100 
broadcast 10.5.1.96 dev wwan0 table local proto kernel scope link src 10.5.1.100 
local 10.5.1.100 dev wwan0 table local proto kernel scope host src 10.5.1.100 
broadcast 10.5.1.103 dev wwan0 table local proto kernel scope link src 10.5.1.100 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.1.0 dev eth0 table local proto kernel scope link src 192.168.1.127 
local 192.168.1.127 dev eth0 table local proto kernel scope host src 192.168.1.127 
broadcast 192.168.1.255 dev eth0 table local proto kernel scope link src 192.168.1.127 

IPルール:

 ip rule
0:      from all lookup local
0:      from all fwmark 0x1 lookup wwan-route
1:      from 192.168.1.127 lookup eth0rule
32766:  from all lookup main
32767:  from all lookup default

そして:

cat /etc/iproute2/rt_tables 
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
210 wwan-route
200 eth0rule

ほぼ全部来ましたが何か抜けましたね。

関連情報