Linux多网卡路由应使用策略路由而非多默认网关:先为每网卡配置独立IP,再通过/etc/iproute2/rt_tables定义自定义路由表,用ip route添加各表路由、ip rule绑定源IP与表,最后持久化至systemd或Netplan。

Linux多网卡路由配置,核心不是“加多条默认网关”,而是让不同流量按需走指定路径。直接在main表里硬塞多个default路由会冲突,系统只认一条;真正可靠的方式是用策略路由(Policy Routing),基于源IP、目标地址等条件选择对应路由表。
先配好每块网卡的基础IP
确保每张网卡有独立、无重叠的IP和子网。例如:
- eth0(内网):192.168.1.100/24,网关192.168.1.1
- eth1(外网):10.0.0.100/24,网关10.0.0.1
临时配置用:ip addr add 192.168.1.100/24 dev eth0 && ip link set eth0 up;永久配置则写入对应发行版文件(如Ubuntu的/etc/netplan/*.yaml或CentOS的/etc/sysconfig/network-scripts/ifcfg-eth0)。
创建自定义路由表
编辑/etc/iproute2/rt_tables,追加两行(数字为优先级,越小越靠前):
200 table_intranet
201 table_internet
注意:不要改动已有的local、main、default三行。这个操作只需做一次,系统重启后仍保留。
为每个表添加路由规则
以eth0走内网、eth1走外网为例,执行以下命令:
- 清空并填充内网表:
ip route flush table table_intranet && ip route add 192.168.1.0/24 dev eth0 src 192.168.1.100 table table_intranet && ip route add default via 192.168.1.1 dev eth0 table table_intranet - 清空并填充外网表:
ip route flush table table_internet && ip route add 10.0.0.0/24 dev eth1 src 10.0.0.100 table table_internet && ip route add default via 10.0.0.1 dev eth1 table table_internet - 绑定源IP到对应表:
ip rule add from 192.168.1.100/32 table table_intranet && ip rule add from 10.0.0.100/32 table table_internet
这样,从192.168.1.100发出的包自动查table_intranet,从10.0.0.100发出的包查table_internet,互不干扰。
让配置开机生效
上述命令重启即失效,需持久化:
- 推荐方式:写入systemd服务或/etc/rc.local(记得加
sleep 5等网卡就绪延迟) - Netplan用户可在yaml中直接定义路由表与rule(v0.102+支持),比手动脚本更健壮
- 验证是否生效:
ip rule show看规则,ip route show table table_intranet查具体路由
策略路由不是“高级可选项”,而是多网卡场景下的标准解法。只要IP不冲突、路由表不漏、rule匹配准确,内外网分流自然稳定。











