多网卡回包走错的问题
实例挂多块网卡或配置多个私网 IP 后,Linux 默认只按主网卡的路由表出包:从辅助网卡进来的请求,回包可能从主网卡发出,对端收到源地址不匹配的响应后直接丢弃。这就是典型的「能收不能回」。解决办法是用策略路由按源地址选择路由表,让来自辅助网卡网段的流量从对应网卡发出。
基本信息
| 适用平台 | Linux(ip rule 与多路由表),常出现在挂多网卡的云主机上 |
|---|---|
| 原理 | 默认路由单一,用 ip rule 按源地址选择路由表 |
| 典型场景 | 多网卡、多私网 IP、辅助网卡承载业务流量 |
| 验证方法 | ip route get 目的地址 from 源地址 查看出口选择 |
| 持久化 | 规则重启后会丢失,需写入网络配置或初始化脚本 |
典型使用场景
- 辅助网卡承载业务流量,但回包从主网卡发出导致不通
- 实例同时接入多个网段,需要按源地址分流
- 高可用软件依赖特定网卡收发心跳与业务流量
- 迁移过渡期新旧网段并存,临时用策略路由保持可达
- 排查「从外部 ping 通但 TCP 建不起来」这类回包异常
按源地址分流
按源地址分流
# 假设辅助网卡 eth1 地址为 10.10.2.100/24,网关 10.10.2.1
sudo ip rule add from 10.10.2.100 table 100
sudo ip route add default via 10.10.2.1 dev eth1 table 100
# 验证出口选择
ip route get 10.10.3.10 from 10.10.2.100
# 查看已有规则与优先级
ip rule show
# 注意:重启后 ip rule 会丢失,需写入网络配置或启动脚本关键命令读法
| 命令 | 作用 | 读法 |
|---|---|---|
| ip rule show | 列出策略规则 | 数值小的先匹配 |
| ip route show table N | 查看指定路由表 | 确认默认路由指向正确网卡 |
| ip route get ... from ... | 模拟选路 | 显示实际使用的出口与源地址 |
| ip -br addr | 查看网卡与地址 | 确认辅助网卡地址已生效 |
策略路由规则不持久化,实例重启后会失效并复现故障,务必纳入初始化脚本或网络配置文件。
ip rule 的优先级数值越小越先匹配;自定义规则写在一个不合适的优先级上,会让整条规则形同虚设。