dig是什么,怎么用?

dig是一个强大而灵活的工具,用于查询DNS服务器。深入了解它的工作原理以及它能告诉你什么。

相信大家对DNS的工作方式都有一定的了解,简而言之就是正确连接到互联网的机器都能通过DNS来查询到正确注册的服务器IP地址。

dig

Linux系统上一般都默认安装了dig工具。尝试查询谷歌看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig www.google.com

; <<>> DiG 9.16.4-Debian <<>> www.google.com #dig版本
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60573
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION: #查询的域名
;www.google.com. IN A

;; ANSWER SECTION: #结果
www.google.com. 124 IN A 172.217.31.228

;; Query time: 0 msec #耗时
;; SERVER: 172.25.193.11#53(172.25.193.11) #查询的DNS服务器
;; WHEN: Mon Aug 31 09:54:36 CST 2020 #查询时间
;; MSG SIZE rcvd: 59 #字节数

如果你得到了一个这样的应答,是好消息吗?是。你得到了及时的回复。状态字段(status: NOERROR)显示没有问题。你正在连接到一个能够提供所要求的信息的名称服务器,并得到一个回复,告诉你一些关于你所查询域名的重要细节。
简而言之,你已经验证了你的系统和DNS服务器相处得很好。
其他可能的状态指标包括:

  • SERVFAIL:被查询的域名存在,但没有数据或现有数据无效。
  • NXDOMAIN:所查询的域名不存在。
  • REFUSED:该区域的数据不存在于所请求的权威服务器中,并且在这种情况下,基础设施没有设置为提供响应服务。

接下来试试一个不存在的域名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig wtfaboutthis.org

; <<>> DiG 9.16.4-Debian <<>> wtfaboutthis.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 40814
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;wtfaboutthis.org. IN A

;; AUTHORITY SECTION:
org. 58 IN SOA a0.org.afilias-nst.info. noc.afilias-nst.info. 2014067959 1800 900 604800 86400

;; Query time: 1636 msec
;; SERVER: 172.25.193.11#53(172.25.193.11)
;; WHEN: Mon Aug 31 10:04:48 CST 2020
;; MSG SIZE rcvd: 108

如果你使用ping,可能终端只会返回一句Ping request could not find host www.wtfaboutthis.org. 使用dig可以比ping获取到的信息更多。比起nslookup也更加详细,nslookup只返回一个状态,且与dig使用的系统库不同,nslookup使用了自己的一套库,某些协会也在呼吁人们停止使用nslookup,因为可能产生意外错误。

DNS记录类型和标志

查询Google时,只有一条A记录,其实还有CNAME记录。CNAME(规范名称canonical name)就像一个别名,把一个域名指向另一个域名。你查询的大多数域名不会有CNAME记录,而只有A记录。如果你运行dig localhost命令,你会看到一个A记录,它就指向127.0.0.1。A记录用于将一个名字映射到一个IP地址。
DNS记录类型包括:

  • A或AAAA:IPv4或IPv6地址
  • CNAME:别名
  • MX:邮件交换器
  • NS:名称服务器
  • PTR:一个反向条目,让你根据IP地址找到系统名称
  • SOA:表示授权记录开始
  • TXT 一些相关文本
    我们还可以在上述输出的第五行看到一系列的flags。RFC1035中定义了DNS报文头中包含的标志,甚至显示了报文头的格式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                                1  1  1  1  1  1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

RFC中描述的标志包括:

  • qr = 查询
  • rd = 进行递归查询
  • ra = 递归数据可用
  • aa = 权威答复
  • cd = 检查是否禁用
  • ad = 真实数据
  • opcode = 一个 4 位字段
  • tc = 截断
  • z(未使用)

dig进阶使用

如果你好奇dig命令执行查询时都经历了哪些过程,你可以尝试使用+trace选项。它会输出从根域到最终结果的所有信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ dig +trace github.io

; <<>> DiG 9.16.4-Debian <<>> +trace github.io
;; global options: +cmd
. 6595 IN NS f.root-servers.net.
. 6595 IN NS i.root-servers.net.
. 6595 IN NS b.root-servers.net.
. 6595 IN NS l.root-servers.net.
. 6595 IN NS c.root-servers.net.
. 6595 IN NS j.root-servers.net.
. 6595 IN NS d.root-servers.net.
. 6595 IN NS e.root-servers.net.
. 6595 IN NS h.root-servers.net.
. 6595 IN NS g.root-servers.net.
. 6595 IN NS m.root-servers.net.
. 6595 IN NS k.root-servers.net.
. 6595 IN NS a.root-servers.net.
;; Received 824 bytes from 172.25.193.11#53(172.25.193.11) in 0 ms

github.io. 3247 IN A 185.199.108.153
github.io. 3247 IN A 185.199.109.153
github.io. 3247 IN A 185.199.110.153
github.io. 3247 IN A 185.199.111.153
;; Received 102 bytes from 198.97.190.53#53(h.root-servers.net) in 37 ms

使用@符号指定服务器查询,这里我们使用经典4个8。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ dig @8.8.8.8 github.io

; <<>> DiG 9.16.4-Debian <<>> @8.8.8.8 github.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42235
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;github.io. IN A

;; ANSWER SECTION:
github.io. 3470 IN A 185.199.108.153
github.io. 3470 IN A 185.199.109.153
github.io. 3470 IN A 185.199.110.153
github.io. 3470 IN A 185.199.111.153

;; Query time: 27 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Aug 31 10:37:10 CST 2020
;; MSG SIZE rcvd: 102

接着使用-x参数,查看8.8.8.8的CNAME。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig -x 8.8.8.8

; <<>> DiG 9.16.4-Debian <<>> -x 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24658
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;8.8.8.8.in-addr.arpa. IN PTR

;; ANSWER SECTION:
8.8.8.8.in-addr.arpa. 82326 IN PTR dns.google.

;; Query time: 0 msec
;; SERVER: 172.25.193.11#53(172.25.193.11)
;; WHEN: Mon Aug 31 10:43:51 CST 2020
;; MSG SIZE rcvd: 73

在上面的结果中,IN前面的数字是TTL,DNS解析中相对重要的指标之一,表示了DNS记录在DNS服务器上的缓存时间。