/etc/sysconfig/static-routes是最稳妥的永久路由方案,由network服务启动时读取执行,时机早于nfs等依赖网络的组件;接口级路由则应使用/etc/sysconfig/network-scripts/route-文件,内容采用ip route语法,支持via、dev等参数。

route 和 ip route 添加的路由默认都是临时的,重启或网卡重载后立即丢失。要永久生效,必须写入系统启动或网络服务加载阶段能识别的配置文件,且不能依赖执行顺序靠后的脚本(比如 /etc/rc.local)。
为什么 /etc/rc.local 里加 route add 不可靠
因为 rc.local 是整个系统初始化最后执行的环节,远晚于 network 服务和 netfs(NFS挂载)服务。如果静态路由用于访问 NFS 服务器,netfs 启动时路由还没加,就会挂载失败,报错类似 mount.nfs: Connection timed out 或 No route to host。
此外,执行 systemctl restart network 或 ifdown/ifup eth0 也不会重新加载 rc.local 里的路由。
/etc/sysconfig/static-routes 是最稳妥的永久方案(RHEL/CentOS系)
这个文件由 /etc/init.d/network 脚本在启动网络服务时主动读取并执行,时机早于 NFS、bonding、VLAN 等依赖网络的组件。
需手动创建该文件(若不存在),格式严格:
- 每行以
any开头(表示不限定接口) - 用
net表示网段,host表示单主机 - 支持
gw(下一跳)、dev(出口设备)、netmask(掩码)等参数 - 子网写法优先用
/24形式,避免netmask和 CIDR 混用出错
示例:any net 10.20.30.0/24 gw 192.168.1.254any host 172.16.0.100 dev eth1
验证是否生效:ip route show 或 route -n;测试重载:systemctl restart network(CentOS 7+ 可能需用 nmcli 或改用 NetworkManager 配置)。
接口级永久路由:用 /etc/sysconfig/network-scripts/route-<iface></iface>
适用于明确绑定到某块网卡(如 eth0)的路由,比 static-routes 更精确,也更现代(推荐用于 CentOS 7+/RHEL 7+)。
- 文件名必须为
route-eth0(对应接口名,不能是ifcfg-eth0) - 内容直接写
ip route语法,每行一条,不带ip route add - 支持
via、dev、src、metric等完整参数 - 不支持
route命令风格(如-net、gw)
示例(/etc/sysconfig/network-scripts/route-eth0):10.20.30.0/24 via 192.168.1.254 dev eth0192.168.99.0/24 dev eth0 src 192.168.1.100
注意:此方式下,systemctl restart network 会自动 reload,但 ifdown eth0 && ifup eth0 同样有效。
别踩这些坑
route 和 ip route 的参数不互通——route add -net 10.0.0.0/24 gw 1.1.1.1 是错的,route 不识别 /24 缩写,必须写 netmask 255.0.0.0;而 ip route 不接受 gw 关键字,只认 via。
另外,/etc/sysconfig/network 中的 GATEWAY= 只影响默认路由,不能配多条静态路由;POSTUP/PREDOWN 在新版 NetworkManager 下已弃用,仅限传统 network 服务可用。
最后,所有配置改完务必运行 ip route flush cache(如有)并用 ping -I eth0 10.20.30.1 测试源接口连通性,避免策略路由干扰。











