使用fwmark规则查路由表不通但直接配置静态ip rule可以的解决办法

最近在做组网时,有一个根据fwmark查不同路由表的需求,但是配好之后怎么也不通,找了好久才从这篇文章得知了问题所在

问题复现

针对路由表

$ ip route show table foreign
default dev wg0 scope link

配置如下规则

ip -4 rule add fwmark 23333 table foreign
iptables -t mangle -A OUTPUT -m geoip ! --dst-cc CN -j MARK --set-mark 23333

此时ping 8.8.8.8,理论上应当走foreign表ping通,但事实是,当没有上面的规则时,路由是通的,mtr显示走了main表的默认路由;当增加了规则后,反而ping不通了,也不显示超时,mtr和抓包表明数据包根本没有离开主机。

原因推断

根据数据包根本没有离开主机这个线索,判断是本机某个规则阻止了数据包的流动。最开始怀疑是源IP设置错误的问题,使用iptables配置SNATwg0接口的IP,无果。又找了几天,才发现文章开头说的这篇文章,再结合一些坑了我的 Linux 内核网络参数,发现原来CentOS从6开始,就默认应用了严格的反向路由过滤策略,会过滤反向路由不是最佳路径的数据包(当然也过滤反向不通的数据包),即使这个数据包的反向路由也是通的。

问题解决

使用如下命令应用宽松的反向路由策略,允许反向路由不是最佳路径的数据包通过。反向不通的数据包仍然会被过滤。

sysctl -w net.ipv4.conf.all.rp_filter=2

如果需要重启自动应用,需要将上面的配置添加到/etc/sysctl.conf

你可能感兴趣的:(net,tcp/ip,linux,网络,防火墙,路由表)