2.3 域名解析环节实践
额外知识
你猜世界上规模最大、交互最频繁且最没存在感的分布式系统是什么?
DNS(Domain Name System,域名系统)是最重要的互联网基础设施系统,没有之一。2021 年期间互联网发生了几起影响颇大的服务宕机故障均与 DNS 系统有关:
- 7月22日 Aakamai Edge DNS 故障,造成 PlayStation Network、HBO、UPS、Airbnb、Salesforce 等众多知名网站宕机[1];
- 不久之后的10月4日,社交网络平台 Facebook 及旗下服务 Messenger、Instagram、WhatsApp、Mapillary 与 Oculus 发生全球性宕机[2]。
这些故障影响范围为何如此之广?带着这些问题,我们开始 DNS 的篇节。
2.3.1 域名解析的工作原理
我们在浏览器输入一个域名时,DNS 负责将该域名解析为相应的 IP 地址,以便后续与目标服务器建立 TCP/IP 连接。
分析 DNS 工作原理之前,我们先了解域名的结构。如图 2-2 所示,域名是一种树状结构,最顶层的域名是根域名(注意是一个点「.」,它是 .root 的含义,不过现在常被隐藏掉),然后是顶级域名(top-level domain,简写 TLD),再是一级域名、二级域名、三级域名。
图 2-2 DNS域名结构
继续看域名是如何进行解析,DNS 解析流程如图 2-3 所示。
图 2-3 DNS 解析流程
- 用户向 Recursive resolver( DNS 解析器,例如电信运营商的 114.114.114.114)发出解析 thebyte.con.cn 域名请求。
- Recursive resolver 判断是否存在解析缓存,如存在返回缓存结果。如无则就近向 Root nameserver(根域名服务器)请求所属 TLD nameserver。
- 获取 com.cn. 域的 TLD nameserver 后, 向该地址请求 [thebyte].com.cn. 的 Authoritative nameserver(权威解析服务器)。
- 得到 Authoritative nameserver 地址后,向该服务获取域名对应的 IP 地址,域名解析过程结束。
回顾整个流程,有 2 个环节容易发生问题:
- Recursive resolver 是客户端与 DNS 域名服务器的中间人,容易出现解析污染或者 DNS 解析器宕机,这种情况会导致域名解析出现局部不可用;
- Authoritative nameserver 出现故障,这种情况会导致全局域名解析不可用,但出现故障的概率极低。
下面我们继续看看如果 DNS 解析出现故障了该如何排查。
2.3.2 DNS 故障排查
如果碰到服务不可用、Unknown host 等错误时,可以先用几个运维命令确认是否为 DNS 解析阶段出现问题。
第一个介绍的是 nslookup 命令,该命令用于查询 DNS 的记录、域名解析是否正常等。
nslookup 命令示例:
$ nslookup thebyte.com.cn
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: thebyte.com.cn
Address: 110.40.229.45
返回信息说明:
- 第一行的 Server 为当前使用的 Recursive resolver。
- Non-authoritative answer 因为 Recursive resolver 只是转发 Authoritative nameserver 的记录,所以为非权威应答。
- Address 为解析结果,上面的解析可以看到是一个 A 记录 110.40.229.45。
nslookup 返回的结果比较简单,如果想获取更多的信息,可以尝试使用 dig 命令。
dig命令示例:
$ dig thebyte.com.cn
; <<>> DiG 9.10.6 <<>> thebyte.com.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63697
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;thebyte.com.cn. IN A
;; ANSWER SECTION:
thebyte.com.cn. 599 IN A 110.40.229.45
;; Query time: 14 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri May 12 15:22:33 CST 2023
;; MSG SIZE rcvd: 59
返回信息说明:
- 第一段 opcode 为 QUERY,表示执行查询操作,status 为 NOERROR,表示解析成功。
- 第二段 QUESTION SECTION 部分显示了发起的 DNS 请求参数,A 表示我们默认查询 A 类型记录。
- 第三段 ANSWER SECTION 部分为 DNS 查询结果,可以看到 thebyte.com.cn. 的解析结果为 110.40.229.45。
- 最后一段为查询所用的 Recursive resolver、耗时等信息。
Facebook 2021 年 10 月宕机故障中,使用 dig 排查各个公共 Recursive resolver,全部出现 SERVFAIL 错误,这说明是权威解析服务器出现了问题。
➜ ~ dig @1.1.1.1 facebook.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31322
;facebook.com. IN A
➜ ~ dig @1.1.1.1 whatsapp.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31322
;whatsapp.com. IN A
..
下一节,我们以 Facebook 为例,体会 Authoritative nameserver 出现故障时会是什么影响。