Networking
iptables:無需 VPN 訪問單個目標主機
我有一個
eth0
連接到網際網路的設備,一個 VPN 在tun0
through上執行eth0
,並且任何連接上wlan0
的設備的所有流量都在通過 路由tun0
。這適用於:
# echo "Main"; sudo iptables -S; echo "NAT"; sudo iptables -t nat -S Main -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A FORWARD -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i wlan0 -o tun0 -j ACCEPT NAT -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A POSTROUTING -o tun0 -j MASQUERADE
我現在想做的是將流量路由到 VPN 之外的一個外部地址。例如:
wlan0 -> A.B.C.D -> eth0 wlan0 -> ALL OTHER HOSTS -> tun0
我該怎麼做呢?
iptables (Netfilter) 不管理路由,它管理過濾或更改數據包。
您需要修改核心路由表。
在您的情況下,當 vpn 啟動時,它會添加一條預設路由以通過tun0,因此解決方案是為ABCD添加另一個靜態路由
最後的答案:
sudo ip route add A.B.C.D dev eth0 sudo ip route add default via A.B.C.D dev eth0 table 3 sudo ip rule add fwmark 0x1 table 3 sudo iptables -A OUTPUT -t mangle -o tun0 -d A.B.C.D -j MARK --set-mark 1 sudo iptables -A POSTROUTING -t nat -o eth0 -d A.B.C.D -j SNAT --to <IP_OF_ETH0> sudo ip route flush cache
這將創建路由,創建一個標記的表,並將標記的流量設置為路由返回。