一台办公电脑原本通过有线网卡访问内网 OA 系统。为了临时查阅外部资料,接入 WiFi 后,电脑同时拥有了两条网络连接:有线网卡连接办公内网,无线网卡连接外部网络。

网络连接看起来正常,但接下来可能出现一些不符合直觉的现象:OA 页面无法打开,外部网站仍然可以访问;断开 WiFi 后 OA 恢复正常;重新连接 WiFi 后,问题再次出现。

这类现象不一定是 OA 服务异常,也不一定是 DNS 配置错误。一个值得优先检查的方向是:当 Linux 主机同时连接多个网络时,内核究竟根据什么决定一个数据包从哪个网卡发出?

理解这个问题,需要区分三个层次:路由表决定数据包可以走哪条路径,路由规则决定查询哪些路由表,网络管理工具则负责把配置写入系统并在连接变化时重新应用。

本文所有 IP 地址均取自 RFC 5737(192.0.2.0/24、198.51.100.0/24、203.0.113.0/24)与 RFC 1918 保留的示例网段,不对应任何真实网络。

一、接入 WiFi 改变了主机的网络路径

先假设办公电脑有以下网络配置:

网络接口 地址 用途
enp3s0 192.0.2.15/24 连接办公内网
wlp2s0 203.0.113.25/24 连接 WiFi

办公内网的 OA 服务器地址为 192.0.2.80,WiFi 路由器的地址为 203.0.113.1。

有线连接建立后,系统通常会获得一条指向办公网的直连路由。如果有线网络还提供了默认网关,系统也可能获得一条默认路由。接入 WiFi 后,无线连接可能再增加一条直连路由和一条默认路由。

问题由此产生:系统同时存在多条路由时,并不会简单地按照网卡连接顺序选择出口。它需要依据目标地址、路由前缀、路由优先级以及可能存在的策略规则完成路径选择。

\!\[svg\](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiB2aWV3Qm94PSIwIDAgNjgwIDI5MCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIGhlaWdodD0iMjkwIj4KICA8dGV4dCB4PSIzNDAiIHk9IjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iIzFhMWExYSI+5Y+M572R5Y2h5ouT5omR77ya5pWw5o2u5YyF5Ye65Y+j55Sx5YaF5qC46Lev55Sx5p+l6K+i5Yaz5a6a77yM6ICM6Z2e6L+e57q/PC90ZXh0PgogIDxyZWN0IHg9IjIyMCIgeT0iMjgiIHdpZHRoPSIyNDAiIGhlaWdodD0iNTgiIHJ4PSIxMCIgZmlsbD0iI2U4ZjBmZSIgc3Ryb2tlPSIjNWI4MmM0IiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjM0MCIgeT0iNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTQiIGZpbGw9IiMxNzM2NWQiPkxpbnV4IOWKnuWFrOeUteiEkTwvdGV4dD4KICA8dGV4dCB4PSIzNDAiIHk9IjcxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEyIiBmaWxsPSIjMTczNjVkIj7ot6/nlLHooaggwrcg6Lev55Sx6KeE5YiZPC90ZXh0PgogIDxwYXRoIGQ9Ik0yNzUgODYgTDE3MCAxMzIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzM1NzdiOCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICA8cGF0aCBkPSJNNDA1IDg2IEw1MTAgMTMyIiBmaWxsPSJub25lIiBzdHJva2U9IiMyNjk0NmEiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgPHJlY3QgeD0iNTAiIHk9IjEzMiIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI2MiIgcng9IjEwIiBmaWxsPSIjZThmNWU5IiBzdHJva2U9IiMyNjk0NmEiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgPHRleHQgeD0iMTcwIiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxNzViM2MiPuaciee6v+e9keWNoSBlbnAzczA8L3RleHQ+CiAgPHRleHQgeD0iMTcwIiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZpbGw9IiMxNzViM2MiPjE5Mi4wLjIuMTUvMjQ8L3RleHQ+CiAgPHJlY3QgeD0iMzkwIiB5PSIxMzIiIHdpZHRoPSIyNDAiIGhlaWdodD0iNjIiIHJ4PSIxMCIgZmlsbD0iI2ZmZjRlNSIgc3Ryb2tlPSIjYzg4YTMwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjUxMCIgeT0iMTU2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjN2E0YTBiIj7ml6Dnur/nvZHljaEgd2xwMnMwPC90ZXh0PgogIDx0ZXh0IHg9IjUxMCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEyIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmaWxsPSIjN2E0YTBiIj4yMDMuMC4xMTMuMjUvMjQ8L3RleHQ+CiAgPHBhdGggZD0iTTE3MCAxOTQgTDE3MCAyMTgiIHN0cm9rZT0iIzI2OTQ2YSIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICA8cGF0aCBkPSJNNTEwIDE5NCBMNTEwIDIxOCIgc3Ryb2tlPSIjYzg4YTMwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogIDxyZWN0IHg9IjY1IiB5PSIyMTgiIHdpZHRoPSIyMTAiIGhlaWdodD0iNTQiIHJ4PSI4IiBmaWxsPSIjZjJmYWY0IiBzdHJva2U9IiMyNjk0NmEiLz4KICA8dGV4dCB4PSIxNzAiIHk9IjI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzE3NWIzYyI+5Yqe5YWs5YaF572RPC90ZXh0PgogIDx0ZXh0IHg9IjE3MCIgeT0iMjU4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEyIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmaWxsPSIjMTc1YjNjIj5PQe+8mjE5Mi4wLjIuODA8L3RleHQ+CiAgPHJlY3QgeD0iNDA1IiB5PSIyMTgiIHdpZHRoPSIyMTAiIGhlaWdodD0iNTQiIHJ4PSI4IiBmaWxsPSIjZmZmOWYwIiBzdHJva2U9IiNjODhhMzAiLz4KICA8dGV4dCB4PSI1MTAiIHk9IjI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzdhNGEwYiI+V2lGaSDot6/nlLHlmag8L3RleHQ+CiAgPHRleHQgeD0iNTEwIiB5PSIyNTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiM3YTRhMGIiPuWklumDqOe9kee7nOWHuuWPozwvdGV4dD4KPC9zdmc+)

这张拓扑图只描述网络连接关系。真正决定一个数据包从哪个接口离开的,是 Linux 内核执行的路由查询结果,而不是图中的连线,也不是应用程序认为自己连接了哪张网卡。

二、Linux 如何选择路由

1. 路由表描述目标网络的可达路径

可以先查看当前系统的 IPv4 路由表:

1
ip -4 route show

在上述办公网络中,可能看到类似这样的结果:

1
2
3
4
default via 203.0.113.1 dev wlp2s0 metric 600
default via 192.0.2.1 dev enp3s0 metric 100
192.0.2.0/24 dev enp3s0 proto kernel scope link src 192.0.2.15
203.0.113.0/24 dev wlp2s0 proto kernel scope link src 203.0.113.25

注意:这是一份用于解释路由选择的示例路由表,并非某台办公电脑的实测输出。实际路由取决于网络配置、DHCP 下发信息、NetworkManager 设置以及其他网络管理服务。

每一条路由都描述了一个目标前缀,以及到达该前缀时可以使用的路径。

  • default 表示默认路由,即没有匹配到更具体路由时可考虑的路径。
  • via 指定下一跳网关。
  • dev 指定出接口。
  • metric 表示路由度量值。在其他选择条件相同、路由可比较的情况下,较低的 metric 通常具有更高优先级。
  • src 出现在直连路由中时,表示内核可为相关流量选择的首选源地址。

路由表不是"当前正在使用的网卡列表",而是内核执行路由查询时使用的路径信息。

\!\[svg\](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiB2aWV3Qm94PSIwIDAgNjgwIDMwMCIgaGVpZ2h0PSIzMDAiPgogIDx0ZXh0IHg9IjM0MCIgeT0iMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBmaWxsPSIjMWExYTFhIj7ljrvlvoAgMTkyLjAuMi44MCDnmoTljIXvvJrlkb3kuK3mm7TlhbfkvZPnmoQgLzI0IOadoeebru+8jG1ldHJpYyDkuI3lj4LkuI48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjM0IiB3aWR0aD0iNjQwIiBoZWlnaHQ9Ijc2IiByeD0iOCIgZmlsbD0iI2U4ZjVlOSIgc3Ryb2tlPSIjMjY5NDZhIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjM2IiB5PSI1NSIgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IiMxNzViM2MiPuKRoCDnsr7noa7nvZHmrrXmnaHnm67vvIjmnIDplb/liY3nvIDljLnphY3og5zlh7rvvIk8L3RleHQ+CiAgPHJlY3QgeD0iMzYiIHk9IjY0IiB3aWR0aD0iNDMwIiBoZWlnaHQ9IjE4IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMjY5NDZhIi8+CiAgPHRleHQgeD0iNDIiIHk9Ijc3IiBmb250LXNpemU9IjExIiBmb250LWZhbWlseT0ibW9ub3NwYWNlIiBmaWxsPSIjMWExYTFhIj4xOTIuMC4yLjAvMjQgZGV2IGVucDNzMCBzY29wZSBsaW5rPC90ZXh0PgogIDx0ZXh0IHg9IjQ3OCIgeT0iNzciIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiMxNzViM2MiPuKGkCDliY3nvIDmm7Tplb/vvIzkvJjlhYjlkb3kuK08L3RleHQ+CiAgPHRleHQgeD0iMzYiIHk9Ijk4IiBmb250LXNpemU9IjExIiBmaWxsPSIjNWY2MzY4Ij7nm67moIfnmoQgLzI0IOavlOm7mOiupOi3r+eUseeahCAvMCDmm7TlhbfkvZPvvIzmr5TovoPliLDmraTnu5PmnZ88L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEyMiIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI3NiIgcng9IjgiIGZpbGw9IiNmMWYzZjQiIHN0cm9rZT0iIzlhYTBhNiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIzNiIgeT0iMTQzIiBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iIzNjNDA0MyI+4pGhIOS4pOadoem7mOiupOi3r+eUse+8iOacrOasoeafpeivouacquWPguS4juavlOi+g++8iTwvdGV4dD4KICA8cmVjdCB4PSIzNiIgeT0iMTUyIiB3aWR0aD0iNDMwIiBoZWlnaHQ9IjE4IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjOWFhMGE2Ii8+CiAgPHRleHQgeD0iNDIiIHk9IjE2NSIgZm9udC1zaXplPSIxMSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSIgZmlsbD0iIzFhMWExYSI+MC4wLjAuMC8wIHZpYSAyMDMuMC4xMTMuMSBkZXYgd2xwMnMwIG1ldHJpYyA2MDA8L3RleHQ+CiAgPHJlY3QgeD0iMzYiIHk9IjE3NCIgd2lkdGg9IjQzMCIgaGVpZ2h0PSIxOCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzlhYTBhNiIvPgogIDx0ZXh0IHg9IjQyIiB5PSIxODciIGZvbnQtc2l6ZT0iMTEiIGZvbnQtZmFtaWx5PSJtb25vc3BhY2UiIGZpbGw9IiMxYTFhMWEiPjAuMC4wLjAvMCB2aWEgMTkyLjAuMi4xIGRldiBlbnAzczAgbWV0cmljIDEwMDwvdGV4dD4KICA8dGV4dCB4PSI0NzgiIHk9IjE3MCIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzVmNjM2OCI+4oaQIOS7heW9k+ebruaghzwvdGV4dD4KICA8dGV4dCB4PSI0NzgiIHk9IjE4NiIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzVmNjM2OCI+ICAg5LiN5Yy56YWNIC8yNCDml7bmiY3mr5Q8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjIxMiIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI3MiIgcng9IjgiIGZpbGw9IiNlOGYwZmUiIHN0cm9rZT0iIzViODJjNCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIzNiIgeT0iMjMzIiBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iIzE3MzY1ZCI+5p+l6K+i6aG65bqP77ya6Lev55Sx6KeE5YiZIOKGkiDot6/nlLHooagg4oaSIOacgOmVv+WJjee8gOWMuemFjSDihpIg5ZCM5YmN57yA5q+UIG1ldHJpYzwvdGV4dD4KICA8dGV4dCB4PSIzNiIgeT0iMjU0IiBmb250LXNpemU9IjExIiBmaWxsPSIjMWExYTFhIj7ikaAgaXAgcnVsZSDlhrPlrprmn6Xlk6rlvKDooajjgIDikaEg6KGo5YaF5oyJ5YmN57yA6ZW/5bqm5Y+W5pyA5YW35L2T55qE5LiA5p2hPC90ZXh0PgogIDx0ZXh0IHg9IjM2IiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiMxYTFhMWEiPuKRoiDliY3nvIDplb/luqbnm7jlkIzml7bmiY3mr5TovoMgbWV0cmlj77yM5bqm6YeP5YC85bCP6ICF5LyY5YWIPC90ZXh0Pgo8L3N2Zz4=)

2. 最长前缀匹配优先于默认路由

假设系统有以下两条路由:

1
2
default via 203.0.113.1 dev wlp2s0 metric 100
192.0.2.0/24 dev enp3s0 scope link

当目标地址为 192.0.2.80 时,它既符合默认路由 0.0.0.0/0,也符合 192.0.2.0/24。

但是,192.0.2.0/24 的前缀更具体,因此正常情况下会优先匹配这条直连路由,数据包从 enp3s0 发出,而不是经由 WiFi 默认网关转发。

当目标地址变成 1.1.1.1 时,它不属于 192.0.2.0/24,系统才会考虑默认路由。

这里有一个重要区别:metric 并不是让所有路由进行全局排序的唯一依据。路由前缀的匹配程度是关键因素;metric 主要用于比较可用于同一目标的候选路由。不能因为 WiFi 的默认路由 metric 较低,就直接推断所有流量都会走 WiFi。

3. 多条默认路由如何竞争

如果有线网络和 WiFi 都配置了默认路由,那么访问不属于任何更具体路由的目标时,系统需要在可用的默认路径中作出选择。

例如:

1
2
default via 192.0.2.1 dev enp3s0 metric 100
default via 203.0.113.1 dev wlp2s0 metric 600

在这份示例配置中,有线默认路由的 metric 更低,因此在普通主路由表的相应查询条件下,它通常会成为优先路径。

但这并不意味着"metric 越低,所有流量就必然走该接口"。如果系统使用了策略路由、不同的路由表、数据包标记、VRF 或其他路由选择条件,最终结果还会受到这些机制的影响。

三、先查询内核的真实决策

查看路由表可以了解系统配置了哪些路径,但要确认某个目标地址实际会使用哪条路径,更直接的方式是查询内核的路由决策。

1. 使用 ip route get

例如:

1
2
ip route get 192.0.2.80
ip route get 1.1.1.1

第一条查询内网 OA 服务器的路由,第二条查询外部地址的路由。命令会根据当前环境中的路由与规则,返回相应的路由查询结果。

如果 OA 服务器的路由指向 enp3s0,而外部地址指向 wlp2s0,说明当前路由查询分别选择了有线和无线出口。

如果两者都指向 WiFi,或者 OA 服务器的路由意外指向有线网卡之外的路径,就需要继续检查路由表与规则。

ip route get 的输出会给出这条查询最终选中的出口接口、下一跳和源地址,是判断"内核到底怎么走"最直接的依据。

2. 路由表与 ip route get 的分工

两者回答的问题并不相同:

命令 主要回答的问题
ip route show 当前路由表里有哪些路由?
ip rule show 内核按什么规则选择路由表?
ip route get <地址> 当前查询条件下,该目标会选择什么路径?

如果系统存在策略路由,仅查看主路由表可能无法解释全部现象。因此,当路由表看起来正确,但实际流量仍然异常时,应该进一步检查路由规则。

四、用 ip route 临时修正路径

假设办公电脑的内网地址为 192.0.2.15/24,OA 服务器地址为 192.0.2.80。正常情况下,同一网段内的 OA 服务器可以通过有线网卡的直连路由到达。

如果 OA 服务器位于其他网段,例如 198.51.100.0/24,而该网络应通过办公网关 192.0.2.1 到达,就可以添加一条更具体的路由:

1
ip route add 198.51.100.0/24 via 192.0.2.1 dev enp3s0

这条命令告诉内核:访问 198.51.100.0/24 时,经由办公网关 192.0.2.1,从 enp3s0 发出。

随后可以检查配置:

1
2
ip route show 198.51.100.0/24
ip route get 198.51.100.20

当确认这条路由不再需要时,可以删除:

1
ip route del 198.51.100.0/24 via 192.0.2.1 dev enp3s0

上述路由配置是适用于相应网络拓扑的命令示例;本次验证环境没有执行添加、删除该办公网路由的操作。实际使用前,应确认网关可达、目标前缀正确,并且有权修改本机路由表。

还需要注意,ip route add 修改的是内核当前使用的路由配置。它并不会自动写入 NetworkManager 的连接配置文件。网络连接重新激活、网络管理服务重新应用配置或系统重启后,这条路由可能不再存在。

因此,ip route 适合用来验证路由设计、临时修复路径,以及快速判断问题是否来自路由选择;如果需要长期生效,就应该把配置写入对应的网络管理配置。

五、用 NetworkManager 配置持久化路由

在使用 NetworkManager 管理网络连接的 Linux 桌面或办公电脑上,nmcli 可以修改连接配置,使路由在连接重新激活时重新应用。

首先查看连接名称:

1
nmcli connection show

假设有线连接的名称为 Office Ethernet,WiFi 连接的名称为 Office WiFi。注意,连接名称不一定与接口名称相同,应该以本机实际输出为准。

1. 调整默认路由的 metric

如果希望 WiFi 主要用于访问外部网络,而办公网默认出口应优先使用有线连接,可以在确认网络设计允许的前提下,设置两条连接的默认路由 metric:

1
2
nmcli connection modify "Office Ethernet" ipv4.route-metric 100
nmcli connection modify "Office WiFi" ipv4.route-metric 600

这里的数值仅为示例。ipv4.route-metric 是连接配置中的默认路由度量设置,会影响适用该默认值的 IPv4 路由,不只影响默认路由本身。因此,修改前应检查这两条连接是否还承担其他网段的路由职责。

如果需要让新配置应用到当前活动连接,可以在维护窗口内重新激活连接。重新激活可能导致网络短暂中断,远程操作时尤其需要谨慎:

1
2
nmcli connection up "Office Ethernet"
nmcli connection up "Office WiFi"

连接重新激活的具体行为取决于设备与连接状态;不应在没有确认管理通道和恢复方式时直接对远程办公设备执行。

应用后,再使用以下命令核对实际结果:

1
2
3
ip -4 route show
ip -4 route get 198.51.100.20
ip -4 route get 1.1.1.1

应当关注最终选中的出口接口、下一跳和源地址,而不是仅凭配置命令执行成功就判断问题已经解决。

2. 持久化添加专用内网路由

如果只有特定内网网段需要经由办公网关,通常比单纯调整两条默认路由更精确的办法,是为目标网段添加静态路由。

例如,使用 nmcli 为有线连接添加路由:

1
nmcli connection modify "Office Ethernet" +ipv4.routes "198.51.100.0/24 192.0.2.1 100"

这条配置将 198.51.100.0/24 指向网关 192.0.2.1,并为这条静态路由指定 metric 100。

其中 +ipv4.routes 用于在现有路由列表上追加配置。若需要删除这条路由,应当依据当前连接中实际存在的路由条目,使用 NetworkManager 支持的修改方式移除对应配置,而不是随意清空整个路由列表。

修改连接配置后,需要让该配置在连接激活时应用,再检查:

1
2
3
nmcli connection show "Office Ethernet"
ip route show 198.51.100.0/24
ip route get 198.51.100.20

NetworkManager 的连接配置和内核当前路由表是两个相关但不同的层次:前者描述网络连接应当如何配置,后者反映系统当前实际使用的路由。只有检查后者,才能确认内核最终采用的路径。

六、metric 不能解决所有多网卡问题

到这里,已经可以解释大部分常见的多网卡路由问题:具体内网路由优先于默认路由;多个默认路由之间可以通过 metric 调整相对优先级;ip route 适合临时验证,NetworkManager 则适合管理持久配置。

但有些问题不能只靠调整 metric 解决。

1. 内网与 WiFi 的网段发生重叠

假设办公网和 WiFi 都使用 203.0.113.0/24。此时,两张网卡可能各自拥有指向相同前缀的直连路由。

这时系统无法仅凭目标 IP 地址表达"这个地址应该属于办公网,而不是 WiFi 网络"。路由优先级可能影响选择结果,但它并不能从根本上消除地址空间重叠带来的歧义。

应优先通过网络规划避免重叠网段。如果无法调整地址规划,则需要结合实际拓扑评估独立路由表、策略路由或网络隔离方案,而不是仅仅继续调低某条路由的 metric。

2. 策略路由改变了查询顺序

Linux 除了路由表,还有路由规则。可以通过以下命令查看:

1
2
ip rule show
ip route show table all

路由规则可以根据源地址、目标地址、数据包标记等条件选择不同的路由表。此时,即使主路由表中存在一条看似正确的路径,实际查询也可能先匹配其他规则,并使用不同的路由表。

因此,当普通路由表无法解释 ip route get 的结果时,应该检查规则与其他路由表,而不是直接假设内核忽略了 metric。

3. 出口正确,但回程路径不正确

网络通信不仅需要发送方选择正确的出口,也需要返回流量能够到达原始主机。

例如,请求从有线网卡发往 OA 服务器,但服务器的返回路由指向另一条无法到达客户端的路径,连接仍然可能失败。类似现象也可能由防火墙策略、源地址选择、网关配置或网络设备的访问控制造成。

遇到这种情况,应分别检查请求方向和响应方向的路径。必要时使用抓包工具观察报文从哪个接口发出、是否收到响应,以及响应是否从预期接口返回。

七、排查时应遵循的顺序

多网卡环境下,最有效的排查方式是先确认内核的决策,再逐层检查配置来源,而不是一开始就修改所有网卡的 metric。

  1. 确认接口和地址。 使用 ip -br addr 检查网卡状态与 IP 地址,确认 OA 服务器实际位于哪个网段。
  2. 检查路由表。 使用 ip -4 route show 查看直连路由、专用内网路由和默认路由。
  3. 查询目标路径。 使用 ip route get <OA服务器地址>,检查所选接口、下一跳和源地址。
  4. 检查路由规则。 使用 ip rule show 和 ip route show table all,确认是否存在策略路由或其他路由表。
  5. 选择合适的修正方式。 单次验证可以使用 ip route;长期配置则应修改对应的 NetworkManager 连接。
  6. 验证配置的持续性。 在适当维护条件下重新激活连接,再次检查路由表和实际查询结果。

这套顺序的核心是区分现象与原因。OA 无法访问只是应用层现象;只有确认实际路由决策,才能判断问题是否发生在主机侧路径选择。

八、小结

当一台 Linux 办公电脑同时连接有线内网与 WiFi 时,真正需要理解的不是"哪张网卡先连接",而是内核如何根据目标前缀、路由度量值和路由规则选择数据包的路径。

ip route 提供了直接观察和调整内核路由的手段,nmcli 则让网络配置能够随连接生命周期持续生效。两者分别对应当前生效状态与连接配置管理,不能互相替代。

对于多网卡问题,先使用 ip route get 确认内核选择了什么路径,再结合路由表、路由规则与连接配置定位原因,通常比反复切换网卡或盲目调整 metric 更可靠。

三条能带走的:

  • 最长前缀匹配优先于 metric。只要存在更具体的网段条目,它必然被命中,metric 之间的比较不会发生。
  • metric 只用于比较同一目标的候选路由。它无法表达"某个网段必须走某张卡"这类诉求,用它解决内网可达性,实质是把出口选择整体推向某一侧。
  • 内核当前状态与连接配置是两个层次。ip route 改的是前者(易失),nmcli 改的是后者(持久);判断问题是否解决,最终要看内核实际选了什么路径,而不是命令有没有执行成功。

参考资料