Networking

iptables:無需 VPN 訪問單個目標主機

  • July 11, 2018

我有一個eth0連接到網際網路的設備,一個 VPN 在tun0through上執行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

這將創建路由,創建一個標記的表,並將標記的流量設置為路由返回。

引用自:https://serverfault.com/questions/918276