双网卡路由配置实践(内网走有线、外网走 WiFi)

银河麒麟系统双网卡路由配置实战:内网走有线、外网走 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/24172.16.10.254静态配置
wlp2s0WiFi192.168.100.50/24192.168.100.1DHCP

三、网络拓扑图

下面用 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) │
│                                                              │
└──────────────────────────────────────────────────────────────┘

关键操作:

  1. 有线网卡:配置为静态 IP,不设默认网关never-default: true),手动添加内网网段路由
  2. WiFi 网卡:DHCP 自动获取,作为默认路由出口,忽略来自 DHCP 的 DNS(避免污染内网 DNS)
  3. 路由优先级:内网路由 metric 设为 100(高优先级),WiFi 默认路由 metric 为 600(低优先级)

4.2 有线网络配置(enp1s0)

# 查看有线连接详情
nmcli connection show "有线连接 1"

关键配置项说明:

配置项说明
ipv4.methodmanual静态 IP 配置
ipv4.addresses172.16.10.100/24本机 IP 和子网掩码
ipv4.gateway不设置默认网关
ipv4.never-default禁止该连接成为默认路由
ipv4.dns172.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.methodautoDHCP 自动获取 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. 打开"开始菜单" → “设置” → “网络”,或右键点击任务栏网络图标 → “网络设置”
  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
  3. 配置 WiFi:选择 Company-WiFi,点击齿轮图标进入设置
    • IPv4 选项卡:方法保持"自动(DHCP)"
    • DNS 区域的"自动"开关关闭,手动填入有线侧配置的 DNS 服务器
  4. 点击"应用"保存,依次重启两个连接使其生效

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 发行版配置方法类似,可参考使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨鱼辣钊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值