Linux不支持多个默认网关同时生效,因内核仅查main表且默认路由唯一;必须用策略路由:建自定义表(如100 telcom)、填对应默认路由、绑源IP规则(ip rule add from X table telcom),并持久化配置以防重启失效。

Linux 本身不支持“多个默认网关同时生效”这种直觉式配置——ip route add default via ... 第二次执行会报错 File exists,或静默覆盖前一条。真要让多条线路并存且按需路由,必须绕过“单一默认路由”的限制,用策略路由(policy routing)拆分流量路径。
为什么不能直接加两个 default 路由
内核路由子系统在查找出口时,只查 main 路由表,默认网关只能有一条。后续 ip route add default via ... 命令要么失败,要么把前一个踢掉——这不是 bug,是设计使然。强行写进配置文件(如 GATEWAY2=...)也不会被 systemd-networkd 或 NetworkManager 解析,纯属无效字段。
- 现象:
ip route show只显示一条default via ...,即使你执行了两次add default - 本质:路由决策发生在 packet 出口前,内核需要确定性路径,不能掷骰子选网关
- 替代思路:不争“默认”,而是定义“什么流量走哪条路”——靠源地址、目标地址、甚至应用层标记来分流
用 ip rule + 自定义路由表实现双网关
核心是三步:建表 → 填路由 → 绑定规则。所有操作都基于 iproute2,无需额外软件。
- 编辑
/etc/iproute2/rt_tables,末尾追加两行:100 telcom<br>200 unicom
(数字是表 ID,建议 100–249 避开系统保留值) - 为每个网卡配独立路由表:
sudo ip route add default via 192.168.1.1 dev eth0 src 192.168.1.100 table telcom<br>sudo ip route add default via 10.0.0.1 dev eth1 src 10.0.0.100 table unicom
- 绑定源 IP 到对应表:
sudo ip rule add from 192.168.1.100/32 table telcom<br>sudo ip rule add from 10.0.0.100/32 table unicom
- 验证:
ip rule show应看到两条规则;ip route show table telcom应含对应默认路由
永久生效必须处理重启丢失问题
上面命令全是内存态,重启就清空。不同发行版持久化方式不同,别硬套通用脚本。
- CentOS/RHEL 7+:
/etc/sysconfig/network-scripts/route-eth0和route-eth1文件里写路由语句(不带table关键字),但策略规则仍需额外处理——推荐写进/etc/rc.d/rc.local并确保它可执行 - Ubuntu 18.04+(Netplan):
netplan不支持策略路由,得改用networkd或放弃 Netplan,切回/etc/network/interfaces+post-up指令 - systemd 系统通用法:写个
.service单元,在network.target后启动,用ExecStart=/usr/bin/ip ...补全规则 - 关键检查点:重启后运行
ip rule list和ip route show table telcom,缺一不可
容易被忽略的连通性陷阱
配完能 ping 通不代表业务可用。真实场景下,反向路径(reply path)错位会导致连接超时或半开。
- 典型症状:从外网
ssh进服务器正常,但从服务器ssh出去卡住;curl返回 50% 超时 - 根因:请求走 eth0 出去,响应却尝试走 eth1 回来(因为返回包的源 IP 匹配不到规则)
- 解法:确保每条策略路由表里都有
127.0.0.0/8 dev lo和::1/128 dev lo,否则本地回环可能失效 - 进阶校验:用
tcpdump -i eth0 port 22和tcpdump -i eth1 port 22同时抓包,看双向流量是否落在同一接口


















