最近在做组网时,有一个根据
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
配置SNAT
为wg0
接口的IP,无果。又找了几天,才发现文章开头说的这篇文章,再结合一些坑了我的 Linux 内核网络参数,发现原来CentOS
从6开始,就默认应用了严格的反向路由过滤策略,会过滤反向路由不是最佳路径的数据包(当然也过滤反向不通的数据包),即使这个数据包的反向路由也是通的。
问题解决
使用如下命令应用宽松的反向路由策略,允许反向路由不是最佳路径的数据包通过。反向不通的数据包仍然会被过滤。
sysctl -w net.ipv4.conf.all.rp_filter=2
如果需要重启自动应用,需要将上面的配置添加到/etc/sysctl.conf