我在 AWS (Amazon Web Services) 上新建了两个 20.04 实例。一个是 t2 类型,另一个是 t3 类型。
这些实例同时配置了 IPv4 和 IPv6。您可能知道,从操作系统的角度来看,这些地址不是静态的,而是通过 AWS 的 DHCP 获得的。但是,这样的实例始终会获得相同的IPv4 和 IPv6 地址。
两个实例都有同样的问题。
我安装并配置了 DNS 服务器 (bind 9.16.1)。DNS 服务器在重启后自动启动,但似乎没有绑定到 IPv6 地址(它仅使用“链接本地地址”)。
例如,netstat
重启后会出现:
# netstat -natpu | grep /named
tcp 0 0 172.31.xx.xxx:53 0.0.0.0:* LISTEN 581/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 581/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 581/named
tcp6 0 0 fe80::xxx:xxxx:xxxx::53 :::* LISTEN 581/named
tcp6 0 0 ::1:53 :::* LISTEN 581/named
tcp6 0 0 ::1:953 :::* LISTEN 581/named
udp 0 0 172.31.xx.xxx:53 0.0.0.0:* 581/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 581/named
udp6 0 0 ::1:53 :::* 581/named
udp6 0 0 fe80::xxx:xxxx:xxxx::53 :::* 581/named
因此,我必须重新启动服务器:
# systemctl restart named
# netstat -natpu | grep /named
tcp 0 0 172.31.xx.xxx:53 0.0.0.0:* LISTEN 31425/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 31425/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 31425/named
tcp6 0 0 fe80::xxx:xxxx:xxxx::53 :::* LISTEN 31425/named
tcp6 0 0 2600:xxxx:xxx:xxxx:x:53 :::* LISTEN 31425/named
tcp6 0 0 ::1:53 :::* LISTEN 31425/named
tcp6 0 0 ::1:953 :::* LISTEN 31425/named
udp 0 0 172.31.xx.xxx:53 0.0.0.0:* 31425/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 31425/named
udp6 0 0 ::1:53 :::* 31425/named
udp6 0 0 2600:xxxx:xxx:xxxx:x:53 :::* 31425/named
udp6 0 0 fe80::xxx:xxxx:xxxx::53 :::* 31425/named
该问题似乎与网络接口无关,因为 t2 和 t3 实例使用的网络接口类型非常不同,并且之前的 Ubuntu 版本(18.04)不是有这样的问题。
我的猜测是 DNS 服务器启动得很早(在从 DHCP 获取全局 IPv6 并分配给网络接口之前)。
笔记:当安装一些包(我还没有确定是哪些)并因此处理一些触发器时,也会发生此问题。
从 DHCP 获取正确的 IPv6 地址后,如何延迟启动 DNS 服务?或者您建议其他解决方案吗?
目前,我的解决方案是将类似这样的内容放到我的“通用系统启动脚本”的末尾:
...
sleep 10 # or more
systemctl restart named.service 2>&1
...
答案1
我遇到了同样的问题,尝试修改 20.04 LTS 中的命名“bind”脚本,但没有成功。后来我换了思路,找到了通过系统延迟命名服务启动的解决方案,并通过 ASK 找到了一篇文章。
不确定为什么 ipv6 子系统和网络接口需要这么长时间才能初始化。
我使用的解决方案是在 /lib/systemd/system/named.service 文件的服务节中添加一行,如下所示。“在节标题下方插入该行”。
[服务]
ExecStartPre=-/bin/sleep 10
这似乎是解决这个问题的最佳方法,所以您不必处理启动脚本,因为这些脚本会随着软件包的更新而改变。
我正在运行一些配备最新 I5 gen 9 处理器的 Acer 笔记本电脑,在 SSD 驱动器上,它的启动速度非常快,我还遇到了其他与外围硬件接口和防火墙启动脚本的竞争条件,可以用同样的方式解决。
希望这可以帮助!
答案2
由于重复地址检测 (DAD),IPv6 需要一段时间才能加载,在此期间,地址被设置为“暂定”模式,即使已分配一个地址也无法使用。此状态将持续,直到 DAD 确认该计算机是该 IPv6 地址的唯一用户。本文将详细介绍:
https://www.agwa.name/blog/post/beware_the_ipv6_dad_race_condition
解决方案的关键部分是禁用 DAD。摘自本文:
要禁用 DAD,您需要在配置接口之前将 0 写入 /proc/sys/net/ipv6/conf/ethX/accept_dad(其中 ethX 是接口)。在 Debian 中,我使用接口节上的 pre-up 指令来实现此目的,如下所示:
iface eth0 inet6 static address 3ffe:ffff::4a:5000 netmask 64 gateway fe80::1 pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_dad
就我个人而言,我只需要投入net.ipv6.conf.eth0.accept_dad=0
我的sysctl.conf
精力就可以解决整个问题,因为我可以手动确认地址是唯一的。
PS:如果您的内核支持“Optimistic DAD”,您也可以研究一下。不过我还没有尝试过,所以 YMMV。