回退路由丢弃数据包,如果NAT输出接口closures?

背景:

我将第三方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 

这很好