DNS(Domain Name System,域名系统)也许是我们在网络中最常用到的服务,它把容易记住的域名,如 www.google.com 翻译成人类不易记住的IP地址,如 173.194.127.132,以便在方便人类输入的基础上让计算机能够精确地在网络中找到目标机器。dig(Domain Information Groper)是一个比较常用的 dns 分析及调试工具,一般 Linux 和 Mac 都已默认安装。

# DNS解析

如果想知道 www.waltersun.cn 被解析到什么IP地址,可以用如下命令(ping命令也可以,但本文专注于dig命令)

[walter@B-Q9VTML85-1821 ~ % dig www.waltersun.cn +noall +answer

; <<>> DiG 9.10.6 <<>> www.waltersun.cn +noall +answer
;; global options: +cmd
www.waltersun.cn.  230  IN  A  118.195.145.14

参数 +noall 和 +answer 只是为了输出更精简。

先忽略第3、4行,着重看最后一行,它分为5部分:

  • 第1部分是我们查询的域名;
  • 第2部分是缓存失效时间ttl(秒),暂且不关心;
  • 第3部分是 IN,表示类别 Internet,一般也都是这个类别;
  • 第4部分很重要,表示这行记录的种类(type),该行种类是 A(Address),说明这是一个A记录,描述域名对应的地址;
  • 第5部分好理解,就是地址了。(119.195.145.14 就是我的网站公网 IP)

# dig命令

dig 命令是如何知道域名所对应的 IP 地址的呢?可以加上 +stats 参数,让 dig 打印基本的统计信息。

[walter@B-Q9VTML85-1821 ~ % dig www.waltersun.cn +noall +answer +stats

; <<>> DiG 9.10.6 <<>> www.waltersun.cn +noall +answer +stats
;; global options: +cmd
www.waltersun.cn.  1  IN  A  118.195.145.14
;; Query time: 70 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Fri Apr 29 20:06:32 CST 2022
;; MSG SIZE  rcvd: 50

答案就是:第7行的信息 SERVER 223.5.5.5 ,53 是 DNS 使用的 UDP(有时候可以是 TCP)端口。dig 默认使用 /etc/resolv.conf 配置的 DNS。

[walter@B-Q9VTML85-1821 ~ % cat /etc/resolv.conf
#
# macOS Notice
#
# This file is not consulted for DNS hostname resolution, address
# resolution, or the DNS query routing mechanism used by most
# processes on this system.
#
# To view the DNS configuration used by this system, use:
#   scutil --dns
#
# SEE ALSO
#   dns-sd(1), scutil(8)
#
# This file is automatically generated.
#
search hz.ali.com
nameserver 223.5.5.5
nameserver 223.6.6.6

我们也可以指定 dig 使用其他域名服务器帮我们解析域名,例如用 谷歌的 8.8.8.8:

[walter@B-Q9VTML85-1821 ~ % dig @8.8.8.8 www.waltersun.cn +noall +answer +stats

; <<>> DiG 9.10.6 <<>> @8.8.8.8 www.waltersun.cn +noall +answer +stats
; (1 server found)
;; global options: +cmd
www.waltersun.cn.  600  IN  A  118.195.145.14
;; Query time: 145 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Apr 29 20:12:11 CST 2022
;; MSG SIZE  rcvd: 61

有些互联网服务部署在全球各个地方,这个时候服务提供方就希望中国的用户访问中国机房IP,美国的用户访问美国机房IP,这个时候两个地方的域名服务器返回的结果就会不一样,我们可以用类似上述的命令验证这一点。读者可以参考国内外DNS服务器地址列表,用各个国家的服务器 dig 一下知名站点如 google.com 试试。

不过即便如此,223.5.5.5 也好,8.8.8.8 也好,都不可能知道全球所有的域名信息,事实上,全世界数以亿次的域名信息分布在无数的域名服务器上,我们可以看一下维护 www.waltersun.cn 域名信息的服务器是什么:

[walter@B-Q9VTML85-1821 ~ % dig www.waltersun.cn ns +noall +answer

; <<>> DiG 9.10.6 <<>> www.waltersun.cn ns +noall +answer
;; global options: +cmd

在 dig www.waltersun.cn 后增加 ns 参数,表示希望得到域名服务器信息(而不是默认的 A 记录),不过这次查询我们没有得到任何结果。因为这往往表示该域名的上一级域名(waltersun.cn)的域名服务器管理这个子域名,所以我们 dig waltersun.cn 看看:

[walter@B-Q9VTML85-1821 ~ % dig waltersun.cn ns +noall +answer

; <<>> DiG 9.10.6 <<>> waltersun.cn ns +noall +answer
;; global options: +cmd
waltersun.cn.    3600  IN  NS  f1g1ns2.dnspod.net.
waltersun.cn.    3600  IN  NS  f1g1ns1.dnspod.net.

结果有两行记录,和 dig A记录结果一样,各自分成5部分,第1,2,3部分和A记录结果含义一致,第4部分表示表示种类(type)是 NS(Name Server,域名服务器),第5部分自然就是域名服务器的地址了。

现在我们知道 dig 请求域名服务器 223.5.5.5 waltersun.cn 的域名信息,而 f1g1ns2.dnspod.net 和 f1g1ns1.dnspod.net 保存了 waltersun.cn 的域名信息,那么 223.5.5.5 怎么知道如何联系上 f1g1ns2.dnspod.net 或 f1g1ns1.dnspod.net 呢?这就涉及到 DNS 的分布式架构了。

整个 DNS 服务是按照树形的结构分布的,最顶级是根域名,根域名服务器保存了所有定级域名服务器的信息,顶级域名包括 com, net, edu, org, cn 等等,各个定级域名服务器又包含了下一级的域名服务器信息,如 com 域名服务器包含了 microsoft.com, amazon.com 这些域的服务器信息,这样一层层往下。

我们可以使用 dig 的 +trace 选项来仔细查看这个过程:

[walter@B-Q9VTML85-1821 ~ % dig waltersun.cn +trace
; <<>> DiG 9.10.6 <<>> waltersun.cn +trace
;; global options: +cmd
.      37  IN  NS  b.root-servers.net.
.      37  IN  NS  g.root-servers.net.
.      37  IN  NS  k.root-servers.net.
.      37  IN  NS  e.root-servers.net.
.      37  IN  NS  d.root-servers.net.
.      37  IN  NS  j.root-servers.net.
.      37  IN  NS  h.root-servers.net.
.      37  IN  NS  a.root-servers.net.
.      37  IN  NS  i.root-servers.net.
.      37  IN  NS  c.root-servers.net.
.      37  IN  NS  l.root-servers.net.
.      37  IN  NS  m.root-servers.net.
.      37  IN  NS  f.root-servers.net.
;; Received 228 bytes from 223.5.5.5#53(223.5.5.5) in 75 ms

cn.      172800  IN  NS  e.dns.cn.
cn.      172800  IN  NS  d.dns.cn.
cn.      172800  IN  NS  c.dns.cn.
cn.      172800  IN  NS  ns.cernet.net.
cn.      172800  IN  NS  a.dns.cn.
cn.      172800  IN  NS  f.dns.cn.
cn.      172800  IN  NS  g.dns.cn.
cn.      172800  IN  NS  b.dns.cn.
cn.      86400  IN  DS  57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn.      86400  IN  RRSIG  DS 8 1 86400 20220512050000 20220429040000 47671 . l8UxIo1T168LOpH4EoBWz1b3/d6KdQC3/5n4SUEfZgXxS4qAp26WT4YS 62qkmbLSlcLvWsMQ4PI+50NjcSLqHUYu5e2A6slrpIzG4N3KQsx2fijv u8t6Xm7BuY89CUZaUQIn7N14bRgYb9B/7Yvn/1+ZecH9Xa1zNKy6czRQ SglmVwV6prny4irYeWaQtiINz02GZ1xgV+ScCjips+07zovhzngxqhYV PFlyyeD3pO0sPAThGqR636S+97CASn4TGJki8kJnYE/u5C8zB8y/Y2DI EuQvZ1TFCIMvGr5dxOtJ9Lanrsc0PX3d6GGGB3v/20ZzBfyrRJYoxvS+ emo8lA==
;; Received 705 bytes from 192.36.148.17#53(i.root-servers.net) in 59 ms

waltersun.cn.    86400  IN  NS  f1g1ns1.dnspod.net.
waltersun.cn.    86400  IN  NS  f1g1ns2.dnspod.net.
3qdaqa092ee5belp64a74ebnb8j53d7e.cn. 21600 IN NSEC3 1 1 10 AEF123AB 3QHKTF6LTFG8AAFUUAJSR8RVAJP99SFU  NS SOA RRSIG DNSKEY NSEC3PARAM
3qdaqa092ee5belp64a74ebnb8j53d7e.cn. 21600 IN RRSIG NSEC3 8 2 21600 20220513133757 20220413130511 38388 cn. g+AhBfqp/RPdA6q61n4JFsO24Go4jkNZYEyTjW0nezf+wN+jj1N9CN87 sBDEwljwudxVhyjHBODdZTdlV0ZSyMYUvgZXfoIh90AR/bu8kzDhUdq+ wVdMye86MQts52L9oZq+SBywnYjW6MwJwkaPwtqoGUzit1xi0DogjaRB T8I=
0eisj5s8dnvffh6p994hrmn2he7ssfng.cn. 21600 IN NSEC3 1 1 10 AEF123AB 0GV380P4UKR14NG4STU2POQH1KH3TDOV  CNAME RRSIG
0eisj5s8dnvffh6p994hrmn2he7ssfng.cn. 21600 IN RRSIG NSEC3 8 2 21600 20220513133003 20220413130501 38388 cn. hussyf3qpMLFD27mS51w6N8FYDbpvvNgGyrEFbr2i2Ca1VWafFZDQAOh XuPVJ3GwydQRanxu1f5I5pG7DMNJH/e6ISm1cbCQlCC1Xyd7cAMuKhA7 MNEBil6wER9Y9R299FBYX2g2fSgTVImdQp6fapbOyv/wrF15B67Ffk/5 VbI=
;; Received 662 bytes from 203.119.28.1#53(d.dns.cn) in 4 ms

waltersun.cn.    180  IN  SOA  f1g1ns1.dnspod.net. freednsadmin.dnspod.com. 1616995624 3600 180 1209600 180
;; Received 118 bytes from 61.151.180.52#53(f1g1ns1.dnspod.net) in 12 ms

dig 直接请求的 223.5.5.5 并不知道 waltersun.cn 的 A 记录是什么,它就去让 dig 去问根域名服务器,根域名服务器也不知道,让 dig 去问 cn 的域名服务器,cn 域名服务器也不知道,就让 dig 去问 f1g1ns2.dnspod.net 和 f1g1ns1.dnspod.net,而我们知道,这两个域名服务器保存了 waltersun.cn 的 A记录。这种一问一答的解析方式,叫做迭代解析(Iterative resolution)。这种方式下,每个域名服务器只是给出它所知道的最佳答案。

另外一种解析方式是递归解析(recursive resolution),如果我们不给 dig 加上 +trace 参数,dig 就会给域名服务器 223.5.5.5 一个递归解析请求,等于告诉是让 223.5.5.5 直接负责去解析到最终答案,然后直接返回给 dig。通常情况下客户端(dig)对域名服务器发起的递归解析请求,而域名服务器对其他域名服务器的请求(如 223.5.5.5 对根域名服务器)是迭代解析请求。

最近更新时间: 2023/7/10 17:32:37