GCE Ubuntu 16.04多网卡实例路由持久化配置问题咨询
我完全懂你的困扰——手动配好第二块网卡的路由,重启就失效,还被cloud-init的配置绕得晕头转向。别慌,咱们一步步拆解解决:
第一步:先明确网卡的定义位置
首先,先搞清楚你的第二块网卡(比如ens4)到底被哪个文件管理。运行这条命令查看cloud-init生成的网卡配置:
cat /etc/network/interfaces.d/50-cloud-init.cfg
你大概率会看到类似这样的内容(以ens4为例):
auto ens4
iface ens4 inet dhcp
# 静态IP的话会是这样:
# address 192.168.1.10
# netmask 255.255.255.0
# gateway 192.168.1.1
如果这里有ens4的定义,说明cloud-init在管理这块网卡。但千万别直接修改50-cloud-init.cfg——cloud-init每次启动都会重新生成这个文件,你的修改会被直接覆盖。
方法一:自定义配置文件添加路由(推荐)
我们可以在/etc/network/interfaces.d/目录下新建一个优先级更高的配置文件(文件名数字比50大,比如60-custom-routes.cfg),系统会优先加载它,而且不会被cloud-init覆盖。
- 创建并编辑这个文件:
sudo nano /etc/network/interfaces.d/60-custom-routes.cfg
根据你的网卡IP类型(静态/DHCP)添加路由配置:
- 静态IP场景:
auto ens4 iface ens4 inet static address 192.168.2.20 netmask 255.255.255.0 gateway 192.168.2.1 # 添加自定义路由:把10.0.0.0/8网段的流量走ens4 up route add -net 10.0.0.0/8 gw 192.168.2.1 dev ens4 # 重启时删除旧路由,避免冲突 down route del -net 10.0.0.0/8 gw 192.168.2.1 dev ens4 - DHCP场景:
auto ens4 iface ens4 inet dhcp # DHCP获取IP后自动添加路由 post-up route add -net 10.0.0.0/8 gw $(ip route show dev ens4 | grep default | awk '{print $3}') dev ens4 post-down route del -net 10.0.0.0/8 gw $(ip route show dev ens4 | grep default | awk '{print $3}') dev ens4
记得把上面的网段、网关换成你实际需要的参数。
- 静态IP场景:
保存文件后,重启网络服务生效:
sudo systemctl restart networking
现在重启系统,路由应该就能稳定保留了。
方法二:修改cloud-init配置,让它自动生成路由
如果你不想绕开cloud-init,也可以直接修改它的配置模板,让它每次生成50-cloud-init.cfg时自动包含路由规则:
- 编辑cloud-init的自定义网络配置文件(不存在就创建):
sudo nano /etc/cloud/cloud.cfg.d/99-custom-network.cfg
- 添加类似下面的YAML配置(根据你的实际网卡调整):
network: version: 1 config: - type: physical name: ens4 subnets: - type: dhcp routes: - to: 10.0.0.0/8 via: 192.168.2.1 dev: ens4 # 另一块en开头的网卡配置同理 - type: physical name: enxxx subnets: - type: static address: 172.16.0.50 netmask: 255.255.255.0 gateway: 172.16.0.1 routes: - to: 192.168.0.0/16 via: 172.16.0.1 dev: enxxx
- 保存后,让cloud-init重新生成配置:
sudo cloud-init clean sudo cloud-init init
重启系统后,路由就会被cloud-init自动配置好。
方法三:用rc.local添加路由(简单但不推荐)
如果上面两种方法觉得繁琐,也可以用rc.local手动添加路由,但Ubuntu 16.04默认rc.local是禁用的,需要先启用:
- 启用rc.local服务:
sudo systemctl enable rc-local sudo systemctl start rc-local
- 编辑
/etc/rc.local,在exit 0之前添加路由命令:
sudo nano /etc/rc.local
添加内容示例:
route add -net 10.0.0.0/8 gw 192.168.2.1 dev ens4 # 另一块网卡的路由同理添加 route add -net 192.168.0.0/16 gw 172.16.0.1 dev enxxx
- 保存后重启系统即可。不过这种方法可靠性稍差,比如网卡还未启动完成时执行路由命令可能会失败。
最后提个小建议:不管用哪种方法,先手动执行路由命令测试生效后,再配置持久化,避免走弯路。
内容的提问来源于stack exchange,提问作者molly

