在 Linux 网络管理中,很多开发者或运维人员在尝试手动添加网关时,都会遇到一个令人头疼的错误:SIOCADDRT: Network is unreachable。随后在不断尝试中,又发现系统的路由表(Route Table)变得一团糟。
本文将为你剖析其中的缘由,并提供一套完整的“清理与优化”方案。
一、 为什么会报 “Network is unreachable”?
当你执行 sudo route add default gw 192.168.2.254 时,Linux 内核会首先自问:“我能看到 192.168.2.254 在哪吗?”
报错的根本原因通常有两个:
- 网卡没有 IP 或处于 DOWN 状态**:如果你的**
wlan0没有分配到192.168.2.x段的 IP,系统就认为它无法触达该网关。 - 缺乏链路层路由:在设置“默认门(网关)”之前,必须先确定通往这个网关的“走廊”。
解决办法:
-
检查状态:使用 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,系统会死磕这条路径,即使网卡已经断开了,流量依然会往这里走,导致断网。
三、 彻底清理与持久化配置
- 拨乱反正:清理无效路由
如果路由表已经乱了,最快的办法是“归零”重来。连续执行多次删除,直到提示没有默认路由:
sudo route del default
Use code with caution.
然后重启网络服务,让系统根据当前物理连接重新生成正确的路由:
sudo systemctl restart NetworkManager
- 进阶:设置永久优先级
与其反复手动修改路由,不如告诉系统:“当我有线和无线都在时,优先走哪一个。”
我们通过修改 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名称"