重启后 DNS 服务器不侦听 IPv6

重启后 DNS 服务器不侦听 IPv6

我在 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。

相关内容