Skip to content

Instantly share code, notes, and snippets.

@shankerwangmiao
Last active September 23, 2021 06:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shankerwangmiao/031c578370847852f18766ff359062b5 to your computer and use it in GitHub Desktop.
Save shankerwangmiao/031c578370847852f18766ff359062b5 to your computer and use it in GitHub Desktop.

DNS 实现不正确一例

故障

近来发现,苹果的一些域名解析不正常,是 NXDOMAIN,例如 mesu.apple.comcommunities.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.220122.70.142.104240e:904:800:100:8000::1482408: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 团队。该问题已经修复。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment