如果 NAT 的输出接口发生故障,是否采用后备路由丢弃数据包?

如果 NAT 的输出接口发生故障,是否采用后备路由丢弃数据包?

背景:

我建立了与第三方 VPN 的连接,并将标记为特定 cgroup 一部分的 NAT 数据包(以便有选择地通过 VPN 运行进程或不通过 VPN 运行进程)连接到第三方的 VPN tun 设备(本例中为 tun2),并使用路由脚本将默认网关设置为 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”中将不再有默认路由,所有流量(即使是在我单独的 cgroup 中运行的流量)都将通过主表和默认 eth0 接口进行路由。因此,我需要在 iptables 或单独的“vpn”路由表中设置后备路由。如果我使用类似的东西,

iptables -A OUTPUT -m cgroup --cgroup 0x00110011 -o eth0 -j REJECT

它最终会丢弃所有数据包,因此显然这是在 nat 条目之前处理的。同样,我找不到使用“ip route”来更改“vpn”路由表的方法,以便在 tun2 接口丢弃后删除默认网关条目后,它会阻止所有流量。相反,没有任何条目,而且似乎所有流量都只是进入下一个路由表,该路由表必须是主路由表。

更新:我现在已经找到了通过 VPN 选择性运行进程的问题的完整解决方案。

https://serverfault.com/a/766290/345463

答案1

我能够使用 iproute2 的 metric 参数来实现这一点。因此我的路由脚本被修改为以下内容

#!/bin/bash

/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn

我还确保包含一个具有更高度量值的后备黑洞条目(较低的值优先)来阻止所有流量。这可以在启动时与我在问题中列出的其他行一起运行。

ip route add blackhole default metric 2 table vpn

这很有效

相关内容