背景:
我将第三方VPN和NAT数据包连接到第三方的VPN tun设备(本例中为tun2),并将其标记为特定cgroup的一部分(以便select性地通过VPN运行进程) up脚本将默认网关设置为称为“vpn”的单独路由表的VPN。 这一切都适用于以下(一些小的细节被省略)。
在启动时运行:
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11 iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o tun2 -j MASQUERADE ip rule add fwmark 11 table vpn
包含在openvpn client.conf中:
route-noexec route-up /etc/openvpn/3rdparty/routeup.sh
和routeup.sh为路由表vpn设置默认网关
#!/bin/bash /sbin/ip route replace default via $route_vpn_gateway dev $dev table vpn
问题:如果第三方VPN的接口(tun2)发生故障(例如openvpn崩溃),则路由表“vpn”中将不再有默认路由,并且所有stream量(甚至是在我的单独cgroup中运行的stream量)主表和通过默认的eth0接口。 所以我需要在iptables或单独的'vpn'路由表中设置一个备用路由。 如果我使用类似的东西,
iptables -A OUTPUT -m cgroup --cgroup 0x00110011 -o eth0 -j REJECT
它只是结束丢弃所有数据包,所以显然这是在nat条目之前处理的。 同样,我找不到一种方法来使用'ip route'来改变'vpn'的路由表,这样一旦在tun2接口删除之后删除默认网关条目,它将阻止所有stream量。 相反,没有任何条目,并且看起来所有的stream量都会转到下一个必须是主路由的路由表。
更新:我现在想出了一个完整的解决scheme,通过VPNselect性地运行进程的问题。
https://serverfault.com/a/766290/345463
我能够得到这个工作与iproute2使用度量参数。 所以我的路线脚本被修改为以下
#!/bin/bash /sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn
而且我还要确保还包括一个具有较高度量值(低值优先)的后备黑洞项来阻止所有stream量。 这可以在我的问题中列出的其他行开机运行。
ip route add blackhole default metric 2 table vpn
这很好