先给答案
Linux双网卡配置路由的核心思路是:先分清“默认路由”和“静态路由”的职责,再用metric值控制优先级,最后通过持久化配置让规则重启不丢。 一块网卡管外网,一块网卡管内网,两者各走各的,互不抢道,关键在于让系统知道“去哪个网段找哪块网卡”。
linux双网卡同时上网配置:先搞清路由怎么走
很多朋友在配置双网卡时,最容易犯的错是把两个网卡都设置了默认网关,结果就是系统懵了两个出口都写着“通往全球”,它不知道该把数据包交给谁,最终表现就是网络时通时不通,或者干脆全部瘫痪。
路由表的工作机制:一张表决定数据包去向
Linux系统的路由判断遵循“最长前缀匹配”原则,系统收到一个目标IP,会从路由表中找出最具体的路由条目来匹配,举个例子:
- 目标是
168.1.100,它既能匹配168.1.0/24这条路由,也能匹配0.0.0/0这条默认路由。 - 但系统会优先走
168.1.0/24,因为它的掩码更长,更精确。 - 只有当目标地址不在任何具体路由覆盖范围内时,才会走默认路由。
行业共识认为,理解这条规则是配置双网卡的基础,你的内网网段只要有一条具体的静态路由,系统就会乖乖走内网网卡;外网流量则全部交给默认路由对应的外网网卡。
看清现状:查看当前路由表的正确姿势
配置之前,一定要先查看当前网络状态,避免盲目操作,常用命令如下:
ip route show:查看IP层路由表,最常用,信息最全。route -n:查看内核路由表,显示格式偏传统。ip addr:确认网卡名称和IP地址状态。ip link set dev eth0 up:激活网卡,如果网卡处于down状态需要先拉起。
查看路由表时,重点关注default开头的条目,如果有两条default路由,说明默认网关冲突了这就是外网不通的元凶,记得用ip route del default via 旧网关 dev 对应网卡

删掉多余的那条。
linux双网卡路由优先级设置:metric值决定谁先上场
当服务器上存在多个默认网关时,metric值(路由度量值)就是唯一的裁判,metric值越小,路由优先级越高,默认情况下,Linux会为每个网卡分配一个metric值,具体数值和网卡接入顺序、网段类型有关。
手动调整metric的实操方法
假设服务器有两块网卡:ens33(外网,192.168.10.10)和ens44(内网,10.0.0.10),我们希望外网优先,内网作为备用出口。
# 查看当前metric值
ip route show
# 修改ens33默认路由的metric为100
sudo ip route replace default via 192.168.10.1 dev ens33 metric 100
# 修改ens44默认路由的metric为200
sudo ip route replace default via 10.0.0.1 dev ens44 metric 200
执行完成后,再查ip route show,你会看到两条default路由,但系统默认会选择metric小的那一条往外发包。
用nmcli调整metric的推荐方案
如果你的系统使用NetworkManager管理网络(CentOS/RHEL 7+默认就是),用nmcli调整更为稳妥:
- 修改连接配置:
nmcli connection modify "ens33" ipv4.route-metric 100 - 修改完成后重启网络:
nmcli connection up "ens33"
相比直接改内核路由,nmcli方式的好处是规则会永久写入配置文件,重启网卡后不会丢,多数情况下,建议优先使用nmcli工具而不是手工命令。
静态路由配置实战:让内网访问走指定网卡
双网卡最常见的需求是:服务器要同时上外网和访问公司内网,外网流量走上网卡,内网流量走办公网卡,此时需要给内网网段添加一条静态路由。
内网网段固定时的配置命令
假设内网网段是16.0.0/16,内网网关是0.0.1,内网网卡是ens44:
sudo ip route add 172.16.0.0/16 via 10.0.0.1 dev ens44
这条命令的含义是:凡是去往16.0.0/16这个网段的流量,一律交给

0.0.1,从ens44出去,其他流量不受影响,继续走默认路由。
解决静态路由重启丢失的问题
手动添加的路由在重启后会消失,必须写入配置文件,不同Linux发行版配置方式不同:
-
CentOS/RHEL 7/8:在
/etc/sysconfig/network-scripts/下找到内网网卡对应的配置文件(比如ifcfg-ens44),添加:GATEWAY=10.0.0.1然后在
/etc/sysconfig/static-routes文件中写入:any net 172.16.0.0 netmask 255.255.0.0 gw 10.0.0.1如果没有这个文件,就手动创建。
-
Ubuntu/Debian(netplan方式):编辑
/etc/netplan/目录下的.yaml文件,在对应网卡下添加:routes: - to: 172.16.0.0/16 via: 10.0.0.1然后执行
sudo netplan apply生效。 -
Ubuntu/Debian(传统ifupdown方式):在
/etc/network/interfaces中追加:up ip route add 172.16.0.0/16 via 10.0.0.1 dev ens44
持久化配置完成后,务必重启网络服务或重启机器验证一下效果,确保路由没有丢。
双网卡策略路由:让规则更精细、更灵活
静态路由解决的是“去固定网段走指定网卡”的问题,但有些场景更复杂比如从某一个网卡进来的请求,回包必须从同一块网卡出去,这就轮到策略路由出场了。
策略路由的核心概念:多张路由表协同
Linux的策略路由基于“路由规则”(routing rule)工作,系统可以有多张独立的路由表,每张表有自己的路由条目,数据包到达时,内核根据源地址、目标地址、入口网卡等条件,决定查哪张表。
创建自定义路由表的步骤
以“从内网口进来的流量强制从内网口出去”为例:
- 编辑
/etc/iproute2/rt_tables
,添加自定义表名:
200 inside_route - 往这张表里添加路由规则:
sudo ip route add default via 10.0.0.1 dev ens44 table inside_route - 添加路由规则,让从ens44进来的包查这张表:
sudo ip rule add from 10.0.0.10 lookup inside_route - 验证效果:
sudo ip rule show sudo ip route show table inside_route
策略路由在企业级环境中应用较多,机房服务器部署、多线接入的负载均衡等场景经常用到。
策略路由的常用ip rule参数
from 源IP:匹配特定源地址的流量。to 目标IP:匹配特定目标地址的流量。dev 网卡名:匹配从该网卡进入的流量。lookup 表名:指定要查询的规则表。
Linux双网卡配置路由常见问题解答
双网卡同时连接时,为什么内网ping得通但外网不通?
通常是默认路由被内网网关抢占,检查ip route show,如果only一条default指向内网网关,外网数据包自然送不出去,解决方案:手动添加外网默认路由,调整metric值让外网路由优先级更高,或删除内网网卡的默认路由,改为添加具体的内网静态路由。
CentOS和Ubuntu配置静态路由的命令有什么差异?
CentOS系列偏向用/etc/sysconfig/network-scripts/route-网卡名文件加ip route add命令;Ubuntu新版则用netplan的routes字段,老版本用/etc/network/interfaces,原理相同,但配置格式完全不同,运维多套系统时,先确认发行版版本再动手,避免改错文件导致网络失效。
配置完策略路由后,原来正常访问的外网突然不通了?
可能是策略路由的规则优先级过高,把外网流量也拦截了,用ip rule show查看规则顺序,检查是否有多余的from匹配语句,临时关闭规则可执行ip rule del from 原IP lookup 表名,恢复后再细化规则条件,比如指定更精确的源地址范围或增加网卡匹配条件。
