我正在研究 iptables 和路由。
所以我有一台带有2个接口eth0(192.168.2.100,gw 192.168.2.1)和tun0(10.7.7.2,gw 10.7.7.1)的Ubuntu机器。
我希望流量通过 tun0(10.7.7.1) 到达此站点 ifconfig.me 并通过 eth0(192.168.2.1) 到达 ipinfo.io
所以我做了:
我在以下位置创建了新条目/etc/iproute2/rt_tables
:
echo 1 vpn >> /etc/iproute2/rt_tables
然后我将默认路由添加到新表:
ip route add default via 10.7.7.1 dev tun0 table vpn
我添加了规则,因此所有带有 makr 1 的数据包都将通过表 VPN 进行路由:
ip rule add fwmark 0x1 table vpn
我用标记 1 将所有到 ifconfig.me 的传出流量标记为:
iptables -A OUTPUT -t mangle -d ifconfig.me -j MARK --set-mark 1
当我卷曲到 ipinfo.io 时,curl ipinfo.io
我得到了正确的 IP,形成了 eth0 提供的网关,但是当我尝试从 ifconfig.me 获取响应时,curl ifconfig.me
什么也没有发生(我认为它超时了)。因此,看起来流量正在通过正确的表,但它停在那里。
ip route show table vpn
:
default via 10.7.7.1 dev tun0
答案1
您不需要所有这些混乱,路由是基于目的地和网关的,所以如果您希望一些流量通过某个接口,您需要的只是......正确设置路由:
# ifconfig thru vpn link
ip route add 153.121.72.212 via 10.7.7.1
ip route add 153.121.72.211 via 10.7.7.1
# everything else via default network
ip route add default via 192.168.2.1