You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在使用systemd-networkd的系统中配置重启网络后仍生效的持久化IP路由

如何在使用systemd-networkd的系统中配置重启网络后仍生效的持久化IP路由

我来帮你解决这个持久化路由的问题,你遇到的情况我之前也碰到过,咱们一步步来梳理正确的配置方式:

先处理Cloud-init的干扰问题

你当前的50-cloud-init.yaml文件头部明确说了修改后重启会被覆盖,因为cloud-init会从OpenStack的数据源重新生成网络配置。所以第一步必须先禁用cloud-init的网络配置功能,不然任何手动修改的netplan文件都会被重置:

  1. 创建禁用配置文件:
sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg <<EOF
network: {config: disabled}
EOF
  1. 重启系统(重启更稳妥),确保cloud-init不再接管网络配置。

方法一:用Netplan配置持久化路由

现在可以安全地修改netplan文件了,建议你复制原有的50-cloud-init.yaml到一个新文件(比如60-custom-routes.yaml),这样优先级更高,不会被后续可能的cloud-init残留覆盖:

  1. 复制并编辑新的netplan文件:
sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/60-custom-routes.yaml
sudo nano /etc/netplan/60-custom-routes.yaml
  1. ethernets下的ens3部分添加你的路由配置,注意YAML对缩进敏感,必须严格对齐:
network:
  version: 2
  ethernets:
    ens3:
      # 保留原有的ens3基础配置(比如dhcp4: true之类的内容)
      routes:
        - to: {NETWORK/MASK}
          via: {GATEWAYIP}
          on-link: true
        # 如需添加多条路由,按同样格式继续添加即可
        - to: {另一个NETWORK/MASK}
          via: {另一个GATEWAYIP}
          on-link: true
  1. 应用配置并验证:
sudo netplan generate
sudo netplan apply
# 检查路由是否生效
ip route show

这样配置后,重启系统或者重启networkd服务,路由都会保留。


方法二:用systemd-networkd直接配置

如果你不想用netplan,直接用systemd-networkd的配置文件也可以,但要注意cloud-init生成的配置文件优先级可能比你自定义的高,所以最好先完成上面的禁用cloud-init网络配置步骤,然后:

  1. 重命名cloud-init生成的临时配置,避免覆盖你的自定义配置:
sudo mv /run/systemd/network/10-netplan-ens3.network /run/systemd/network/10-netplan-ens3.network.bak
  1. /etc/systemd/network/下创建(或修改)你的ens3.network文件,确保格式正确:
[Match]
Name=ens3

[Network]
# 这里要保留必要的基础网络配置,比如启用DHCP(如果之前用的是DHCP)
DHCP=ipv4
# 如果是静态IP,就填写Address=... Gateway=...等对应配置

[Route]
Destination={NETWORK/MASK}
Gateway={GATEWAYIP}
GatewayOnlink=yes

[Route]
Destination={另一个NETWORK/MASK}
Gateway={另一个GATEWAYIP}
GatewayOnlink=yes
  1. 重启systemd-networkd服务并验证:
sudo systemctl restart systemd-networkd
# 检查服务状态和日志
sudo systemctl status systemd-networkd
sudo journalctl -u systemd-networkd -f
# 检查路由是否生效
ip route show

为什么你之前的配置没生效?

  • 对于netplan:因为没禁用cloud-init,修改的50-cloud-init.yaml重启后被覆盖了,而且可能存在YAML缩进格式错误,导致配置不生效。
  • 对于systemd-networkd:cloud-init生成的10-netplan-ens3.network优先级更高(数字越小优先级越高),你的自定义配置被覆盖了,同时[Network]部分缺少必要的基础配置,导致networkd没有正确应用路由规则。

备注:内容来源于stack exchange,提问作者Xaver

火山引擎 最新活动