通过 cloud-init 覆盖提供商 DNS

通过 cloud-init 覆盖提供商 DNS

我想用我自己的自定义 DNS 条目覆盖云提供商提供的 DNS。这是一个 Ubuntu 实例,因此在 netplan 中配置。我的 VM 启动后,我可以在 中看到以下内容/etc/netplan/50-cloud-init.yaml

network:
    version: 2
    ethernets:
        eth0:
            addresses:
            - 2a01:5f8:c013:170::1/64
            dhcp4: true
            match:
                macaddress: 97:00:01:b7:00:20
            nameservers:
                addresses:
                - 2a01:4ff:ff00::add:2
                - 2a01:4ff:ff00::add:1
            routes:
            -   on-link: true
                to: default
                via: fe80::1
            set-name: eth0

这是仅支持 ipv6 的虚拟机,因此提供商似乎明确设置了所有 ipv6 信息(而不是依赖 DHCP6 或 SLAAC 之类的东西)。我猜启用 dhcp4 是作为某种后备或用于本地网络 ipv4 通信,因为此服务器上没有公共 ipv4 地址。

现在我显然可以更改这些名称服务器并运行,netplan apply然后systemctl restart systemd-resolved就成功了。但由于此 netplan 文件是由 cloud-init 生成的,因此更改不会在重新启动后继续存在。因此,我需要通过提供 .netplan 文件来与我的提供商 (Hetzner) 一起自定义 cloud-init user-data.yml

我只想覆盖 DNS 但保留来自供应商数据的所有其他网络信息,因此我创建了一个如下所示的 user-data.yml 文件:

#cloud-config
network:
  version: 2
  ethernets:
    eth0:
      nameservers:
        addresses:
        - 2a00:1098:2c::1
        - 2a00:1098:2b::1
        - 2a01:4f9:c010:3f02::1

我启动了一台新机器来测试它,但没有任何效果。 :( 它仍然具有来自我的提供商的 DNS 条目,并且没有提及我的自定义 DNS 条目。我一定是对 cloud-init 存在误解。我以为它合并了 vendor-data.yml 和 user-data.yml 并将其提供给 cloud-init,但显然不是。

我的强力解决方法是利用 netplan 本身可以接受 yaml 文件目录并将它们合并在一起的事实。我通过 cloud-init 删除一个具有更高优先级的额外 netplan 文件,然后添加额外的重新启动,因为在文件删除时网络似乎已经应用。示例:

#cloud-config
write_files:
 - path: /etc/netplan/40-nat64-dns.yaml
   content: |
     network:
       version: 2
       ethernets:
         eth0:
           nameservers:
             addresses:
             - 2a00:1098:2c::1
             - 2a00:1098:2b::1
             - 2a01:4f9:c010:3f02::1
   permissions: '0644'
runcmd:
 - reboot

这可行,但感觉像黑客攻击,我不喜欢额外的重启。我可以通过运行然后来避免额外的重启,netplan applysystemctl restart systemd-resolved重启比尝试重新启动网络的正确部分更简单、更可靠。由于 cloud-init有一个网络配置部分这是通往 netplan 的通道,似乎一定有更好的方法。


跟进

我确实找到了一个稍微好一点的解决方案。我可以删除一个文件来代替删除 netplan 的文件,这似乎更简单一些,然后只需重新启动 solved vs netplan 和 solved(或整个服务器)。我的新 user-data.yml:

#cloud-config
write_files:
  - path: /etc/systemd/resolved.conf.d/dns_servers.conf
    content: |
      [Resolve]
      DNS=2a00:1098:2b::1 2a01:4f9:c010:3f02::1 2a01:4f8:c2c:123f::1
      Domains=~.
    permissions: '0644'

runcmd:
  - systemctl restart systemd-resolved

由于存在直通网络配置,因此仍然似乎应该有某种方法可以将我的 user-data.yml 中的 DNS 直接覆盖到 netplan。

相关内容