dig命令

最后更新:2020-07-01

Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具

1. DNS 记录的类型说明

  • 类型A记录: A记录是指定域名对应的IP地址。
  • 类型AAAA记录:该记录是将域名解析到一个指定的IPV6的IP上
  • 类型CNAME记录:通常称别名解析。可以将注册的不同域名都转到一个域名记录上,由这个域名记录统一解析管理,与A记录不同的是,CNAME别名记录设置的可以是一个域名的描述而不一定是IP地址
  • 类型NS记录: 域名服务器记录,如果需要把子域名交给其他 DNS 服务器解析,就需要添加 NS 记录。
  • 类型MX记录 :如果需要设置邮箱,让邮箱能够收到邮件,需要添加 MX 记录。
  • 类型TXT记录 : 可以写任何东西,长度限制为 255。绝大多数的 TXT记录是用来做 SPF 记录(反垃圾邮件)。

2. 语法

dig [选项] (参数)

选项

  • @<服务器地址>:指定进行域名解析的域名服务器;
  • -b:当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求;
  • -f<文件名称>:指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息;
  • -P:指定域名服务器所使用端口号;
  • -t<类型>:指定要查询的DNS数据类型;
  • -x:执行逆向域名查询;
  • -4:使用IPv4;
  • -6:使用IPv6;
  • -h:显示指令帮助信息;

参数

  • 主机:指定要查询域名主机;
  • 查询类型:指定DNS查询的类型;
  • 查询类:指定查询DNS的class;
  • 查询选项:指定查询选项;

3. 示例

3.1. 查看主机信息

$ dig www.baidu.com

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12439
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
www.baidu.com.		1156	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	213	IN	A	180.101.49.11
www.a.shifen.com.	213	IN	A	180.101.49.12

;; Query time: 33 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Jul 29 17:08:01 CST 2020
;; MSG SIZE  rcvd: 90

dig 命令默认的输出信息可以分为 5 个部分。

  • 第一部分显示 dig 命令的版本和输入的参数。可以通过+[no]cmd选项保留或删除
  • 第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。可以通+[no]comments选项保留或删除
  • 第三部分中的 “QUESTION SECTION” 显示我们要查询的域名。可以用+[no]question选项保留或删除
  • 第四部分的 “ANSWER SECTION” 是查询到的结果。可以通+[no]answer选项保留或删除
  • 第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等。可以用+[no]stats选项保留或删除
$ dig www.baidu.com +nostats +nocmd +noquestion

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> www.baidu.com +nostats +nocmd +noquestion
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6200
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; ANSWER SECTION:
www.baidu.com.		651	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	5	IN	A	180.101.49.11
www.a.shifen.com.	5	IN	A	180.101.49.12

3.2. 查下CNAME

$ dig www.baidu.com cname

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> www.baidu.com cname
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65412
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.			IN	CNAME

;; ANSWER SECTION:
www.baidu.com.		1092	IN	CNAME	www.a.shifen.com.

;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Jul 29 17:17:21 CST 2020
;; MSG SIZE  rcvd: 69

3.3. 查询A记录

$ dig baidu.com A

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> baidu.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34862
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
baidu.com.		276	IN	A	220.181.38.148
baidu.com.		276	IN	A	39.156.69.79

;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Jul 29 17:22:55 CST 2020
;; MSG SIZE  rcvd: 59

3.4. 查询所有

$ dig baidu.com ANY

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> baidu.com ANY
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36175
;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;baidu.com.			IN	ANY

;; ANSWER SECTION:
baidu.com.		503	IN	A	220.181.38.148
baidu.com.		503	IN	A	39.156.69.79
baidu.com.		85634	IN	NS	ns3.baidu.com.
baidu.com.		85634	IN	NS	dns.baidu.com.
baidu.com.		85634	IN	NS	ns7.baidu.com.
baidu.com.		85634	IN	NS	ns4.baidu.com.
baidu.com.		85634	IN	NS	ns2.baidu.com.

;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Jul 29 17:28:59 CST 2020
;; MSG SIZE  rcvd: 160

3.5. 到指定域名服务器上查询

$ dig @8.8.8.8 www.baidu.com

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> @8.8.8.8 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23325
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.baidu.com.			IN	A

;; ANSWER SECTION:
www.baidu.com.		926	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	289	IN	CNAME	www.wshifen.com.
www.wshifen.com.	258	IN	A	103.235.46.39

;; Query time: 61 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Jul 29 17:20:57 CST 2020
;; MSG SIZE  rcvd: 111

如果不指定 DNS 服务器,dig 会依次使用 /etc/resolv.conf 里的地址作为 DNS 服务器:

3.6. 显示精简结果

$ dig baidu.com +short
39.156.69.79
220.181.38.148

3.7. 查询SRV

DNS SRV 是 DNS 记录中一种,用来查询指定服务的地址。与常见的A记录、CNAME 不同的是,SRV中除了记录服务器的地址,还记录了服务的端口,并且可以设置每个服务地址的优先级和权重。RFC-2782 给出DNS SRV的建议标准,它是在2000年的时候提出来的。

访问服务的时候,本地的服务从 DNS 服务器查询到一个地址列表,根据优先级和权重,从中选取一个地址作为本次请求的目标地址。

SRV 的 DNS 类型代码为 33。SRV的记录格式为:

_Service._Proto.Name TTL Class SRV Priority Weight Port Target
Service: 服务名称,前缀“_”是为防止与DNS Label(普通域名)冲突。
Proto:   服务使用的通信协议,_TCP、_UDP、其它标准协议或者自定义的协议。
Name:    提供服务的域名。
TTL:     缓存有效时间。
CLASS:   类别
Priority: 该记录的优先级,数值越小表示优先级越高,范围0-65535。
Weight:   该记录的权重,数值越高权重越高,范围0-65535。     
Port:     服务端口号,0-65535。
Target:   host 地址。

下面部分摘自维基百科

服务记录示例:

_minecraft._tcp.example.com. 86400 IN SRV 0 5 25565 mc.example.com.

此记录指向在TCP端口25565上监听Minecraft游戏协议的 mc.example.com。此处的优先级为0,权重为5。

与MX记录一样,SRV记录中的主机必须指向已有地址记录(A或AAAA记录)的主机名。指向带有CNAME记录的主机名则无效。

负载均衡

优先级值决定记录数据的先后顺序。客户端应先尝试使用优先级最高的数据,在连接失败时尝试更低优先级的数据。若一项服务有着同一优先级的多个SRV记录,客户端则应根据记录中的权重进行负载均衡。下例中,优先度及权重值用于提供负载均衡与备份服务。

# _服务._协议.名称.       TTL   类别  SRV 优先级   权重    端口 主机.
_sip._tcp.example.com.   86400 IN    SRV 10       60     5060 bigbox.example.com.
_sip._tcp.example.com.   86400 IN    SRV 10       20     5060 smallbox1.example.com.
_sip._tcp.example.com.   86400 IN    SRV 10       20     5060 smallbox2.example.com.
_sip._tcp.example.com.   86400 IN    SRV 20       0      5060 backupbox.example.com.

前三个记录优先度均为10,故客户端将根据权重决定该联系哪台服务器(主机及端口)。三个记录的权重值相加为100,故60%的时间内客户端使用 bigbox.example.com。剩下40%的时间内,客户端会将请求发送给主机 smallbox1 和 smallbox2;其中的一半将发送给 smallbox1,另一半给 smallbox2。若bigbox不可用,则剩余两台机器由于权重相同,其将共享负载。

若三台优先级为10的服务器均不可用,则客户端将使用下一优先级的记录,即backupbox.example.com。这台机器可能为位于其他地理位置且不受造成上述三台机器不可用原因影响的主机。

由于SRV记录所提供的记录均为静态数据,其负载均衡能力天生有限。记录无法根据服务器的当前负载进行变通,除非TTL值足够低(一分钟或更小)才能使优先级(或权重值)迅速更新。

使用consul模拟

$ dig @127.0.0.1 -p 8600 web2.service.consul srv

; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> @127.0.0.1 -p 8600 web2.service.consul srv
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4786
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web2.service.consul.		IN	SRV

;; ANSWER SECTION:
web2.service.consul.	0	IN	SRV	1 1 81 iZuf6fbha9mr8eysoj3mabZ.node.dc1.consul.

;; ADDITIONAL SECTION:
iZuf6fbha9mr8eysoj3mabZ.node.dc1.consul. 0 IN A	127.0.0.1
iZuf6fbha9mr8eysoj3mabZ.node.dc1.consul. 0 IN TXT "consul-network-segment="

;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Jul 29 20:50:06 CST 2020
;; MSG SIZE  rcvd: 159

IP地址在ADDITIONAL

Edgar

Edgar
一个略懂Java的小菜比