虚拟机中route命令如何添加永久静态路由?
在虚拟机中,route命令本身无法永久添加静态路由,重启网络或虚拟机后配置会丢失;要实现永久生效,必须将路由命令写入系统网络配置文件、开机自启脚本,或改用ip route加网络管理器配置。 这是Linux运维和虚拟化场景里的一个经典痛点,很多新手在虚拟机里配完路由,一重启就“打回原形”,网上教程又常常只讲临时生效的写法,本文直接针对VMware、VirtualBox、KVM等虚拟机环境,分发行版给出永久静态路由的配置方案。
为什么route命令添加的路由一重启就消失?
route命令操作的是内核路由表,属于内存中的运行时状态,开机后由网络服务或NetworkManager根据配置文件重新生成。 这和在Windows虚拟机里用route add后重启失效是同一个道理,只不过Linux的持久化方式更分散,不同发行版差异极大。
从技术层面看,route add -net 192.168.10.0/24 gw 192.168.1.1 dev ens33只是把一条路由扔进内核,内核不会主动回写任何配置文件,系统重启时,网络服务启动会清空路由表并依据自身的配置重新加载,行业共识是,想要永久生效,必须让系统每次启动网络时自动执行这条命令,或者直接写在网络配置文件的静态路由段里。
永久静态路由的主流配置方法
写入网卡配置文件(CentOS/RHEL 6/7/8系)
CentOS和RHEL系列可以创建route-<网卡名>文件,将route命令的完整参数写进去,网络服务启动时自动加载。 例如为ens33网卡添加一条到168.20.0/24的路由:
vim /etc/sysconfig/network-scripts/route-ens33
168.20.0/24 via 192.168.1.1 dev ens33
保存后执行systemctl restart network验证,或直接service network restart,在CentOS 7/8里,也可以用ip route add写进同一个文件,格式为:
168.20.0/24 via 192.168.1.1
重启网络后执行ip route查看,如果多条路由都在,说明永久配置生效。
有两台网卡的虚拟机这个文件也可以写多条,一行一条,支持default via这种默认路由写法,不过一般不建议在虚拟机里动默认路由,很容易把管理网络弄断。
配置NetworkManager连接(CentOS 8/9/RHEL 8/9系)
CentOS 8以后网络管理默认走NetworkManager,老一套的route-ens33文件依然能用,但更规范的做法是用nmcli给连接加静态路由,查看当前连接名:
nmcli connection show
假设连接名是ens33,添加永久路由:
nmcli connection modify ens33 +ipv4.routes "192.168.20.0/24 192.168.1.1"
然后重启连接或直接nmcli connection up ens33。重点在于+ipv4.routes这个参数,用错了等于没配。 如果路由要优先于其他配置,还可以配合ipv4.route-metric调整度量值,不过虚拟机场景下默认就够用了。
配置systemd开机执行脚本(通用方案)
无论哪个发行版,都可以创建systemd服务,在开机时执行route add命令。这个方法适合那种“就是不想动网络配置,只想让route命令开机自动跑一遍”的需求。 创建服务文件:
vim /etc/systemd/system/static-route.service
如下:
[Unit]
Description=Add static routes
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/sbin/route add -net 192.168.20.0/24 gw 192.168.1.1 dev ens33
ExecStart=/sbin/route add -net 192.168.30.0/24 gw 192.168.1.1 dev ens33
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
启用服务:
systemctl daemon-reload
systemctl enable static-route.service
systemctl start static-route.service
RemainAfterExit=true很关键,它让服务在命令执行完后保持active状态,不会被重复拉起。 这种写法对Ubuntu、Debian、CentOS、openSUSE通吃,唯一需要注意的就是After=network-online.target这个依赖,部分系统网络在线状态判定偏慢,可以加ExecStartPre=/bin/sleep 5做保险。
Ubuntu/Debian系的netplan或interfaces配置
Ubuntu 18.04以后用netplan管理网络,永久静态路由写在`/etc/netplan/.yaml里,老版本则直接写在/etc/network/interfaces`。 在VirtualBox里跑Ubuntu服务器版是常见场景,新版本用法如下:
vim /etc/netplan/01-netcfg.yaml
在对应网卡的eth0:段下添加:
eth0:
dhcp4: no
addresses: [192.168.1.100/24]
routes:
- to: 192.168.20.0/24
via: 192.168.1.1
gateway4: 192.168.1.1
执行netplan apply立即生效,注意gateway4在较新的netplan版本里被标记为废弃,推荐改用:
routes:
- to: default
via: 192.168.1.1
如果是Ubuntu 16.04及更早,或者直接用/etc/network/interfaces管理的Debian,在网卡配置段下面加:
up route add -net 192.168.20.0/24 gw 192.168.1.1 dev eth0
或者更简洁的post-up写法:
post-up route add -net 192.168.20.0/24 gw 192.168.1.1 dev eth0
重启网络或重启虚拟机都能生效。
VMware虚拟机里配置静态路由的特殊注意事项
在VMware Workstation或ESXi里,虚拟机网卡默认是NAT或桥接模式,添加永久静态路由前要先确认虚拟网络编辑器里的子网段和网关是否和你写的路由匹配。 比如VMware NAT模式默认网关是168.x.2,不是常见家里的168.1.1,如果按物理机习惯写网关,路由配上也不通。
实操时建议先用traceroute或ip route get验证物理链路通不通,再写永久配置,VMware的虚拟交换机不支持在虚拟机内部配置VLAN路由,所有三层路由都要靠虚拟机自己的系统转发,所以静态路由配错就是直接断网,VirtualBox里则要额外注意网卡混杂模式是否开启,开不到位会影响路由转发效果。
验证永久静态路由是否生效的完整流程
配置完成后,不建议直接重启验证,先执行以下步骤:
- 执行
ip route查看路由表,确认新路由已加载 - 执行
ip route get 192.168.20.1测试这条路由是否被匹配 - 重启网络服务而不是整个虚拟机,观察路由是否还在
- 确认没问题后,再重启虚拟机做最终验证
最稳妥的验证方式是reboot后立刻执行ip route,如果路由还在,说明永久配置真正生效了。 如果发现路由丢失,重点检查配置文件是否读取到了,可以用systemctl status network或journalctl -u NetworkManager查看日志。
临时路由和永久路由的对比
| 配置方式 | 生效范围 | 重启后状态 | 适用场景 |
|---|---|---|---|
route add 命令 |
当前内核路由表 | 丢失 | 临时调试、快速验证 |
ip route add 命令 |
当前内核路由表 | 丢失 | 临时调试、脚本内使用 |
route-<网卡> 文件 |
网卡启动时自动加载 | 保留 | CentOS/RHEL老系 |
nmcli +ipv4.routes |
NetworkManager连接配置 | 保留 | RHEL 8/9、CentOS 8/9 |
| netplan routes段 | 网络服务应用时加载 | 保留 | Ubuntu 18.04+ |
| systemd服务 | 开机自动执行 | 保留 | 全发行版通用 |
新手最容易踩的五个坑
网关地址写错

虚拟机里的网关不一定和物理机相同,特别是NAT模式下的VMware和VirtualBox,请务必在虚拟网络编辑器或网络设置里查清楚。 写错网关的后果是路由表多了一条废路,所有匹配流量都转发到错误地址,表现为间歇性不通。
网卡名称不对
CentOS 7以前叫eth0,CentOS 8以后叫ens33、ens160或enp0s3,Ubuntu则常见ens33、enp1s0。配置文件名里的网卡名必须和ip link输出的实际名字完全一致,大小写都不能错。
重复添加路由导致冲突
如果临时路由已经存在,再用永久配置加载相同网段,系统会提示RTNETLINK answers: File exists,解决办法是先删除临时路由,再应用永久配置。
多网卡环境下路由优先级混乱
虚拟机如果配了双网卡,每条静态路由要明确写dev参数指定出口网卡,否则Linux会按路由表顺序自行选择,可能导致流量从错误的网卡出去。
重启网络服务直接断连
在远程连接里重启网络或NetworkManager,如果配置有误,SSH会立刻断开。建议用nohup bash -c 'sleep 5; systemctl restart network' &这种延时重启方式留条后路。
常见问题解答
Q:虚拟机的route命令和物理机的写法有区别吗?
命令语法没有任何区别,区别只在配置文件的持久化方式上,虚拟机多了一层虚拟网卡和虚拟交换机,但只要网卡名和网关地址确认无误,写法完全一致。
Q:能否通过修改/etc/hosts实现静态路由?
不可以。/etc/hosts只负责域名和IP映射,不参与任何路由决策,静态路由必须放在网络配置或路由协议层,hosts文件和路由完全是两码事,把路由信息写进hosts不仅无效,还会造成系统启动时解析异常。
Q:Windows虚拟机的静态路由怎么永久配置?
Windows虚拟机不用route命令做持久化,而是用route add -p加-p参数,或者通过netsh interface ipv4 add route配合persist关键字实现开机自动加载,这个在Windows Server和Windows 10虚拟机里都通用,最后需要明确一个核心结论:永久路由的本质是把路由信息固化到网络配置文件的正确位置,而不是寄希望于route命令本身记住你敲过的指令。 只要掌握了CentOS的route-<网卡>文件、Ubuntu的netplan routes段和通用的systemd服务这三板斧,无论你在VMware、VirtualBox还是KVM里折腾虚拟机,都不怕重启丢路由。

