Linux怎么配置静态路由永久生效 Linux下route与ip命令详解

很多朋友在配置Linux静态路由时,都踩过同一个坑:明明用route命令加得好好的,怎么一重启服务器,路由就“消失”了呢?
这里必须明确一个核心概念:无论是传统的route命令,还是更现代的ip route,它们所做的修改都仅限于当前运行的内核,属于“临时操作”。想让路由配置在系统重启后依然坚挺,必须依赖系统层面的配置文件或网络管理机制。下面,我们就来把这两类工具和不同系统的永久配置方法彻底讲清楚。
route 命令只管当前会话,别指望它永久保存
先说说这位“老前辈”。route命令语法直观,上手快,但功能也相对受限。它直接操作内核路由表,完全不参与系统的启动流程。举个例子,你执行了route add -net 10.20.0.0/16 gw 10.10.1.1,用route -n查看,条目确实立刻出现了。但只要执行一次systemctl restart network,或者干脆重启机器,这条路由就会被打回原形。
正因为这种“临时性”,一些让人头疼的错误现象就出现了:
- 路由加上了,但
ping 10.20.0.1就是不通——问题可能出在网关本身不可达,而route命令可不会帮你校验网关的连通性。 - 添加路由后,SSH连接突然断了——这很可能是新路由覆盖或与默认路由发生了冲突,
route同样不会给出任何优先级提示。 - 想用
route del删除路由,却报错SIOCDELRT: No such process——这通常是删除时指定的目标格式不匹配,比如添加时用了-net参数,删除时却没带netmask。
使用route时,有几个参数细节必须留意:
-host(主机路由)和-net(网络路由)必须显式指定,不能省略。直接写route add 10.20.0.0/16是会报错的。gw(网关)和dev(出口设备)两者不能同时省略,至少得填一个。如果只写dev eth0,意思是指向直连子网,数据包不经过网关。- 查看路由时,
-n参数不是可选项,而是强烈建议加上。不加的话,命令会尝试进行DNS反向解析,在缺乏DNS服务的环境里,这个动作会卡住很久。
ip route 更推荐用于临时操作,兼容性与语义更清晰
如果你需要做临时路由调整,那么ip route(来自iproute2工具套件)通常是更好的选择。它比route更现代,参数设计也更统一。添加同一条路由,命令是ip route add 10.20.0.0/16 via 10.10.1.1 dev eth0,你看,不需要区分-net,也不需要写netmask,直接支持CIDR格式,清爽多了。
它确实解决了route的一些痛点:
- 删除更宽松:
ip route del 10.20.0.0/16就行,不必把添加时的via和dev参数再重复写一遍。 - 控制更精细:可以方便地设置路由优先级(
metric 100),或者用ip route replace直接替换已存在的条目。 - 对IPv6原生支持:直接使用
ip -6 route即可,而在很多老版本系统里,route -6这个命令根本不存在。
不过,请务必记住关键一点:ip route本质上和route一样,它只修改运行时的路由表,并不会将配置写入任何文件。所以,它依然是“临时”的。
CentOS/RHEL 系统永久路由靠 /etc/sysconfig/static-routes
那么,在CentOS或RHEL 6/7这类使用传统network-scripts的系统里,永久路由到底怎么配?答案是依靠/etc/sysconfig/static-routes这个文件。它不是脚本,而是一个纯文本的规则集,系统服务/etc/sysconfig/network-scripts/ifup-routes会在网络接口启动时自动读取并加载它。
文件内容的正确写法是这样的:
any net 10.20.0.0/16 gw 10.10.1.1 any net 192.168.5.0/24 dev eth1
这里有几个关键点需要敲黑板:
- 每行必须以
any开头,不要再写eth0之类的具体接口名(那是已经被弃用的旧版写法)。 - 掩码推荐使用CIDR格式(
/16),虽然net 10.20.0.0 netmask 255.255.0.0这种写法也合法。 - 一行就是一条路由规则,不支持合并。空行和以
#开头的注释行会被忽略。 - 修改文件后,必须重启网络服务(RHEL7用
systemctl restart network,RHEL6用service network restart)才能生效,简单的reload是不行的。
另外,千万别图省事,把route add命令塞进/etc/rc.local。因为像NFS挂载、容器网络这些服务,它们的启动顺序可能早于rc.local,届时会因为找不到路由而失败。
Ubuntu/Debian 系统永久路由必须走 Netplan YAML
如果你用的是Ubuntu 18.04以上或Debian 10以上的系统,那套方法就完全行不通了。这些系统默认使用Netplan管理网络,静态路由必须写在/etc/netplan/*.yaml配置文件里。
来看一个典型的配置片段:
network:
version: 2
ethernets:
eth0:
addresses: [10.10.1.10/24]
routes:
- to: 10.20.0.0/16
via: 10.10.1.1
on-link: true
配置Netplan时,有几个细节容易出错:
on-link: true这个选项表示网关与本机在同一子网,发包时不查询ARP缓存。如果网关在另一个子网,这项必须删除或设为false。- 当配置中同时存在默认路由和其他静态路由时,Netplan不会自动调整路由优先级(metric),如果出现多条默认路由,必须手动设置
metric值来避免冲突。 - 修改YAML文件后,必须执行
sudo netplan apply来应用。注意,这个命令会重新配置所有网络接口,很可能导致当前的SSH连接中断。
最后提一个通用且极易被忽略的要点:无论是static-routes还是Netplan,配置系统都不会在写入时验证网关的可达性。即使你配置的gw 192.168.99.1当前根本ping不通,路由条目依然会被成功添加到系统里,只是所有转发尝试都会失败。因此,排查路由问题时,别只看ip route show有没有那条记录,更要用ip route get 10.20.0.5这样的命令,去查看到达目标地址的真实下一跳路径。
