Linux
根據目的埠在不同介面上輸出流量
我的問題與僅允許某些介面上的某些出站流量基本相同。
我有兩個介面
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 數據包,儘管 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