前一篇文章抽象理解DNS 介绍了 DNS 的基本知识,本文介绍查询 DNS 的一个最通用工具 dig,通过它可以更好的理解 DNS,掌握这个工具后,遇到和 DNS 有关问题时,就不会束手无策了。
DNS 命令输出格式
输入 dig rss.newyingyong.cn 命令,通常返回
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49814
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 17
;; QUESTION SECTION:
;rss.newyingyong.cn. IN A
;; ANSWER SECTION:
rss.newyingyong.cn. 600 IN A 139.129.23.162
;; AUTHORITY SECTION:
newyingyong.cn. 86398 IN NS dns10.hichina.com.
newyingyong.cn. 86398 IN NS dns9.hichina.com.
;; ADDITIONAL SECTION:
dns9.hichina.com. 3490 IN A 140.205.81.15
dns9.hichina.com. 3490 IN A 140.205.81.25
;; Query time: 5 msec
;; SERVER: 10.202.72.116#53(10.202.72.116)
;; WHEN: Sat Jul 01 11:00:38 CST 2017
;; MSG SIZE rcvd: 369
各个返回参数说明下:
status: NOERROR 表示查询没有什么错误,Query time 表示查询完成时间
SERVER: 10.202.72.116#53(10.202.72.116),表示本地 DNS 服务器地址和端口号
QUESTION SECTION 表示需要查询的内容,这里需要查询域名的 A 记录
ANSWER SECTION 表示查询结果,返回 A 记录的 IP 地址。600 表示本次查询缓存时间,在 600 秒本地 DNS 服务器可以直接从缓存返回结果
AUTHORITY SECTION 表示从那台 DNS 服务器获取到具体的 A 记录信息。记住本地 DNS 服务器只是查询,而 AUTHORITY SECTION 返回的服务器是权威 DNS 服务器,由它来维护 rss.newyingyong.cn 的域名信息。返回的 DNS 记录类型是 NS,对应的名称是 dns10.hichina.com.,dns9.hichina.com.。
ADDITIONAL SECTION 表示 NS 服务器对应的 IP 地址,这些 IP 地址对应的服务器安装了 BIND 软件。
DNS 服务器记录类型
默认 dig rss.newyingyong.cn 返回的是 A 记录类型,其他类型还包括 MX、NS、SOA 等,我们可以使用 dig -t a/mx/soa/mx rss.newyingyong.cn 进行查询。
(1)dig -t a www.weibo.com +noall +answer
;; global options: +cmd
www.weibo.com. 21 IN A 180.149.134.142
www.weibo.com. 21 IN A 180.149.134.141
其中 +noall +answer 表示返回简短信息,这里表示查询 A 记录。
注意,这里返回 2 个 A 记录,这相当于 DNS 均衡,比如浏览器客户端查询 www.weibo.com 域名得到两个 A 记录,然后连接其中的一个 IP 地址对应的 WEB 服务器,假如发现连接不上,可以使用另外一个地址连接。
比如在万网域名管理后台,可以给同一个域名添加两条 A 记录,相当于实现了域名负载均衡。
(2)dig -t ns weibo.com
注意假如用户输入 dig -t ns www.weibo.com 是查询不出 NS 任何记录的,原因在于只有一级域名(或者顶级域名)才有 NS 记录,通过 FQDN 是查询不出 NS 信息的,所以要输入 dig -t ns weibo.com ,返回:
;; ANSWER SECTION:
weibo.com. 9962 IN NS ns3.sina.com.cn.
weibo.com. 9962 IN NS ns2.sina.com.cn.
weibo.com. 9962 IN NS ns1.sina.com.cn.
weibo.com. 9962 IN NS ns4.sina.com.
weibo.com. 9962 IN NS ns4.sina.com.cn.
weibo.com. 9962 IN NS ns3.sina.com.
;; ADDITIONAL SECTION:
ns1.sina.com.cn. 14162 IN A 202.106.184.166
ns2.sina.com.cn. 14906 IN A 61.172.201.254
ns3.sina.com. 26496 IN A 61.172.201.254
ns3.sina.com.cn. 9714 IN A 123.125.29.99
ns4.sina.com. 24154 IN A 123.125.29.99
ns4.sina.com.cn. 9733 IN A 121.14.1.22
微博的权威服务器是微博自己建立的,有 6 个名称和 IP 地址:
有这么多地址,主要是防止单点问题,比如某个 NS 服务器连接不上,可以连接其他 NS 服务器
上述的 NS IP 地址属于不同的运营商,不同的运营商可能会查询对应的 NS 服务器,原因就是加速查询。
(3)dig -t a www.baidu.com
;; ANSWER SECTION:
www.baidu.com. 691 IN CNAME www.a.shifen.com.
www.a.shifen.com. 271 IN A 115.239.211.112
www.a.shifen.com. 271 IN A 115.239.210.27
这里返回的 CNAME 表示查询 www.baidu.com 的信息其实是 www.a.shifen.com 返回的 A 记录。
CNAME 的存在原因:
某个域名(A)可能会下线,但是这些域名可能还是被访问到,为了避免不友好的提示,可以将这个域名 cname 到另外个域名(B),这样访问 B 相当于返回 A。
很多公司项目可能有很多个域名,但是指定的 IP 地址可能每几个,一旦 IP 地址变化,可能要修改每个域名的 DNS 信息。假如这些域名 cname 到某个特定的域名,那么修改域名信息的时候就会非常方便。
(4)dig -t mx newyingyong.cn
;; QUESTION SECTION:
;newyingyong.cn. IN MX
;; ANSWER SECTION:
newyingyong.cn. 600 IN MX 10 mx.sina.net.
返回 MX 记录,注意这里不能输入 dig -t mx rss.newyingyong.cn ,因为 MX 记录一般配置在一级域名下。
DNS 迭代查询的具体流程
对于客户端(比如浏览器)查询本地域名 DNS 信息的时候,是递归查询的方式。而本地 DNS 服务器为了获取到某个域名的 DNS 信息,会使用迭代的方式(一步步询问)。通过 dig +trace blog.newyingyong.cn 来进行了解
;; global options: +cmd
. 18535 IN NS h.root-servers.net.
. 18535 IN NS m.root-servers.net.
. 18535 IN NS i.root-servers.net.
. 18535 IN NS d.root-servers.net.
. 18535 IN NS a.root-servers.net.
. 18535 IN NS b.root-servers.net.
;; Received 1097 bytes from 10.202.72.118#53(10.202.72.118) in 53 msec
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS c.dns.cn.
;; Received 646 bytes from 192.36.148.17#53(i.root-servers.net) in 150 msec
newyingyong.cn. 86400 IN NS dns10.hichina.com.
newyingyong.cn. 86400 IN NS dns9.hichina.com.
;; Received 589 bytes from 203.119.29.1#53(e.dns.cn) in 37 msec
blog.newyingyong.cn. 600 IN A 139.129.23.162
;; Received 64 bytes from 106.11.211.55#53(dns9.hichina.com) in 19 ms
本地 DNS 服务器首先查询根域名服务器(10.202.72.118),得到 13 组根域名服务器中的一个,并返回对应某个根域名的 NS 服务器。
根域名NS 服务器(192.36.148.17)说并不知道 blog.newyingyong.cn 顶级域名的具体信息,你去问 .cn 顶级域名服务器去把,并返回 .cn 域名服务器的 NS 记录。
.cn 域名服务器(203.119.29.1)说,我也不知道 blog.newyingyong.cn 的信息,但是我知道是阿里云管理的,并返回阿里云服务器的 NS 地址。
阿里云 DNS 服务器(106.11.211.55)说,这个域名确实是我管理的,最终返回 blog.rss.newyingyong.cn 的 A 记录(139.129.23.162)。
DNS 缓存
假如 DNS 服务器每次都需要迭代或递归查询上一级的 DNS 服务器,那么 DNS 可能就不堪重负,考虑到域名的 DNS 信息不会频繁的修改,所以每一级中的 DNS 服务器都会缓存结果(包括浏览器这样的客户端也会缓存 DNS 结果)。
缓存带来的弊端可能就是 DNS 信息可能不是最新的,比如某个域名管理员修改了某个域名的 A 记录,由于每一级的 DNS 服务器都有缓存,所以最后客户端拿到的结果不是最新的,为了获取到最新的结果,可以直接向权威域名服务器进行信息查询。
比如 blog.rss.newyingyong.cn 的域名是由 dns9.hichina.com.(106.11.211.55)管理的,可以直接通过 dig @106.11.211.55 -t a newyingyong.cn 或者 dig @dns9.hichina.com -t a newyingyong.cn 获取最新 A 记录。
另外你也可以不查询本地 DNS 服务器获取信息,比如可以使用 8.8.8.8 Google Public DNS 进行查询,dig @8.8.8.8 -t a newyingyong.cn 。
参考链接:
3 Ways to check DNS server IP in Linux