腾讯云 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。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
