银河麒麟系统双网卡路由配置实战:内网走有线、外网走 WiFi
摘要:办公电脑同时连接内网有线和外网 WiFi 时,如果两个网卡都配了默认网关,会导致路由冲突、网络异常。本文以银河麒麟桌面操作系统 V10 SP1 为例,详细介绍如何通过配置静态路由实现"内网网段走有线、其余走 WiFi"的双网卡分流方案,涵盖路由表解析、最长前缀匹配原理、DNS 策略、完整配置命令及常见问题排查。
一、需求背景
在实际工作中,经常会遇到这样的场景:办公电脑同时连接了内网有线网络和外网 WiFi。内网有线可以访问公司内部服务器、代码仓库、数据库等资源,而 WiFi 用于访问互联网。但如果两个网络都启用了默认网关,操作系统就会面临"该从哪个网卡出去"的困惑,导致网络访问异常。
本文以银河麒麟桌面操作系统 V10 SP1 为例,详细记录如何通过配置静态路由,实现"内网网段走有线、其它网段走 WiFi"的双网卡分流方案。
二、环境概览
| 项目 | 详情 |
|---|---|
| 操作系统 | 银河麒麟桌面操作系统 V10 SP1 (Kylin Linux Desktop) |
| 内核版本 | 5.4.18-167-generic |
| 架构 | x86_64 |
| 网络管理 | NetworkManager |
| 有线网卡 | enp1s0 (MAC: 00:11:22:33:44:01) |
| 无线网卡 | wlp2s0 (MAC: 00:11:22:33:44:02) |
网卡 IP 地址一览
| 网卡 | 类型 | IP 地址 | 子网 | 网关 | 获取方式 |
|---|---|---|---|---|---|
| enp1s0 | 有线 | 172.16.10.100 | /24 | 172.16.10.254 | 静态配置 |
| wlp2s0 | WiFi | 192.168.100.50 | /24 | 192.168.100.1 | DHCP |
三、网络拓扑图
下面用 ASCII 拓扑图展示整体网络结构:
┌─────────────────────────────────┐
│ 互联网 (Internet) │
└───────────────┬─────────────────┘
│
┌───────┴───────┐
│ 无线路由器 │
│ 192.168.100.1 │
│ (WiFi AP) │
└───────┬───────┘
│ WiFi (SSID: Company-WiFi)
┌───────────────┴──────────────────┐
│ wlp2s0 (WiFi) │
│ 192.168.100.50/24 │
│ 网关: 192.168.100.1 │
│ 默认路由出口 (metric 600) │
│ │
│ ┌─────────────────────────┐ │
│ │ 本机 (mypc) │ │
│ │ 银河麒麟 V10 SP1 │ │
│ │ ┌───────────────────┐ │ │
│ │ │ 路由决策表 │ │ │
│ │ │ ┌───────────────┐ │ │ │
│ │ │ │ 匹配内网网段? │ │ │ │
│ │ │ │ → 走有线 │ │ │ │
│ │ │ │ 其余 │ │ │ │
│ │ │ │ → 走 WiFi │ │ │ │
│ │ │ └───────────────┘ │ │ │
│ │ └───────────────────┘ │ │
│ └─────────────────────────┘ │
│ │
│ enp1s0 (有线) │
│ 172.16.10.100/24 │
│ 网关: 172.16.10.254 │
│ 内网路由出口 (metric 100) │
└───────────────┬──────────────────┘
│ 有线以太网
┌───────┴───────┐
│ 内网交换机 │
│ 172.16.10.254 │
└───────┬───────┘
│
┌─────────────────────────────┼─────────────────────────────┐
│ │ │
┌───────┴───────┐ ┌───────┴───────┐ ┌───────┴───────┐
│ 内网服务器 │ │ GitLab 仓库 │ │ 数据库集群 │
│ 10.0.0.0/8 │ │ 192.168.1.0/24│ │ 172.16.0.0/16 │
└───────────────┘ └───────────────┘ └───────────────┘
四、配置详解
4.1 思路分析
要实现双网卡分流,核心思路是:
┌──────────────────────────────────────────────────────────────┐
│ 路由决策流程 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 数据包目标 IP ──► 查路由表 ──┬── 匹配内网网段 ──► 走有线 │
│ │ │
│ └── 不匹配 ──► 走默认路由(WiFi) │
│ │
└──────────────────────────────────────────────────────────────┘
关键操作:
- 有线网卡:配置为静态 IP,不设默认网关(
never-default: true),手动添加内网网段路由 - WiFi 网卡:DHCP 自动获取,作为默认路由出口,忽略来自 DHCP 的 DNS(避免污染内网 DNS)
- 路由优先级:内网路由 metric 设为 100(高优先级),WiFi 默认路由 metric 为 600(低优先级)
4.2 有线网络配置(enp1s0)
# 查看有线连接详情
nmcli connection show "有线连接 1"
关键配置项说明:
| 配置项 | 值 | 说明 |
|---|---|---|
| ipv4.method | manual | 静态 IP 配置 |
| ipv4.addresses | 172.16.10.100/24 | 本机 IP 和子网掩码 |
| ipv4.gateway | – | 不设置默认网关 |
| ipv4.never-default | 是 | 禁止该连接成为默认路由 |
| ipv4.dns | 172.16.10.1, 8.8.8.8, 223.5.5.5 | 内网 DNS 为主,外网 DNS 备用 |
手动添加的内网路由规则:
# 以下命令通过 nmcli 或 ip route 添加
# 格式: 目标网段 via 下一跳网关 dev 网卡
ip route add 10.0.0.0/8 via 172.16.10.254 dev enp1s0 metric 100
ip route add 172.16.0.0/16 via 172.16.10.254 dev enp1s0 metric 100
ip route add 192.168.200.1/32 via 172.16.10.254 dev enp1s0 metric 100
ip route add 192.168.1.0/24 via 172.16.10.254 dev enp1s0 metric 100
ip route add 192.168.2.0/24 via 172.16.10.254 dev enp1s0 metric 100
ip route add 172.16.100.0/24 via 172.16.10.254 dev enp1s0 metric 100
在 NetworkManager 中,这些路由保存在连接配置里:
ipv4.routes:
{ ip = 10.0.0.0/8, nh = 172.16.10.254 }
{ ip = 172.16.0.0/16, nh = 172.16.10.254 }
{ ip = 192.168.200.1/32, nh = 172.16.10.254 }
{ ip = 192.168.1.0/24, nh = 172.16.10.254 }
{ ip = 192.168.2.0/24, nh = 172.16.10.254 }
{ ip = 172.16.100.0/24, nh = 172.16.10.254 }
4.3 WiFi 无线网络配置(wlp2s0)
# 查看 WiFi 连接详情
nmcli connection show "Company-WiFi"
关键配置项说明:
| 配置项 | 值 | 说明 |
|---|---|---|
| ipv4.method | auto | DHCP 自动获取 IP |
| ipv4.ignore-auto-dns | 是 | 忽略 DHCP 下发的 DNS,防止覆盖有线 DNS |
| ipv4.never-default | 否 | 允许作为默认路由 |
| 默认路由 | 0.0.0.0/0 via 192.168.100.1 metric 600 | 外网出口 |
4.4 为什么不设两个默认网关
如果两个网卡都配置了默认网关,路由表会变成:
default via 192.168.100.1 dev wlp2s0 metric 100 ← WiFi 默认路由
default via 172.16.10.254 dev enp1s0 metric 100 ← 有线默认路由
此时系统会通过路由度量值(metric) 来决定选哪条路。如果 metric 相同,则行为不可预测——可能一会儿走有线、一会儿走 WiFi,导致:
- 访问内网资源时,包可能走 WiFi 默认路由直接丢弃
- 访问外网时,包可能走有线默认路由而被内网防火墙拦截
因此,正确做法是只保留一个默认路由(WiFi),然后为内网网段添加精确路由。
五、路由表解析
最终生效的路由表如下:
目的网段 下一跳网关 网卡 Metric 类型
──────────────────────────────────────────────────────────────────
0.0.0.0/0 192.168.100.1 wlp2s0 600 DHCP 默认路由
192.168.200.1/32 172.16.10.254 enp1s0 100 静态路由
10.0.0.0/8 172.16.10.254 enp1s0 100 静态路由
172.16.100.0/24 172.16.10.254 enp1s0 100 静态路由
169.254.0.0/16 (本地链路) enp1s0 1000 内核
172.16.0.0/16 172.16.10.254 enp1s0 100 静态路由
172.16.10.0/24 (本地直连) enp1s0 100 内核
192.168.100.0/24 (本地直连) wlp2s0 600 内核
192.168.2.0/24 172.16.10.254 enp1s0 100 静态路由
192.168.1.0/24 172.16.10.254 enp1s0 100 静态路由
路由匹配逻辑
Linux 内核使用最长前缀匹配(Longest Prefix Match) 算法查找路由:
┌─────────────────────────────────────────────────────────────────┐
│ 路由匹配决策树 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 数据包到达 │ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ 目标 IP 在路由表中? │ │
│ └─────────┬───────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ │ │
│ 匹配多条 不匹配 │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────┐ ┌──────────────┐ │
│ │选前缀最长的│ │走默认路由(WiFi)│ │
│ └────┬────┘ └──────────────┘ │
│ │ │
│ ┌────┴────────────────────────────────────┐ │
│ │ 示例: │ │
│ │ │ │
│ │ 访问 172.16.10.200 (内网服务器) │ │
│ │ → 匹配 172.16.0.0/16 (掩码 16位) │ │
│ │ → 也匹配 172.16.10.0/24 (掩码 24位) │ │
│ │ → 选 /24,走 enp1s0 直连 │ │
│ │ │ │
│ │ 访问 10.0.1.50 (内网服务器) │ │
│ │ → 匹配 10.0.0.0/8 (掩码 8位) │ │
│ │ → 走 enp1s0 via 172.16.10.254 │ │
│ │ │ │
│ │ 访问 www.baidu.com (外网) │ │
│ │ → 不匹配任何内网路由 │ │
│ │ → 走默认路由 0.0.0.0/0 via WiFi │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
六、DNS 配置策略
6.1 配置方案
| 网卡 | DNS 来源 | DNS 服务器 |
|---|---|---|
| 有线 (enp1s0) | 静态配置 | 172.16.10.1 (内网), 8.8.8.8, 223.5.5.5 |
| WiFi (wlp2s0) | DHCP → 忽略 | 114.114.114.114 (被忽略) |
WiFi 网卡设置了 ignore-auto-dns: true,意味着 DHCP 下发的 DNS 不会写入系统。最终 /etc/resolv.conf 中生效的是有线配置的 DNS:
nameserver 172.16.10.1 ← 内网 DNS,可解析内网域名
nameserver 8.8.8.8 ← Google DNS 备用
nameserver 223.5.5.5 ← 阿里 DNS 备用
6.2 为什么忽略 WiFi 的 DNS
┌──────────────────────────────────────────────────────┐
│ WiFi DHCP 下发的 DNS 无法解析内网域名,覆盖有线 DNS │
│ │
│ 如果 WiFi DNS 覆盖了有线 DNS: │
│ │
│ 访问 gitlab.company.internal │
│ → 查询 114.114.114.114 │
│ → 114 DNS 返回 NXDOMAIN (域名不存在) │
│ → 无法访问内网服务 ❌ │
│ │
│ 正确做法: │
│ 访问 gitlab.company.internal │
│ → 查询 172.16.10.1 (内网 DNS) │
│ → 返回内网 IP 192.168.1.x │
│ → 数据包匹配 192.168.1.0/24 路由,走有线 │
│ → 成功访问内网服务 ✅ │
└──────────────────────────────────────────────────────┘
七、数据包流转路径图
以下用两个场景展示数据包的实际流转路径:
场景一:访问内网服务器 (10.0.0.100)
┌──────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 应用程序 │────►│ 路由表查找 │────►│ enp1s0 (有线) │
│ 访问内网 │ │ 10.0.0.0/8 匹配! │ │ 172.16.10.100 │
│ 10.0.0.100│ │ → 172.16.10.254 │ │ │
└──────────┘ └──────────────────┘ └────────┬─────────┘
│
▼
┌──────────────────┐
│ 内网交换机 │
│ 172.16.10.254 │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ 内网服务器 │
│ 10.0.0.100 │
└──────────────────┘
场景二:访问外网 (www.baidu.com)
┌──────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 应用程序 │────►│ 路由表查找 │────►│ wlp2s0 (WiFi) │
│ 访问百度 │ │ 无匹配 → 默认路由 │ │ 192.168.100.50 │
│ │ │ 0.0.0.0/0 │ │ │
└──────────┘ └──────────────────┘ └────────┬─────────┘
│
▼
┌──────────────────┐
│ 无线路由器 │
│ 192.168.100.1 │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ 互联网 │
│ www.baidu.com │
└──────────────────┘
八、配置方法
8.1 通过 nmcli 命令行配置
# 步骤1: 修改有线连接,设置静态 IP 并禁止默认路由
nmcli connection modify "有线连接 1" \
ipv4.method manual \
ipv4.addresses "172.16.10.100/24" \
ipv4.never-default yes \
ipv4.dns "172.16.10.1 8.8.8.8 223.5.5.5"
# 步骤2: 清空旧路由并添加内网路由(metric 100 确保高优先级)
nmcli connection modify "有线连接 1" \
ipv4.routes "" \
+ipv4.routes "10.0.0.0/8 172.16.10.254 100" \
+ipv4.routes "172.16.0.0/16 172.16.10.254 100" \
+ipv4.routes "172.16.100.0/24 172.16.10.254 100" \
+ipv4.routes "192.168.1.0/24 172.16.10.254 100" \
+ipv4.routes "192.168.2.0/24 172.16.10.254 100" \
+ipv4.routes "192.168.200.1/32 172.16.10.254 100"
# 步骤3: 修改 WiFi 连接,忽略 DHCP DNS
nmcli connection modify "Company-WiFi" \
ipv4.ignore-auto-dns yes
# 步骤4: 重新激活连接(先 down 两个再 up,避免路由冲突)
nmcli connection down "有线连接 1"
nmcli connection down "Company-WiFi"
nmcli connection up "有线连接 1"
nmcli connection up "Company-WiFi"
8.2 通过图形界面配置
银河麒麟系统提供了图形化的网络配置界面,操作路径如下:
- 打开"开始菜单" → “设置” → “网络”,或右键点击任务栏网络图标 → “网络设置”
- 配置有线网卡:选择"有线连接 1",点击齿轮图标进入设置
- IPv4 选项卡:方法选择"手动"
- 地址栏填入
172.16.10.100,子网掩码255.255.255.0 - 网关留空(重要!)
- 勾选"仅将此连接用于其网络上的资源"(等同于
never-default=true) - 在"路由"区域点击"+",逐条添加内网网段路由(目标网络、子网掩码、下一跳
172.16.10.254、Metric 填100) - DNS 填入
172.16.10.1, 8.8.8.8, 223.5.5.5
- 配置 WiFi:选择
Company-WiFi,点击齿轮图标进入设置- IPv4 选项卡:方法保持"自动(DHCP)"
- DNS 区域的"自动"开关关闭,手动填入有线侧配置的 DNS 服务器
- 点击"应用"保存,依次重启两个连接使其生效
8.3 通过 ip route 命令临时添加
# 临时添加路由(重启后失效)
ip route add 10.0.0.0/8 via 172.16.10.254 dev enp1s0 metric 100
ip route add 172.16.0.0/16 via 172.16.10.254 dev enp1s0 metric 100
# 删除路由
ip route del 10.0.0.0/8 via 172.16.10.254 dev enp1s0
# 或者
ip route del 10.0.0.0/8
九、验证方法
9.1 查看当前路由表
ip route show table main
预期输出中应包含:
- 内网网段路由 via enp1s0(metric 100)
- 默认路由 via wlp2s0(metric 600)
9.2 测试路由走向
使用 ip route get 命令可以模拟内核路由查找过程,告诉你访问某个 IP 会走哪张网卡、用哪个源地址:
# 查看访问内网 IP 走哪条路由
ip route get 10.0.0.100
# 预期: 10.0.0.100 via 172.16.10.254 dev enp1s0 src 172.16.10.100
# 查看访问外网 IP 走哪条路由
ip route get 8.8.8.8
# 预期: 8.8.8.8 via 192.168.100.1 dev wlp2s0 src 192.168.100.50
9.3 连通性测试
# 测试内网连通性
ping -c 4 10.0.0.100 # 内网服务器
ping -c 4 172.16.10.254 # 内网网关
# 测试外网连通性
ping -c 4 www.baidu.com # 外网
# 测试 DNS 解析(nslookup 未安装时可用 dig 或 host 代替)
nslookup gitlab.internal # 内网域名(需要内网 DNS 能解析)
nslookup www.baidu.com # 外网域名
# 或
dig gitlab.internal
host www.baidu.com
9.4 追踪路由路径
# 查看内网访问的完整路径(traceroute 未安装时可用 mtr 或 tracepath 代替)
traceroute 10.0.0.100
# 查看外网访问的完整路径
traceroute www.baidu.com
十、常见问题排查
问题 1:内网不通,外网正常
原因:内网路由未生效或网关不通
排查:
# 检查路由是否存在
ip route show | grep 10.0.0.0
# 检查能否 ping 通内网网关
ping 172.16.10.254
问题 2:外网不通,内网正常
原因:有线网卡抢占了默认路由,或 WiFi 默认路由未生效
排查:
# 检查默认路由
ip route show | grep default
# 确认有线连接 never-default 是否生效
nmcli connection show "有线连接 1" | grep never-default
问题 3:内网域名无法解析
原因:WiFi 的 DNS 覆盖了内网 DNS
排查:
# 检查当前 DNS 配置
cat /etc/resolv.conf
# 确认 WiFi 连接 ignore-auto-dns 是否生效
nmcli connection show "Company-WiFi" | grep ignore-auto-dns
问题 4:路由重启后丢失
原因:使用 ip route add 添加的路由是临时的
解决:通过 nmcli connection modify 将路由持久化到 NetworkManager 连接配置中
问题 5:手动编辑 /etc/resolv.conf 被覆盖
原因:银河麒麟 V10 使用 systemd-resolved 管理 DNS,/etc/resolv.conf 是动态生成的符号链接
解决:不要直接编辑 /etc/resolv.conf,而是通过 NetworkManager 连接配置来设置 DNS:
nmcli connection modify "有线连接 1" ipv4.dns "172.16.10.1 8.8.8.8"
nmcli connection up "有线连接 1"
十一、进阶技巧
11.1 保留备份连接配置
在实际生产中,建议保留一个"纯有线"的备份连接配置(仅设置静态 IP 和默认网关,不添加任何自定义路由),当分流配置出现问题时,可以快速切换到备份连接恢复网络:
# 创建备份连接(分流配置出问题时,切换到此连接恢复网络)
nmcli connection add \
type ethernet \
con-name "纯有线-备份" \
ifname enp1s0 \
ipv4.method manual \
ipv4.addresses "172.16.10.100/24" \
ipv4.gateway "172.16.10.254" \
ipv4.dns "172.16.10.1"
# 切换回备份连接
nmcli connection up "纯有线-备份"
11.2 批量管理路由规则
当内网网段较多时,建议将路由规则写成脚本批量添加:
#!/bin/bash
# add_internal_routes.sh - 批量添加内网路由
CONN="有线连接 1"
GATEWAY="172.16.10.254"
ROUTES=(
"10.0.0.0/8"
"172.16.0.0/16"
"192.168.1.0/24"
"192.168.2.0/24"
"172.16.100.0/24"
"192.168.200.1/32"
)
for route in "${ROUTES[@]}"; do
nmcli connection modify "$CONN" +ipv4.routes "$route $GATEWAY 100"
echo "已添加路由: $route -> $GATEWAY"
done
nmcli connection up "$CONN"
echo "路由配置完成!"
十二、总结
本文详细记录了在银河麒麟 V10 系统上实现双网卡路由分流的全过程,核心要点总结如下:
┌────────────────────────────────────────────────────────────┐
│ 双网卡分流配置要点 │
├────────────────────────────────────────────────────────────┤
│ │
│ 1. 有线网卡:静态 IP + never-default=true + 内网静态路由 │
│ └─ 不参与默认路由竞争 │
│ │
│ 2. WiFi 网卡:DHCP 自动获取 + 作为默认路由出口 │
│ └─ ignore-auto-dns=true 避免 DNS 污染 │
│ │
│ 3. 路由策略:最长前缀匹配 │
│ └─ 内网 IP → 匹配精确路由 → 走有线 │
│ └─ 外网 IP → 未匹配 → 走默认路由 → 走 WiFi │
│ │
│ 4. DNS 策略:以内网 DNS 为主,外网 DNS 备用 │
│ └─ 确保内网域名可解析 │
│ │
└────────────────────────────────────────────────────────────┘
这种方案的优势在于:
- 配置简单:无需复杂的策略路由(policy routing),仅靠静态路由即可实现
- 维护方便:新增内网网段只需添加一条路由规则
- 稳定性高:路由规则由 NetworkManager 管理,重启不掉
- 适用性广:适用于所有 Linux 发行版,不限于银河麒麟
本文基于银河麒麟 V10 SP1 + NetworkManager 环境编写,其他 Linux 发行版配置方法类似,可参考使用。
1万+

被折叠的 条评论
为什么被折叠?



