路由修改无法持久化主因是配置位置错误、格式不符或被networkmanager/systemd-networkd等服务覆盖;须按发行版和网络管理器(如netplan、ifcfg、networkd)将静态路由写入对应配置文件并验证生效。

路由修改无法持久化,不是命令没生效,而是系统重启或网络服务重载后被覆盖。关键在区分“临时配置”和“启动时加载的配置源”,多数问题出在配置位置错、格式不对或服务未识别。
确认你用的是哪种配置方式
Linux发行版差异大,NetworkManager、systemd-networkd、传统ifupdown、cloud-init等都可能接管网络,它们各自读取不同配置文件:
- CentOS/RHEL 7+、Rocky/AlmaLinux:主要看 /etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/sysconfig/network-scripts/route-eth0(每网卡一个 route-xxx 文件,格式如 192.168.10.0/24 via 192.168.1.1 dev eth0)
- Ubuntu/Debian(使用 netplan):查 /etc/netplan/*.yaml,静态路由需写在 routes: 下,且必须指定 to、via、on-link(如需)和 metric
- 启用 NetworkManager 的桌面环境:直接改 ifcfg 或 route-xxx 可能被忽略,应使用 nmcli connection modify 或图形界面设置,或禁用 NM 管理特定接口
- systemd-networkd:配置在 /etc/systemd/network/*.network 中,用 [Route] 段落定义
检查配置是否被正确加载
改完配置别急着重启,先验证它是否会被实际应用:
- 对 netplan:运行 sudo netplan generate(不报错才继续),再 sudo netplan apply;失败时看输出错误,常见是缩进错误、缺少 to/via 字段
- 对 ifcfg + route-xxx:执行 sudo ifdown eth0 && sudo ifup eth0,然后 ip route show 看路由是否出现;若没加进,检查 route-eth0 文件权限是否为 644,内容末尾不能有多余空格或注释
- 查看服务日志:journalctl -u NetworkManager --since "1 hour ago" 或 journalctl -u systemd-networkd,搜索 “route”、“failed”、“ignored” 等关键词
避免被 DHCP 或 NetworkManager 覆盖
很多情况下,路由“消失”是因为网络服务在获取地址后自动清空并重建路由表:
- 如果网卡用 DHCP 获取 IP,默认网关会由 DHCP 服务器下发,手动加的 default route 很可能被覆盖。解决办法:在 ifcfg 中设 DEFROUTE=no,或在 netplan 中设 dhcp4-overrides: { use-routes: false }
- NetworkManager 默认会管理所有接口。若想让它忽略某张网卡,编辑其 ifcfg 文件,加入 NM_CONTROLLED=no(RHEL系)或在 netplan 中设 renderer: networkd 并关闭 NM
- 某些云平台(如 AWS、阿里云)的 cloud-init 会在每次启动时重写网络配置,需检查 /var/lib/cloud/instances/*/sem/config_networking 是否被触发,必要时禁用相关模块
验证持久化是否真正生效
最可靠的测试不是重启机器,而是模拟网络服务重载:
- 对 NetworkManager:sudo systemctl restart NetworkManager,再查 ip route
- 对 systemd-networkd:sudo systemctl restart systemd-networkd
- 对 ifupdown:sudo ifdown --exclude=lo eth0 && sudo ifup eth0
- 成功后,可手动执行 sudo reboot 做最终验证;重启后立即运行 ip route show table all,确认所有自定义路由表和策略规则也都存在











