使用 dig 学习 DNS 入门篇

发布于 2022-04-07 12:55:29 字数 7718 浏览 1142 评论 0

Dig: Domain Information Groper

初识 dig

$ dig

; <<>> DiG 9.7.0-P1 <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8042
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;.              IN  NS

;; ANSWER SECTION:
.           16425   IN  NS  m.root-servers.net.
.           16425   IN  NS  a.root-servers.net.
.           16425   IN  NS  b.root-servers.net.
.           16425   IN  NS  c.root-servers.net.
.           16425   IN  NS  d.root-servers.net.
.           16425   IN  NS  e.root-servers.net.
.           16425   IN  NS  f.root-servers.net.
.           16425   IN  NS  g.root-servers.net.
.           16425   IN  NS  h.root-servers.net.
.           16425   IN  NS  i.root-servers.net.
.           16425   IN  NS  j.root-servers.net.
.           16425   IN  NS  k.root-servers.net.
.           16425   IN  NS  l.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net. 20514   IN  A   198.41.0.4

;; Query time: 8 msec
;; SERVER: 202.205.16.4#53(202.205.16.4)
;; WHEN: Sat Mar 16 21:29:14 2013
;; MSG SIZE  rcvd: 244

从上面的输出,你一定观察到了,当直接使用 dig 命令,不加任何参数和选项时,dig 会向默认的上连DNS服务器查询“.”(根域)的NS记录。

dig 加个点

刚才直接输入dig,这次我们在后面加上一个“.”,看看结果和刚才有何区别:

$ dig .

; <<>> DiG 9.7.0-P1 <<>> .
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28023
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;.              IN  A

;; AUTHORITY SECTION:
.           867 IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2013031600 1800 900 604800 86400

;; Query time: 40 msec
;; SERVER: 202.205.16.4#53(202.205.16.4)
;; WHEN: Sat Mar 16 21:29:48 2013
;; MSG SIZE  rcvd: 92

我想用 google-DNS 来查 baidu.com 的 A 记录

$ dig @8.8.8.8 www.baidu.com A //命令格式为dig @dnsserver name querytype

; <<>> DiG 9.7.0-P1 <<>> @8.8.8.8 baidu.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7493
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.com.         IN  A

;; ANSWER SECTION:
baidu.com.      104 IN  A   123.125.114.144
baidu.com.      104 IN  A   220.181.111.85
baidu.com.      104 IN  A   220.181.111.86

;; Query time: 39 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Mar 16 21:32:18 2013
;; MSG SIZE  rcvd: 75

从这个例子,大家学习到了dig的基本的命令格式是:

dig @dnsserver name querytype

如果你设置的dnsserver是一个域名,那么dig会首先通过默认的上连DNS服务器去查询对应的IP地址,然后再以设置的dnsserver为上连DNS服务器。

如果你没有设置@dnsserver,那么dig就会依次使用/etc/resolv.conf里的地址作为上连DNS服务器。

而对于querytype,如果你看过我上一篇有关nslookup命令的讲解,那么你应该对querytype有所了解,你可以设置A/AAAA/PTR/MX/ANY等值,默认是查询A记录。

一些常用的选项

1 -c选项,可以设置协议类型(class),包括IN(默认)、CH和HS。

2 -f选项,dig支持从一个文件里读取内容进行批量查询,这个非常体贴和方便。文件的内容要求一行为一个查询请求。来个实际例子吧:

$ cat querylist //文件内容,共有两个域名需要查询
www.baidu.com
www.sohu.com
$ dig -f querylist -c IN -t A//设置-f参数开始批量查询

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> www.sohu.com
;; Got answer:
;; ->>HEADER<

3 -4和-6两个选项,用于设置仅适用哪一种作为查询包传输协议,分别对应着IPv4和IPv6。

4 -t选项,用来设置查询类型,默认情况下是A,也可以设置MX等类型,来一个例子:

$ dig roclinux.cn -t MX

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> roclinux.cn -t MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

5 -q选项,其实它本身是一个多余的选项,但是它在复杂的dig命令中又是那么的有用。-q选项可以显式设置你要查询的域名,这样可以避免和其他众多的参数、选项相混淆,提高了命令的可读性,来个例子:

$ dig -q www.roclinux.cn

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> -q www.roclinux.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

6 -x选项,是逆向查询选项。可以查询IP地址到域名的映射关系。举一个例子:

$ dig -x 193.0.14.129

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> -x 193.0.14.129
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

dig 特有的查询选项(query option)

和刚才的选项不同,dig还有一批所谓的“查询选项”,这批选项的使用与否,会影响到dig的查询方式或输出的结果信息,因此对于这批选项,dig要求显式的在其前面统一的加上一个“+”(加号),这样dig识别起来会更方便,同时命令的可读性也会更强。

dig总共有42个查询选项,涉及到DNS信息的方方面面,如此多的查询选项,本文不会一一赘述,只会挑出最最常用的几个重点讲解。

TCP 代替 UDP

众所周知,DNS查询过程中的交互是采用UDP的。如果你希望采用TCP方式,需要这样:

$ dig +tcp www.baidu.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> +tcp www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

默认追加域

大家直接看例子,应该就能理解“默认域”的概念了,也就能理解+domain=somedomain的作用了:

dig +domain=baidu.com image

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.2 <<>> +domain=baidu.com image
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

跟踪 dig 全过程

dig非常著名的一个查询选项就是+trace,当使用这个查询选项后,dig会从根域查询一直跟踪直到查询到最终结果,并将整个过程信息输出出来。

$ dig +trace roclinux.cn 

; <<>> DiG 9.7.0-P1 <<>> +trace haolianxi.cn
;; global options: +cmd
.           15854   IN  NS  k.root-servers.net.
.           15854   IN  NS  l.root-servers.net.
.           15854   IN  NS  m.root-servers.net.
.           15854   IN  NS  a.root-servers.net.
.           15854   IN  NS  b.root-servers.net.
.           15854   IN  NS  c.root-servers.net.
.           15854   IN  NS  d.root-servers.net.
.           15854   IN  NS  e.root-servers.net.
.           15854   IN  NS  f.root-servers.net.
.           15854   IN  NS  g.root-servers.net.
.           15854   IN  NS  h.root-servers.net.
.           15854   IN  NS  i.root-servers.net.
.           15854   IN  NS  j.root-servers.net.
;; Received 244 bytes from 202.205.16.4#53(202.205.16.4) in 0 ms //从本地DNS查找到根域DNS列表

cn.         172800  IN  NS  b.dns.cn.
cn.         172800  IN  NS  e.dns.cn.
cn.         172800  IN  NS  a.dns.cn.
cn.         172800  IN  NS  c.dns.cn.
cn.         172800  IN  NS  d.dns.cn.
cn.         172800  IN  NS  ns.cernet.net.
;; Received 293 bytes from 192.203.230.10#53(e.root-servers.net) in 231 ms //选择了e.root-servers.net这台根域DNS来查找cn.域DNS列表

haolianxi.cn.       21600   IN  NS  f1g1ns2.dnspod.net.
haolianxi.cn.       21600   IN  NS  f1g1ns1.dnspod.net.
;; Received 84 bytes from 203.119.29.1#53(e.dns.cn) in 36 ms //选择了e.dns.cn这台cn.域DNS服务器来查找roclinux.cn的DNS列表

haolianxi.cn.       600 IN  A   211.157.113.168
haolianxi.cn.       600 IN  NS  f1g1ns1.dnspod.net.
haolianxi.cn.       600 IN  NS  f1g1ns2.dnspod.net.
;; Received 110 bytes from 119.167.195.12#53(f1g1ns1.dnspod.net) in 16 ms //最终查找到A记录

精简 dig 输出

1 使用+nocmd的话,可以节省输出dig版本信息。

2 使用+short的话,仅会输出最精简的CNAME信息和A记录,其他都不会输出。就像这样:

$ dig +short www.baidu.com
www.a.shifen.com.
119.75.218.77
119.75.217.56

3 使用+nocomment的话,可以节省输出dig的详情注释信息。

4 使用+nostat的话,最后的统计信息也不会输出。当+nocmd、+nocomment和+nostat都是用上,是这样:

$ dig +nocmd +nocomment +nostat www.baidu.com
;www.baidu.com.                 IN      A
www.baidu.com.          260     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       244     IN      A       119.75.217.56
www.a.shifen.com.       244     IN      A       119.75.218.77

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

lorenzathorton8

文章 0 评论 0

Zero

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

mylayout

文章 0 评论 0

tkewei

文章 0 评论 0

17818769742

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文