我想用我自己的自定义 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 apply
但systemctl 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。