回程路由不一致需用策略路由解决:1.注册自定义路由表;2.为每表配置直连与默认路由;3.用ip rule绑定源ip到对应表;4.关闭rp_filter并开启ip_forward。

回程路由不一致(即“非对称路由”)是 Linux 多网卡环境下的典型故障,表现为:请求从 eth1 进来,响应却从 eth0 出去,导致源 IP 与出口接口不匹配,被对方或本机反向路径过滤(rp_filter)丢包——现象是 ping 通但 SSH 卡死、HTTP 请求无响应、TCP 连接建立后立即中断。
必须用策略路由替代默认 route 命令
Linux 内核的 main 路由表只允许存在一条默认路由,后添加的会覆盖前一条。即使你手动加了多条子网路由,所有回程流量仍强制查 main 表,无法按源地址区分路径。因此:
- route add default gw 只适用于单网卡场景,多网卡下本质无效
- 必须启用 策略路由(Policy Routing):为每张网卡创建独立路由表 + 绑定源 IP 的规则
- 核心命令是
ip rule和ip route table xxx,不是route
配置四步闭环流程
以双网卡为例(eth0: 192.168.10.100/24, 网关 192.168.10.1;eth1: 10.0.20.100/24, 网关 10.0.20.1):
-
1. 注册自定义路由表名:编辑
/etc/iproute2/rt_tables,追加两行(ID ≥100,不能含短横线):100 tab_eth0101 tab_eth1 -
2. 为每张表填充直连 + 默认路由:
ip route add 192.168.10.0/24 dev eth0 src 192.168.10.100 table tab_eth0ip route add default via 192.168.10.1 dev eth0 table tab_eth0ip route add 10.0.20.0/24 dev eth1 src 10.0.20.100 table tab_eth1ip route add default via 10.0.20.1 dev eth1 table tab_eth1 -
3. 绑定源 IP 到对应路由表:
ip rule add from 192.168.10.100/32 table tab_eth0 priority 100ip rule add from 10.0.20.100/32 table tab_eth1 priority 101 -
4. 关闭 rp_filter 并开启转发:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filterecho 0 > /proc/sys/net/ipv4/conf/eth0/rp_filterecho 0 > /proc/sys/net/ipv4/conf/eth1/rp_filterecho 1 > /proc/sys/net/ipv4/ip_forward
验证与持久化要点
执行后立即验证:
- 运行
ip rule show确认两条from ... table规则已存在 - 运行
ip route show table tab_eth0和ip route show table tab_eth1检查各自路由条目是否完整 - 用
ping -I 192.168.10.100 www.example.com测试 eth0 出口路径是否生效 - 将上述所有命令写入网络服务启动脚本(如
/etc/network/if-up.d/或 systemd service),或在/etc/sysctl.conf中固化rp_filter = 0和ip_forward = 1
不复杂但容易忽略











