近来发现,苹果的一些域名解析不正常,是 NXDOMAIN,例如 mesu.apple.com
、communities.apple.com
等。它们有个共同特点,就是依次经由 {mesu-cdn,communities-lb}.apple.com.akadns.net
{mesu-china,communities-cn}.apple.com.akadns.net
CNAME 到了 ioshost.qtlcdn.com
。出问题的域名就是 ioshost.qtlcdn.com
。
首先获取 qtlcdn.com
的 NS 有两个,实际指向的 IP 地址有四个,分别是 111.206.179.220
、122.70.142.104
、240e:904:800:100:8000::148
、2408:8706:0:7000:1:0:8000:220
。然后直接向这些服务器发送 DNS 请求,发现都能正常返回 A 记录,并没有返回 NXDOMAIN。
然后怀疑上述 DNS 服务器存在短时故障,遂在 DNS 服务器上清理 qtlcdn.com
的缓存。这时出现了一个怪异的现象:清理缓存后立即查询这个域名,可以返回解析,TTL 是 20 秒,但是再查一次就返回了 NXDOMAIN,两次查询的间隔也就一两秒。这说明是因为 DNS 服务器获得了一些响应,覆盖掉了 A 记录的缓存。于是直接在接口上抓取入方向源端口是 53 的包,拉入 Wireshark 分析。
分析可见,240e:904:800:100:8000::148
这个服务器对于 Type 是 65 的查询(实际上是对于所有非 A 的查询)会返回 NXDOMAIN。Type65 的 DNS 记录用于 TLS3 的 ECH (Encrypted Client Hello) 机制。推断有客户端向该 DNS 服务器发出类似查询,DNS 服务器将查询发送到出现问题的 NS 上,获得的 NXDOMAIN 的响应覆盖了缓存中的 A 记录的响应,于是产生了刚刷缓存时是好的,然后马上就坏的现象。对于存在某个域名,但是不存在对应记录的情况,正确的响应应该是空响应,状态码是 NOERROR,并且在权威节中返回 SOA 记录。
经排查,这四个服务器只有这一个服务器行为异常,解决方案也很简单,在 bind9 的配置中,指定这个服务器是 bogus,于是 bind9 就不会选这个 NS 了。
该问题会影响那些使用了支持 IPv6 的 DNS 递归服务器的用户(与用户是否支持 IPv6 无关)。
已经联系 Apple SRE 团队。该问题已经修复。