如何用DHCP与Netplan配置默认路由度量并自动调整顺序?
我之前在处理Vagrant虚拟机的Netplan路由问题时,也碰到过类似的默认路由度量错乱的情况,结合你的场景(enp0s3作为NAT接口需要优先走互联网,且不能固定网关),给你几个靠谱的解决方案:
方案一:通过Netplan的DHCP覆盖调整路由度量
如果你的enp0s3是通过DHCP获取地址(Vagrant的NAT接口默认都是DHCP),可以直接在Netplan配置中给enp0s3设置更低的路由度量值,让它的默认路由优先级高于enp0s8。这种方式不需要手动固定网关,完美适配你提到的限制。
编辑你的Netplan配置文件(通常在/etc/netplan/目录下,比如00-installer-config.yaml):
network: version: 2 ethernets: enp0s3: dhcp4: true dhcp4-overrides: route-metric: 100 # 数值越小,优先级越高 enp0s8: dhcp4: true dhcp4-overrides: route-metric: 200 # 设置比enp0s3更高的数值
如果enp0s8是静态IP配置,那就在它的路由设置里指定更高的度量:
enp0s8: addresses: [192.168.56.10/24] # 你的静态IP routes: - to: default via: 192.168.56.1 # 你的静态网关 metric: 200
配置完成后,执行以下命令生效:
sudo netplan apply
或者重启虚拟机:vagrant reload
方案二:通过Vagrant启动脚本自动修正路由
如果Netplan的配置因为Vagrant的网络初始化逻辑干扰而不生效,可以直接在Vagrantfile中添加一个启动脚本,每次虚拟机启动时自动调整路由。
修改你的Vagrantfile,添加shell provisioner:
Vagrant.configure("2") do |config| # 其他配置... config.vm.provision "shell", inline: <<-SHELL # 尝试删除enp0s8的默认路由(如果存在) sudo route del default dev enp0s8 || true # 或者动态调整enp0s3的默认路由度量为100(避免固定网关) DEFAULT_GATEWAY=$(ip route show dev enp0s3 | grep default | awk '{print $3}') if [ -n "$DEFAULT_GATEWAY" ]; then sudo ip route change default via $DEFAULT_GATEWAY dev enp0s3 metric 100 fi SHELL end
这个脚本会在虚拟机启动时自动执行,要么删除enp0s8的默认路由,要么调整enp0s3的路由度量,确保互联网流量走NAT接口。
方案三:通过udev规则设置接口默认度量
另一种更底层的方式是通过udev规则,在网络接口启动时自动设置它的度量值,这样路由会默认继承接口的度量优先级。
创建udev规则文件/etc/udev/rules.d/70-netmetric.rules:
SUBSYSTEM=="net", ACTION=="add", KERNEL=="enp0s3", RUN+="/sbin/ip link set dev $name metric 100" SUBSYSTEM=="net", ACTION=="add", KERNEL=="enp0s8", RUN+="/sbin/ip link set dev $name metric 200"
保存后,重启udev服务或者虚拟机,接口启动时就会自动应用度量值,对应的路由优先级也会随之调整。
内容的提问来源于stack exchange,提问作者jeiea

