临时路由重启后丢失,因route/ip route仅修改运行时内核路由表;永久路由应配置/etc/sysconfig/network-scripts/route-ethx(接口级)或/etc/sysconfig/static-routes(全局),由network服务自动管理,避免rc.local时机晚、竞态及残留问题。

临时加的路由,重启就丢;真要永久生效,不能靠 route 或 ip route 命令直接写进配置文件,得走系统网络服务识别的路径。
为什么 route 和 ip route 加的路由重启后消失
这两个命令只操作内核当前路由表,不触碰任何持久化机制。route add -net 10.20.0.0/16 gw 10.10.1.1 或 ip route add 10.20.0.0/16 via 10.10.1.1 都是运行时行为。哪怕你把它们塞进 /etc/rc.local,也存在严重隐患:
-
/etc/rc.local执行太晚,NFS 挂载、某些 systemd 服务可能已启动并失败 - 网卡还没 up 完,
ip route add就会报RTNETLINK answers: Network is unreachable - 没有自动清理逻辑,
service network restart后旧路由残留,新旧冲突
/etc/sysconfig/network-scripts/route-ethX 是最稳妥的 per-interface 方式
这是 CentOS/RHEL 系统原生支持的接口级静态路由配置方式,由 network 服务在接口 up/down 时自动加载/卸载,时机准、无竞态、可管理。
- 文件名必须严格匹配网卡名,比如网卡是
ens33,就得叫route-ens33;是eth0,就得叫route-eth0 - 每行一条路由,格式为:
目标网络/CIDR via 下一跳地址 [dev 接口名],dev可省略(默认走该文件对应接口) - 支持主机路由(
/32)、子网路由(/24)、默认路由(0.0.0.0/0或default) - 示例:
10.20.0.0/16 via 10.10.1.1 192.168.100.52/32 via 10.10.1.2 default via 10.10.1.254
- 改完后执行
systemctl restart network(CentOS 7)或ifdown eth0 && ifup eth0即可生效,无需重启机器
/etc/sysconfig/static-routes 适合全局非接口绑定路由
当你有几条路由不依赖特定网卡(比如所有流量都走某中转网关),又不想为每个接口单独建 route-* 文件时,用这个更简洁。
- 格式是:
any net 目标网络 netmask 子网掩码 gw 下一跳,或者any net 目标网络/前缀 gw 下一跳 - 注意:
any是固定关键字,不能写成all或留空;net也不能省略 - 示例:
any net 10.20.0.0/16 gw 10.10.1.1 any net 172.16.0.0 netmask 255.240.0.0 gw 10.10.1.2
- 它由
/etc/sysconfig/network-scripts/ifup-routes在network服务启动时解析,所以比rc.local早得多,能避开 NFS 挂载失败问题 - 但不支持
metric、src等高级参数,灵活性不如route-ethX
别踩这些坑:顺序、依赖和验证
永久路由不是写完就完事,三个点最容易被忽略:
- 如果网卡用 DHCP 获取 IP,必须在对应
ifcfg-ethX中设PEERROUTES=no,否则 DHCP 脚本会覆盖你配的路由 - 多个默认路由共存时,
metric值决定优先级;route-ethX不支持直接写metric,得用POSTUP="ip route replace ... metric 100"这类变通写法 - 验证不能只看
ip route show,还要测真实连通性:ping -I eth0 10.20.0.1强制指定出口接口,排除默认路由干扰











