Linux多网卡需用策略路由:先定义自定义表(如100 tab_eth0)、为每卡配直连+默认路由、用ip rule绑定源IP与表、关闭rp_filter并开启ip_forward。

Linux 多网卡路由选路不能靠 route add default gw 简单叠加,默认只允许 main 表存在一个默认路由,后加的会覆盖前一个;更关键的是回程路径不匹配——请求从 eth1 进、响应却从 eth0 出,源 IP 和出口网卡不一致,容易被对方或本机 rp_filter 丢包,导致 SSH 卡死、ping 通但应用不通。
必须先定义自定义路由表
系统默认只有 local、main、default 三张表。新增表名需写入 /etc/iproute2/rt_tables,格式严格为“数字 空格 表名”,ID 建议 ≥100(避开系统保留值):
100 tab_eth0101 tab_eth1
表名不能含下划线以外的特殊字符(如 tab-eth0 无效,tab_eth0 可用)。保存后无需重启,但已有命令不会自动识别新表名,需重新执行规则和路由添加。
为每张网卡配置专属路由表
每张表必须包含两项核心路由:直连子网路由 + 默认网关路由。假设:
-
eth0:IP192.168.10.100/24,网关192.168.10.1 -
eth1:IP10.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
绑定源地址与路由表
用 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 开启,内核会检查回程路径是否与来路一致,策略路由下极易判定为非法而丢包。必须设为 0:
- 临时关闭(测试用):
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
不复杂但容易忽略



















