解决 Linux “网络不可达”错误与路由表混乱指南 在 Linux 网络管理中,很多开发者或运维人员在尝试手动添加网关时,都会遇到一个令人头疼的错误:SIOCADDRT: Network is unreachable。随后在不断尝试中,又发现系统的路由表(Route Table)变得一团糟。

本文将为你剖析其中的缘由,并提供一套完整的“清理与优化”方案。

一、 为什么会报 “Network is unreachable”?

当你执行 sudo route add default gw 192.168.2.254 时,Linux 内核会首先自问:“我能看到 192.168.2.254 在哪吗?”

报错的根本原因通常有两个:

  1. 网卡没有 IP 或处于 DOWN 状态​**:如果你的** wlan0 没有分配到 192.168.2.x 段的 IP,系统就认为它无法触达该网关。
  2. 缺乏链路层路由:在设置“默认门(网关)”之前,必须先确定通往这个网关的“走廊”。

解决办法:

  • 检查状态​:使用 ip addr show wlan0确保状态是 UP且有LOWER_UP

  • 先通后导​:先让网卡获取 IP,或者手动添加一条通往主机的路由:

    sudo ip route add 192.168.2.254 dev wlan0
    sudo ip route add default via 192.168.2.254
    

二、 路由表“洪水”:为什么会出现这么多 default?

当你发现 route -n 的结果里出现了 4、5 条 default 记录时,说明系统进入了“路由竞争”状态。

产生原因:

  • 多网卡共存​:你的** eth0(有线)、wlan0(无线)和 mynet(虚拟网卡)都在同一个 192.168.2.x 网段。
  • 手动与自动叠加​​**:NetworkManager 会自动通过 DHCP 生成路由,而你手动执行的** route add 命令又生成了高优先级的路由。

关键概念:跃点数 (Metric)

路由表中的 Metric 决定了优先级:​数值越小,优先级越高​。

  • 如果你手动添加的路由 Metric 0,系统会死磕这条路径,即使网卡已经断开了,流量依然会往这里走,导致断网。

三、 彻底清理与持久化配置

  1. 拨乱反正:清理无效路由

如果路由表已经乱了,最快的办法是“归零”重来。连续执行多次删除,直到提示没有默认路由:

sudo route del default

Use code with caution.

然后重启网络服务,让系统根据当前物理连接重新生成正确的路由:

sudo systemctl restart NetworkManager
  1. 进阶:设置永久优先级

与其反复手动修改路由,不如告诉系统:“当我有线和无线都在时,优先走哪一个。”

我们通过修改 NetworkManager 的连接属性来实现:

# 将 Wi-Fi 的优先级设高(数值调小,例如 50)
sudo nmcli connection modify "你的WiFi名称" ipv4.route-metric 50

# 将有线网的优先级设低(数值调大,例如 150)
sudo nmcli connection modify "Wired connection 1" ipv4.route-metric 150

# 激活配置
sudo nmcli connection up "你的WiFi名称"