先看现象。CentOS 7.9 双线机房,两个网卡分别接电信和联通,开了 net.ipv4.conf.all.rp_filter=1 之后,从联通进来的回包被内核丢掉,抓包能看到 SYN 到了但 SYN-ACK 发不出去。

这类报错背后常见的原因有几处,逐个排除就行。rp_filter 按路由表检查入包源地址,非对称路由下回包路径对不上。少数情况下是all 和 eth1 两级都生效,实际取的是两者里更严的那个。

另外,默认路由只指向电信,联通方向的流量查不到对应出口。

少数情况下是策略路由没配,内核不知道联通流量该从哪张网卡回去。

第一件事是看丢包计数和过滤级别

sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.eth1.rp_filter && nstat -az | grep -i 'IPReversePathFilter'

临时放宽成松散模式

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

补一条策略路由指定回包出口

ip rule add from 10.10.2.5 table 100 && ip route add default via 10.10.2.1 dev eth1 table 100

等前面都确认过,再验证双线连通性

ping -c 3 -I 10.10.2.5 202.96.128.86 && ip route get 202.96.128.86 from 10.10.2.5

改完先别撤,确认这几项。两个运营商的地址都能 ping 通,nstat 里 IPReversePathFilter 不再增长,业务回包正常发出。

这里还有个坑。松散模式只检查源地址是否可达,比严格模式适合多线;真正的解法是策略路由,直接关掉 rp_filter 等于放弃一层防护。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189