微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 如果NAT的输出接口关闭,则丢弃数据包的回退路由?

背景:

我建立了与标记为特定cgroup的一部分的第三方VPN和NAT数据包的连接(为了有选择地通过VPN运行进程)到第三方的VPN tun设备(本例中为tun2)并使用路由 – 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’中不再有认路由,并且所有流量(甚至是在我的单独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

解决方法

我可以使用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

这很好用

原文地址:https://www.jb51.cc/linux/395357.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐