腾讯云 CVM 上 Ubuntu 22.04,双网卡分别接 10.0.1.0/24 和 10.0.2.0/24,手工加了 ip route 之后 10.0.2.0 网段整段不通,连 10.0.2.15 自己都 ping 不通。

一开始怀疑是「加路由时漏了 src 参数,源地址被选成 eth0 的地址」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。掩码写成 24 而实际子网是 25,网关落在了错误的广播域里。另一种情况是两条路由 metric 相同,内核按先加的先选用,回包走了另一张网卡。

不容易想到的是,rp_filter 把从 eth1 进来却带 eth0 源地址的回包丢了。

先看路由表和实际生效的掩码

ip route show && ip -4 addr show

接着按实际网段补一条带 src 的路由

ip route add 10.0.2.0/24 dev eth1 src 10.0.2.5 metric 100

再往下确认反向路径过滤的状态

sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.eth1.rp_filter

持久化之前先测连通性

ping -c 3 -I 10.0.2.5 10.0.2.15 && ip route get 10.0.2.15

改完先别撤,确认这几项。ping 10.0.2.15 有回包,ip route get 显示的出口和源地址都正确,两个网段互访恢复正常。

容易忽略的是,多网卡机器加路由一定要带 src,源地址不对的回包会被对端直接丢掉;先用 ip route 临时验证,确认无误再写进 netplan。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189