UOS/Deepin双网卡策略路由配置:实现内外网同时访问

📅 2026/8/15 10:06:57
UOS/Deepin双网卡策略路由配置:实现内外网同时访问
1. 项目概述与核心需求解析在UOSDeepin这类基于Linux的国产操作系统上配置双网卡同时上网听起来像是个简单的网络设置但背后其实涉及路由策略、网关优先级、源地址选择等一系列网络底层知识。很多朋友尤其是从Windows环境迁移过来的用户常常会遇到一个尴尬的局面明明插了两根网线一个连内网、一个连外网结果要么是外网不通要么是内网访问不了系统似乎“傻傻地”只认一条路。这其实不是系统傻而是我们没有告诉它更精细的“交通规则”。我自己在部署开发测试环境、搭建内外网隔离的工作站时就反复折腾过这个问题。核心需求非常明确让两张网卡各司其职访问不同目标网络的流量自动从正确的网卡出去互不干扰且能同时保持连接。比如有线网卡1eth0连接公司内网网关是192.168.1.1用于访问内部服务器和资源有线网卡2eth1或无线网卡wlan0连接互联网网关是192.168.31.1用于浏览网页、下载更新。理想状态是访问10.0.0.0/8这类内网地址时流量走eth0访问其他所有地址默认路由时流量走eth1/wlan0。UOSDeepin提供了图形化网络管理工具对于简单场景如双网卡接入同一网络可能够用但对于这种需要策略路由的复杂场景图形界面往往力不从心最终还是要靠命令行和配置文件来精准控制。接下来我将从原理到实操完整拆解在UOS上实现这一目标的步骤、踩过的坑以及确保稳定性的技巧。2. 网络基础原理与方案选型在动手之前我们必须搞清楚Linux系统处理多网卡、多网关的基本逻辑否则配置就是盲人摸象。2.1 默认路由的“唯一性”与冲突Linux内核维护着一张路由表通常指主路由表main用于决定数据包从哪个网卡发出。当系统存在多个网关时默认路由0.0.0.0/0只能有一条生效。后配置的默认路由会覆盖先前的或者系统会根据某种度量值如metric来选择一条。这就是为什么当你为两张网卡都配置了网关并启用后经常只有一张网卡能通外网另一张则“失灵”了。系统并非不能处理多个网关而是我们需要更明确的指示。2.2 策略路由为流量指定专属通道解决上述冲突的关键是策略路由。它允许我们定义多张路由表并根据数据包的源地址、目的地址、协议类型等条件决定使用哪张路由表来查询出口。对于我们“双网卡各走各路”的场景最常用且有效的方法是“基于源地址的策略路由”。其核心思想是创建两张自定义路由表例如table_eth0和table_eth1。在每个路由表内设置各自的路由规则。在table_eth0里添加到达内网网段的路由并设置其默认网关为内网网关在table_eth1里设置默认网关为外网网关。建立路由策略规则规定“来自eth0网卡IP的流量查询table_eth0”“来自eth1网卡IP的流量查询table_eth1”。设置主路由表主路由表main通常只保留直连网络和本地路由不设置默认网关或者设置一个兜底的默认网关通常指向外网。这样当系统要发送一个数据包时会先匹配策略规则。例如一个从内网服务器192.168.1.100返回的数据包到达eth0源地址是内网IP策略规则会指示系统去查table_eth0从而确保回复流量也走eth0出去形成一个完整的回路。2.3 方案对比NetworkManager vs systemd-networkd vs 手动配置UOSDeepin默认使用NetworkManager来管理网络它提供了图形界面和nmcli命令行工具。此外底层还有传统的systemd-networkd和netplan某些版本等方案。NetworkManager图形界面适合简单双网卡如DHCP获取IP但对于复杂的策略路由支持有限高级配置仍需命令行。nmcli命令行功能强大可以配置连接connection、设备device并支持通过ipv4.routing-rules参数设置简单的策略路由是推荐的主要配置方式因为它与系统图形界面集成较好配置相对持久。手动编辑/etc/network/interfaces与ip rule/route命令最传统、最直接的方式通过脚本实现灵活性最高但需要自行处理持久化对新手不友好。systemd-networkd更底层、更轻量的方案通过.network文件配置同样支持策略路由但需要禁用NetworkManager可能影响桌面环境的网络小程序。我们的选型为了兼顾易用性、持久化和与UOS桌面环境的兼容性本方案将以nmcli命令行为主辅以必要的ip命令进行验证和调试。这样配置可以通过NetworkManager持久化重启后依然有效且图形界面能正常显示连接状态。3. 环境准备与网卡信息确认开始配置前请确保你拥有系统的管理员权限sudo。3.1 识别物理网卡与连接名称首先我们需要知道系统识别到的网卡设备名以及NetworkManager为它们创建的连接名称。# 查看所有网络设备及其状态 nmcli device status你会看到类似下面的输出DEVICE TYPE STATE CONNECTION eth0 ethernet 已连接 Wired connection 1 eth1 ethernet 已连接 Wired connection 2 wlan0 wifi 已断开 --这里eth0和eth1是物理设备名Wired connection 1和Wired connection 2是NetworkManager为它们自动创建的连接名称。我们后续操作主要针对这些“连接”。注意连接名称CONNECTION是可以修改的更具描述性的标识建议在配置前将其改为容易记忆的名字例如company-lan和internet-wan避免混淆。可以使用nmcli con mod “旧名称” connection.id “新名称”来修改。3.2 记录关键网络参数你需要为每张网卡规划或记录下以下信息内网网卡例如eth0静态IP地址如192.168.1.100/24网关如192.168.1.1DNS服务器内网DNS如192.168.1.1或公司指定的DNS。需要访问的内网网段如10.0.0.0/8,172.16.0.0/12等。外网网卡例如eth1或wlan0获取IP方式通常为DHCP但如果需要静态IP也要记录。网关由路由器分配如192.168.31.1。DNS服务器外网DNS如114.114.114.114,8.8.8.8。实操心得强烈建议在内网使用静态IP避免DHCP租约变化导致路由策略失效。外网卡用DHCP通常没问题但如果你知道网关地址在配置策略路由时会用到。4. 核心配置步骤详解我们将分步配置每一步都解释其作用。请根据你的实际网卡名称和IP信息进行替换。4.1 配置内网网卡eth0的连接假设内网网卡设备是eth0其NetworkManager连接名称我们改为company-lan。# 1. 修改连接名称可选但推荐 sudo nmcli con mod “Wired connection 1” connection.id company-lan # 2. 配置静态IP地址、网关和DNS sudo nmcli con mod company-lan ipv4.addresses 192.168.1.100/24 sudo nmcli con mod company-lan ipv4.gateway 192.168.1.1 sudo nmcli con mod company-lan ipv4.dns “192.168.1.1” sudo nmcli con mod company-lan ipv4.method manual # 设置为手动静态IP # 3. **关键步骤禁止此连接添加默认路由** # 这是避免双默认路由冲突的核心操作。我们只为内网网段配置路由。 sudo nmcli con mod company-lan ipv4.never-default yes # 4. 重新启用连接以应用更改 sudo nmcli con down company-lan sudo nmcli con up company-lan参数解释ipv4.addresses: 设置静态IP和子网掩码CIDR格式。ipv4.method manual: 指定为手动配置而非DHCP。ipv4.never-default yes: 这个参数至关重要它告诉NetworkManager“不要为这个连接在系统主路由表里添加默认路由0.0.0.0/0”。这样192.168.1.1这个网关就不会成为全局默认网关避免了与另一张网卡的网关冲突。4.2 配置外网网卡eth1的连接假设外网网卡设备是eth1连接名称改为internet-wan。我们假设它通过DHCP获取IP并且我们希望它提供默认路由。# 1. 修改连接名称 sudo nmcli con mod “Wired connection 2” connection.id internet-wan # 2. 配置为DHCP自动获取并允许其设置默认路由和DNS sudo nmcli con mod internet-wan ipv4.method auto # 3. **关键步骤确保此连接可以添加默认路由**默认就是允许的这里显式确认 sudo nmcli con mod internet-wan ipv4.never-default no # 4. 重新启用连接 sudo nmcli con down internet-wan sudo nmcli con up internet-wan执行后使用ip route show命令你应该能看到主路由表main里有一条默认路由指向eth1获取到的网关例如default via 192.168.31.1 dev eth1。而eth0的路由表里只有直连网络路由192.168.1.0/24 dev eth0和本地路由没有默认路由。4.3 为内网网卡添加策略路由现在我们需要为内网流量创建独立的路由表和策略规则。这需要用到nmcli设置路由规则参数。# 1. 为内网连接company-lan添加一条静态路由指向内网网段网关为内网网关。 # 假设你需要访问 10.0.0.0/8 这个大型内网。 sudo nmcli con mod company-lan ipv4.routes “10.0.0.0/8 192.168.1.1” # 2. **核心添加基于源地址的策略路由规则** # 规则含义来自源地址 192.168.1.100 的流量使用路由表编号 100一个自定义表进行查询。 sudo nmcli con mod company-lan ipv4.routing-rules “from 192.168.1.100 table 100” # 3. 在上一步指定的路由表100中添加默认路由指向内网网关和直连路由。 # 首先添加直连网络路由必须否则本地通信有问题。 sudo nmcli con mod company-lan ipv4.routes “192.168.1.0/24 table 100” # 然后添加默认路由。注意这个默认路由只在table 100中生效不影响主路由表。 # **这是一个关键技巧在策略路由表里设置一个指向内网网关的默认路由可以处理所有未明确指向外网的流量。** sudo nmcli con mod company-lan ipv4.routes “0.0.0.0/0 192.168.1.1 table 100” # 4. 重新启用内网连接使所有路由和规则生效 sudo nmcli con down company-lan sudo nmcli con up company-lan原理解读ipv4.routes为连接添加一条静态路由。号表示追加而不是覆盖。ipv4.routing-rules添加一条IPv4路由策略规则。from 192.168.1.100 table 100是一条非常强大的规则。它创建了一个优先级很高的规则优先级数字默认较小意味着优先匹配所有源IP是192.168.1.100的数据包即从本机eth0网卡发出的数据包其出口路由将查询名为100的路由表。我们在表100中放入了两条路由一条是到192.168.1.0/24的直连路由保证同网段通信另一条是默认路由0.0.0.0/0但网关指向了内网网关192.168.1.1。这意味着对于匹配了策略规则源IP是内网IP的流量如果目的IP不在192.168.1.0/24网段它就会尝试走内网网关出去。这通常用于访问公司其他内网网段如10.x.x.x而这些网段的路由需要在内网网关192.168.1.1上配置。4.4 验证与测试配置配置完成后必须进行全面的验证。# 1. 查看所有网络接口的IP地址 ip addr show # 2. 查看主路由表 ip route show # 应该看到外网网关如 192.168.31.1作为默认路由以及 eth0 的直连路由。 # 3. 查看所有路由策略规则 ip rule list # 你应该能看到类似这样的规则优先级可能不同 # 0: from all lookup local # 32765: from 192.168.1.100 lookup 100 # 32766: from all lookup main # 32767: from all lookup default # 这表示源IP为192.168.1.100的流量会优先查询表100。 # 4. 查看自定义路由表100的内容 ip route show table 100 # 应该看到类似 # default via 192.168.1.1 dev eth0 # 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 # 5. 功能性测试 # 测试外网连通性应走eth1 ping -c 4 8.8.8.8 # 测试内网同网段连通性应走eth0 ping -c 4 192.168.1.1 # 测试其他内网网段连通性应走eth0经由内网网关 ping -c 4 10.0.1.1 # 6. 跟踪路由验证路径 # 跟踪到外网地址的路由 traceroute 8.8.8.8 # 第一跳应该是外网网关 192.168.31.1设备是 eth1。 # 跟踪到内网地址的路由 traceroute 10.0.1.1 # 第一跳应该是内网网关 192.168.1.1设备是 eth0。5. 高级调优与故障排查实录即使按照上述步骤配置在实际环境中仍可能遇到各种问题。以下是我总结的常见坑点与解决方案。5.1 常见问题与解决方案速查表问题现象可能原因排查命令与解决方案内网IP可以ping通网关但ping不通其他内网网段如10.x.x.x。1. 内网网关192.168.1.1上没有到目标网段的路由。2. 策略路由表100中缺少默认路由或默认路由指向错误。3. 目标服务器或中间防火墙有策略限制。1.ip route show table 100检查表100中是否有default via 192.168.1.1。2. 在主机上traceroute 10.0.1.1看第一跳是否是192.168.1.1。如果不是检查ip rule list规则是否生效。3. 联系网络管理员确认网关路由和防火墙策略。配置重启后策略路由失效。NetworkManager连接配置未正确持久化或者有其他服务如systemd-networkd干扰。1. 使用nmcli con show company-lan | grep -E “ipv4.(routes|routing-rules)”确认配置已保存。2. 检查是否有其他网络管理服务在运行systemctl status systemd-networkd。如果active考虑禁用sudo systemctl disable --now systemd-networkd。注意这可能会影响服务器版桌面版通常只用NetworkManager。所有流量都走了外网内网特定网段不通。策略路由规则from 192.168.1.100未生效或者主路由表的路由覆盖了。1.ip rule list查看规则是否存在且优先级合理。2. 确保内网连接设置了ipv4.never-default yes防止其网关进入主路由表造成混淆。3. 尝试为特定内网网段在主路由表添加更精确的路由sudo nmcli con mod company-lan ipv4.routes “10.0.0.0/8 192.168.1.1”。这条路由会加入主路由表对所有流量生效优先级高于默认路由。DNS解析混乱内网域名解析失败。系统DNS配置可能只使用了外网DNS无法解析内网域名。1. 检查/etc/resolv.conf确认是否包含了内网DNS服务器192.168.1.1。2. 在NetworkManager中为内网连接单独设置DNSsudo nmcli con mod company-lan ipv4.dns “192.168.1.1”。3. 可以使用systemd-resolve --status查看各个接口的DNS配置。无线网卡wlan0作为外网卡时配置不生效。无线连接通常由NetworkManager管理配置方式与有线相同。但无线网络可能频繁重连导致路由规则重复添加。1. 确保无线连接的配置中也设置了ipv4.never-default no如果是外网出口。2. 为无线连接使用固定的连接配置名避免重连后生成新的临时配置。3. 检查无线连接的IPv4设置方法是否为auto(DHCP)。5.2 配置持久化与启动脚本虽然nmcli配置在重启后通常能通过NetworkManager自动恢复但在某些极端情况下如非常早期的系统启动阶段需要网络可能需要更底层的保障。我们可以创建一个systemd服务单元来在启动时应用关键的路由规则。创建一个脚本文件例如/usr/local/bin/setup-dual-routes.sh#!/bin/bash # 在NetworkManager启动后确保策略路由规则存在 ip rule add from 192.168.1.100 table 100 pref 100 # 为表100添加直连路由和默认路由如果NetworkManager还没添加 ip route add 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 table 100 ip route add default via 192.168.1.1 dev eth0 table 100然后创建一个systemd服务单元/etc/systemd/system/dual-route.service[Unit] DescriptionSetup dual NIC routing rules Afternetwork-online.target NetworkManager.service Wantsnetwork-online.target [Service] Typeoneshot ExecStart/usr/local/bin/setup-dual-routes.sh RemainAfterExityes [Install] WantedBymulti-user.target最后启用它sudo systemctl enable dual-route.service。这作为一个兜底方案确保路由规则万无一失。5.3 使用NetworkManager连接图形界面进行辅助检查在UOS桌面环境下你可以点击任务栏网络图标 - “网络设置”查看各个有线连接的配置。在“IPv4”设置页你可以看到我们通过命令行设置的“手动”地址、DNS以及“仅对此连接使用自动路由”选项这对应ipv4.never-default。图形界面虽然不能直接配置复杂的策略路由但可以用来验证基本IP设置是否正确非常直观。6. 方案延伸与替代思路上述方案是基于“源地址”的策略路由这是最通用和稳定的方法。但在某些特定场景下也可以考虑其他思路。6.1 基于目标地址的简单路由如果你的需求仅仅是“访问A网段走网卡1访问B网段走网卡2其他走默认”并且不关心回包路径通常对称路由才有问题那么可以简单地在主路由表中添加更精确的路由而不必配置复杂的策略路由。# 添加一条静态路由访问10.0.0.0/8网段的流量走内网网关192.168.1.1 sudo nmcli con mod company-lan ipv4.routes “10.0.0.0/8 192.168.1.1” # 这条路由会进入主路由表由于其掩码比默认路由0.0.0.0/0更“精确”所以优先级更高。这种方法更简单但前提是你的内网网关192.168.1.1知道如何去往10.0.0.0/8并且从10.0.0.0/8返回的流量其目标IP是你的外网IP时能正确路由回来。这在一些网络拓扑中可能不成立会导致单向通的问题。而基于源地址的策略路由能保证“从哪来回哪去”适应性更强。6.2 使用systemd-networkd进行配置适用于服务器或无图形界面环境如果你在UOS服务器版或希望更底层的控制可以禁用NetworkManager改用systemd-networkd。禁用NetworkManagersudo systemctl disable --now NetworkManager为eth0创建配置文件/etc/systemd/network/10-internal.network[Match] Nameeth0 [Network] Address192.168.1.100/24 DNS192.168.1.1 [Route] Gateway192.168.1.1 Table100 [RoutingPolicyRule] From192.168.1.100 Table100为eth1创建配置文件/etc/systemd/network/20-external.network[Match] Nameeth1 [Network] DHCPyes启用并启动systemd-networkdsudo systemctl enable --now systemd-networkd这种方式语法更简洁但调试和日常管理不如nmcli直观且与桌面环境整合度低。经过以上步骤你的UOSDeepin系统应该已经能够稳定地让双网卡各司其职了。这套配置的关键在于理解策略路由的“匹配-查询”逻辑以及耐心地测试每一条路径。刚开始可能会觉得复杂但一旦配置成功它就能在后台默默无闻地稳定工作极大提升在多网络环境下的工作效率。如果在配置过程中遇到任何问题多使用ip route show、ip rule list和traceroute这三个命令进行诊断它们能告诉你数据包到底选择了哪条路。