使用dig查看dns递归查询过程
使用 dig 查看 dns 递归查询过程
DNS
查询过程中如果没有命中缓存,查询实际上是一个递归过程。
DNS
解析工具 dig
提供了 trace
功能,可以展示递归查询的整个过程。以查询 www.baidu.com
为例,查询结果如下:
root@ubuntu:~# dig +trace +nodnssec www.baidu.com
;; communications error to 114.114.114.114#53: timed out; <<>> DiG 9.18.30-0ubuntu0.20.04.2-Ubuntu <<>> +trace +nodnssec www.baidu.com
;; global options: +cmd
. 2822 IN NS c.root-servers.net.
. 2822 IN NS m.root-servers.net.
. 2822 IN NS i.root-servers.net.
. 2822 IN NS g.root-servers.net.
. 2822 IN NS b.root-servers.net.
. 2822 IN NS a.root-servers.net.
. 2822 IN NS j.root-servers.net.
. 2822 IN NS e.root-servers.net.
. 2822 IN NS l.root-servers.net.
. 2822 IN NS h.root-servers.net.
. 2822 IN NS d.root-servers.net.
. 2822 IN NS k.root-servers.net.
. 2822 IN NS f.root-servers.net.
;; Received 515 bytes from 114.114.114.114#53(114.114.114.114) in 156 mscom. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
;; Received 838 bytes from 170.247.170.2#53(b.root-servers.net) in 368 ms;; UDP setup with 2001:502:8cc::30#53(2001:502:8cc::30) for www.baidu.com failed: network unreachable.
;; no servers could be reached
;; UDP setup with 2001:502:8cc::30#53(2001:502:8cc::30) for www.baidu.com failed: network unreachable.
baidu.com. 172800 IN NS ns2.baidu.com.
baidu.com. 172800 IN NS ns3.baidu.com.
baidu.com. 172800 IN NS ns4.baidu.com.
baidu.com. 172800 IN NS ns1.baidu.com.
baidu.com. 172800 IN NS ns7.baidu.com.
;; Received 356 bytes from 192.54.112.30#53(h.gtld-servers.net) in 340 mswww.baidu.com. 1200 IN CNAME www.a.shifen.com.
;; Received 100 bytes from 180.76.76.92#53(ns7.baidu.com) in 132 ms
dig trace
的输出,主要包括四部分:
第一部分,是从 114.114.114.114
查到的一些根域名服务器(.)
的 NS
记录。
第二部分,是从 NS
记录结果中选一个根域名服务器b.root-servers.net
,ip
为170.247.170.2
,并查询顶级域名 com.
的 NS
记录。
第三部分,是从 com.
的 NS
记录中选择一个定义域名服务器h.gtld-servers.net
,ip
为 192.54.112.30
,并查询二级域名baidu.com.
的 NS
服务器。
最后一部分,就是从 baidu.com.
的 NS
服务器ns7.baidu.com
查询最终主机 www.baidu.com.
的 CNAME
记录。
整理成流程图如下:
如果查询返回的是A
记录,DNS
查询流程就结束了。如果是返回的CNAME
记录,需要再次作 DNS
查询,进一步得到目标主机的IP
地址:
root@ubuntu:~# dig +trace +nodnssec www.a.shifen.com; <<>> DiG 9.18.30-0ubuntu0.20.04.2-Ubuntu <<>> +trace +nodnssec www.a.shifen.com
;; global options: +cmd
. 234 IN NS i.root-servers.net.
. 234 IN NS a.root-servers.net.
. 234 IN NS m.root-servers.net.
. 234 IN NS c.root-servers.net.
. 234 IN NS f.root-servers.net.
. 234 IN NS b.root-servers.net.
. 234 IN NS j.root-servers.net.
. 234 IN NS e.root-servers.net.
. 234 IN NS d.root-servers.net.
. 234 IN NS h.root-servers.net.
. 234 IN NS l.root-servers.net.
. 234 IN NS g.root-servers.net.
. 234 IN NS k.root-servers.net.
;; Received 515 bytes from 114.114.114.114#53(114.114.114.114) in 20 mscom. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
;; Received 841 bytes from 193.0.14.129#53(k.root-servers.net) in 4 msshifen.com. 172800 IN NS dns.baidu.com.
shifen.com. 172800 IN NS ns2.baidu.com.
shifen.com. 172800 IN NS ns3.baidu.com.
shifen.com. 172800 IN NS ns4.baidu.com.
;; Received 275 bytes from 192.5.6.30#53(a.gtld-servers.net) in 288 ms;; UDP setup with 240e:bf:b801:1002:0:ff:b024:26de#53(240e:bf:b801:1002:0:ff:b024:26de) for www.a.shifen.com failed: network unreachable.
;; no servers could be reached
;; UDP setup with 240e:bf:b801:1002:0:ff:b024:26de#53(240e:bf:b801:1002:0:ff:b024:26de) for www.a.shifen.com failed: network unreachable.
;; no servers could be reached
;; UDP setup with 240e:bf:b801:1002:0:ff:b024:26de#53(240e:bf:b801:1002:0:ff:b024:26de) for www.a.shifen.com failed: network unreachable.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
;; Received 331 bytes from 36.155.132.78#53(ns3.baidu.com) in 40 mswww.a.shifen.com. 120 IN A 110.242.69.21
www.a.shifen.com. 120 IN A 110.242.70.57
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
;; Received 363 bytes from 110.242.68.42#53(ns1.a.shifen.com) in 16 ms
关于CNAME的说明
CNAME(Canonical Name)是域名的别名记录,用于将一个域名指向另一个规范域名(主域名)。当查询到 CNAME
记录时,客户端需进一步向该规范域名发起 DNS
查询,以获取最终的 IP
地址(A
记录或 AAAA
记录)。
大型站点,例如百度为了实现负载均衡、CDN 加速或灵活管理域名,会将 www.baidu.com
配置为 CNAME
记录,指向后端的多个中间域名(如 www.a.shifen.com
、www.b.shifen.com
等)。
使用CNAME
有如下优势:
-
修改
CNAME
指向的目标域名时,无需变更原域名的解析记录,适合频繁调整后端服务的场景(如切换CDN
节点)。 -
这些中间域名最终会解析到不同的
IP
地址(A
记录),从而实现流量分发和高可用性。 -
直接使用
A
记录时,若IP
变更需等待全球DNS
缓存过期,可能导致访问中断。而CNAME
记录的TTL
(生存时间)通常较短,可更快刷新解析结果。 -
这些中间域名最终会解析到不同的
IP
地址(A
记录),从而实现流量分发和高可用性。 -
直接使用
A
记录时,若IP
变更需等待全球DNS
缓存过期,可能导致访问中断。而CNAME
记录的TTL
(生存时间)通常较短,可更快刷新解析结果。