dig Domain Information Groper

本原创文章属于《Linux大棚》博客。

博客地址为http://roclinux.cn

DNS解析完整过程

  1. 用户向本地DNS发出解析请求
  2. 本地DNS向根服务器(根服务器地址在本地有个静态列表)请求谁是该域名的顶机DNS(并把结果缓存在本地)
  3. 根DNS告诉本地DNS谁是该域的顶级DNS
  4. 本地DNS向顶级DNS请求谁是权威DNS(并缓存在本地)
  5. 应答谁是该域权威DNS
  6. 本地DNS向权威DNS请求域名解析(并把结果缓存在本地)
  7. 权威服务器应答6的请求
  8. 本地DNS把结果告诉用户

初次见面

我相信使用nslookup的同学一定比使用dig的同学多,所以还是有必要花些时间给大家介绍一下dig的。

dig,和nslookup作用有些类似,都是DNS查询工具。

dig,其实是一个缩写,即Domain Information Groper。

一些专业的DNS管理员在追查DNS问题时,都乐于使用dig命令,是看中了dig设置灵活、输出清晰、功能强大的特点。

最简单的dig用法

最简单的dig用法,当然就是直接输入dig按回车。

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

;; QUESTION SECTION:
;.              IN  NS

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

;; Query time: 11 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Apr 22 01:50:09 2016
;; MSG SIZE  rcvd: 228

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

dig加个点

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

dig .

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

;; QUESTION SECTION:
;.              IN  A

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

;; Query time: 7 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Apr 22 01:51:22 2016
;; MSG SIZE  rcvd: 92

指定DNS解析A记录

dig @114.114.114.114 www.baidu.com A

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

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

;; ANSWER SECTION:
www.baidu.com.      1162    IN  CNAME   www.a.shifen.com.
www.a.shifen.com.   274 IN  A   180.97.33.108
www.a.shifen.com.   274 IN  A   180.97.33.107

;; Query time: 42 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Fri Apr 22 01:53:23 2016
;; MSG SIZE  rcvd: 90

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

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

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

一些常用的选项

dig特有的查询选项

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

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

TCP代替UDP

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

dig @114.114.114.114 +tcp www.baidu.com

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

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

;; ANSWER SECTION:
www.baidu.com.      607 IN  CNAME   www.a.shifen.com.
www.a.shifen.com.   35  IN  A   180.97.33.108
www.a.shifen.com.   35  IN  A   180.97.33.107

;; Query time: 40 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Fri Apr 22 02:02:38 2016
;; MSG SIZE  rcvd: 90

默认追加域

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

dig +domain=baidu.com image

; <<>> DiG 9.8.3-P1 <<>> +domain=baidu.com image
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17582
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
image.baidu.com.    716 IN  CNAME   image.n.shifen.com.
image.n.shifen.com. 197 IN  A   115.239.210.36

;; Query time: 10 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Apr 22 02:04:00 2016
;; MSG SIZE  rcvd: 78

跟踪dig全过程

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

dig +trace roclinux.cn

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

cn.         172800  IN  NS  a.dns.cn.
cn.         172800  IN  NS  b.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  e.dns.cn.
;; Received 292 bytes from 192.36.148.17#53(192.36.148.17) in 116 ms
//选择了192.36.148.17这台根域DNS来查找cn.域DNS列表

roclinux.cn.        86400   IN  NS  ns12.edong.com.
roclinux.cn.        86400   IN  NS  ns11.edong.com.
;; Received 76 bytes from 203.119.27.1#53(203.119.27.1) in 985 ms
//选择了203.119.27.1来查找roclinux域的DNS列表

roclinux.cn.        3600    IN  A   116.255.245.206
roclinux.cn.        3600    IN  NS  ns12.edong.com.
roclinux.cn.        3600    IN  NS  ns11.edong.com.
;; Received 92 bytes from 61.147.124.145#53(61.147.124.145) in 42 ms
////最终查找到A记录

精简dig输出

dig +short www.baidu.com
www.a.shifen.com.
180.97.33.108
180.97.33.107

我们还需要学习什么

坚持看我的博客的同学,已经掌握了nslookup和dig两个DNS工具,我想,下一步你可以 自己搭建一套内部的DNS服务器了,自己设置master/slave服务器,自己添加Zone, 自己添加正解、反解,自己设置缓存超时等等,相信通过这一番折腾, 你对DNS会有不一样的理解和认识。