我有一台eth0
连接到互联网的设备,一个通过 运行的 VPN tun0
,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
我该如何做这件事?
答案1
Iptables(Netfilter)不管理路由,它管理过滤或改变数据包。
您需要修改您的内核路由表。
如果 VPN 已启动,则会添加一条默认路由tun0,所以解决方案是添加另一个静态路由A B C D
答案2
最终答案是:
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
这将创建路线,生成一个标记表,并设置标记的流量以便路由回来。