先看现象。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 等于放弃一层防护。这类问题最好一次改到位,反复小改反而容易把原因搅混。
