必须用策略路由实现源出哪、回哪:先在/etc/iproute2/rt_tables添加自定义表(如100 tab_eth0、101 tab_eth1),再为每网卡配置直连+默认路由并指定src,用ip rule绑定源ip与表,最后关闭rp_filter并开启ip_forward。

在多网关环境下,Linux 默认只允许一个默认路由(main 表中),直接添加多个 default via 会互相覆盖,导致部分网卡流量无法发出,或响应包从错误接口返回,被反向路径过滤(rp_filter)丢弃。必须用策略路由——为每个源地址绑定专属路由表,实现“源出哪、回哪”的路径一致性。
注册自定义路由表
系统默认只有 local、main、default 三张表,需手动添加新表名:
- 编辑 /etc/iproute2/rt_tables,在末尾追加两行(ID 建议 ≥100,避免与系统保留值冲突):
100 tab_eth0101 tab_eth1 - 表名只能含字母、数字、下划线;不能有短横线、空格或特殊符号(如
tab-eth0无效) - 保存后无需重启,但已有命令不会自动识别新表名,后续所有
ip route和ip rule必须显式指定表名
为每张表配置完整路由
每张表必须包含两项基础路由:直连子网路由 + 默认网关路由。以 eth0(192.168.10.100/24,网关 192.168.10.1)和 eth1(10.0.20.100/24,网关 10.0.20.1)为例:
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
注意:src 参数明确指定该表出口时使用的源 IP,对多 IP 绑定同一网卡的场景尤其关键。
用 ip rule 绑定源地址与路由表
告诉内核:“来自这个源 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
验证是否生效:ip rule show 应看到这两条规则;ip route show table tab_eth0 应显示对应路由条目。
关闭反向路径过滤并启用转发
不关 rp_filter,策略路由流量大概率被丢弃;不开启 ip_forward,某些转发场景会失效:
- 临时关闭(测试用):
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_filter - 启用 IPv4 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:在 /etc/sysctl.conf 中添加
net.ipv4.conf.all.rp_filter = 0net.ipv4.ip_forward = 1,然后执行sysctl -p











