调试工具dig你怎么用

Posted by     "Pyker" on Sunday, April 18, 2021

TOC

关于dig

dig(域信息搜索器)是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。dig命令是一个用于询问 DNS 域名服务器的灵活的工具。它执行 DNS 搜索,显示从受请求的域名服务器返回的答复。多数 DNS 管理员利用 dig 作为 DNS 问题的故障诊断,因为它灵活性好、易用、输出清晰。虽然通常情况下 dig 使用命令行参数,但它也可以按批处理模式从文件读取搜索请求。不同于早期版本,dig 的 BIND9 实现允许从命令行发出多个查询。除非被告知请求特定域名服务器,dig 将尝试 /etc/resolv.conf 中列举的所有服务器。当未指定任何命令行参数或选项时,dig 将对“.”(根)执行 NS 查询。

安装

  • CentOS/RedHat
$ yum install -y bind-utils
  • Ubuntu/Debian
$ apt-get install dnsutils -y

dig 输出内容

本文将介绍一些常见的dig命令和字段说明 下面是一条不带任何参数的dig命令,返回结果如下。

$ dig www.ipyker.com
; <<>> DiG 9.14.12 <<>> www.ipyker.com
;; global options: +cmd
# 上面部分是一些有关于它的版本信息(version 9.2.3)和全局的设置选项,如果+nocmd在命令行下是第一个参数的话,那么这部分输出可以通过加+nocmd的方式查询出来。

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28762
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
# 这部分告诉我们一些从DNS返回的技术信息,这段信息可以用选项 +[no]comments来控制显示,但是小心,禁止掉comments也可能关闭一些其它的选项。 

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 788331a8f781cb91 (echoed)
;; QUESTION SECTION:
;www.ipyker.com.			IN	A
# 这部分告诉我们,Dig显示出我们查询的输出,默认的查询是查询A记录,你可以显示或者禁止掉这些用+[no]question选项

;; ANSWER SECTION:
www.ipyker.com.		28	IN	CNAME	ipyker.github.io.
ipyker.github.io.	28	IN	A	185.199.108.153
ipyker.github.io.	28	IN	A	185.199.110.153
ipyker.github.io.	28	IN	A	185.199.111.153
ipyker.github.io.	28	IN	A	185.199.109.153
# 这部分告诉我们,得到的查询结果。www.ipyker.com的地址是ipyker.github.io的别名,而ipyker.github.io的地址有4个,我不知道为什么你们更喜欢过滤掉这些输出,但是你可以显示或者禁止掉这些+[no]answer选项。

;; Query time: 129 msec  # 第一次查询需要请求根DNS,故有耗时,后续的查询将为0或者1,表示读取缓存。
;; SERVER: 172.20.0.10#53(172.20.0.10)
;; WHEN: Wed Apr 21 15:44:29 UTC 2021
;; MSG SIZE  rcvd: 227
# 最后一段默认输出包含了查询的统计数据,可以用+[no]stats显示或者禁止掉这些。

带上+nocmd 参数

$ dig +nocmd www.ipyker.com # +nocmd效果
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46160
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
www.ipyker.com.		30	IN	CNAME	ipyker.github.io.
ipyker.github.io.	30	IN	A	185.199.111.153
ipyker.github.io.	30	IN	A	185.199.108.153
ipyker.github.io.	30	IN	A	185.199.110.153
ipyker.github.io.	30	IN	A	185.199.109.153

;; Query time: 0 msec
;; SERVER: 172.20.0.10#53(172.20.0.10)
;; WHEN: Wed Apr 21 15:50:11 UTC 2021
;; MSG SIZE  rcvd: 215

带上+nocomments 参数

$ dig +nocmd +nocomments www.ipyker.com         # +nocmd、+nocomments效果
;www.ipyker.com.			IN	A
www.ipyker.com.		24	IN	CNAME	ipyker.github.io.
ipyker.github.io.	24	IN	A	185.199.111.153
ipyker.github.io.	24	IN	A	185.199.108.153
ipyker.github.io.	24	IN	A	185.199.110.153
ipyker.github.io.	24	IN	A	185.199.109.153
;; Query time: 0 msec
;; SERVER: 172.20.0.10#53(172.20.0.10)
;; WHEN: Wed Apr 21 15:50:17 UTC 2021
;; MSG SIZE  rcvd: 227

带上+noquestion参数

$ dig +noquestion www.ipyker.com # 带上+noquestion选项效果

; <<>> DiG 9.14.12 <<>> +noquestion www.ipyker.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19721
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; ANSWER SECTION:
www.ipyker.com.		30	IN	CNAME	ipyker.github.io.
ipyker.github.io.	30	IN	A	185.199.109.153
ipyker.github.io.	30	IN	A	185.199.110.153
ipyker.github.io.	30	IN	A	185.199.108.153
ipyker.github.io.	30	IN	A	185.199.111.153

;; Query time: 0 msec
;; SERVER: 172.20.0.10#53(172.20.0.10)
;; WHEN: Wed Apr 21 15:54:26 UTC 2021
;; MSG SIZE  rcvd: 215

带上+noanswer 参数

$ dig +noanswer www.ipyker.com  # 带上+noanswer选项效果
; <<>> DiG 9.14.12 <<>> +noanswer www.ipyker.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8357
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

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

;; Query time: 0 msec
;; SERVER: 172.20.0.10#53(172.20.0.10)
;; WHEN: Wed Apr 21 15:57:49 UTC 2021
;; MSG SIZE  rcvd: 215

带上+nostats 参数

$ dig +nostats www.ipyker.com  # 带上+nostats选项效果
; <<>> DiG 9.14.12 <<>> +nostats www.ipyker.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27472
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
www.ipyker.com.		30	IN	CNAME	ipyker.github.io.
ipyker.github.io.	30	IN	A	185.199.108.153
ipyker.github.io.	30	IN	A	185.199.111.153
ipyker.github.io.	30	IN	A	185.199.110.153
ipyker.github.io.	30	IN	A	185.199.109.153

flags: qr aa rd ra解析

  • qr: 指定此消息是查询(0)还是响应(1)
  • aa: 本次查询来自权威DNS源,如果这里的标志部分不包含aa标志,则表示结果来自缓存,而不是直接来自权威来源。
  • rd: 递归查询,默认情况下,除非您设置+norecurse命令行标志,否则dig将发送递归查询(在查询标头中设置了RD)。
  • ra: 递归查询支持的诊断测试,如果服务器支持递归查询,则响应将在响应头中设置“可用递归” RA位。
  • ad: 已认证的数据(仅适用于DNSSEC;指示数据已经过验证)
  • cd: 检查已禁用(仅DNSSEC;在接收服务器上禁用检查)

DNS 排错标志:

Response code 它显示来自 DNS 查找的详细信息 , 其中包括为什么查询失败 :

  • NOERROR(0) : 查询成功
  • NXDOMAIN(3) : DNS 服务器提示不存在这样的名称
  • SERVFAIL(2) : DNS 服务器停机或 DNSSEC 响应验证失败
  • REFUSED(5) : DNS 服务器拒绝回答 ( 也许是出于访问控制原因 )
  • FORMERR(1) : 格式错误(无法理解查询)
  • NOTIMPL(4) : 没有实现的查询

DNSSEC通过为DNS中的数据添加数字签名信息,使得客户端在得到应答消息后可以通过检查此签名信,使得客户端在得到应答消息后可以通过检查此签名信息来判断应答数据是否权威和真实,从而为 从而为DNS数据提供数据来源验证和数据完整性检验,可以防止针对 可以防止针对DNS的相关攻击.

其他dig命令

$ dig @8.8.8.8 www.ipyker.com  # 指定8.8.8.8的dns来解析www.ipyker.com
$ dig www.ipyker.com A +noall +answer # 指定要查询的A记录 
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.2 <<>> www.ipyker.com +noall +answer
;; global options: +cmd
www.ipyker.com.		282	IN	CNAME	ipyker.github.io.
ipyker.github.io.	282	IN	A	185.199.111.153
ipyker.github.io.	282	IN	A	185.199.110.153
ipyker.github.io.	282	IN	A	185.199.109.153
ipyker.github.io.	282	IN	A	185.199.108.153

$ dig www.ipyker.com CNAME +noall +answer # 指定要查询的CNAME记录 ,其他的还有MX,NS,TXT,AAAA等

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.2 <<>> www.ipyker.com CNAME +noall +answer
;; global options: +cmd
www.ipyker.com.		271	IN	CNAME	ipyker.github.io.

如果你要查询的域允许转发,你也可以查询到相关的信息,比如DNS记录在internet上的生存周期,但是,现在只有很少的DNS允许无限制转发。 我们怎样查询?获得精简答案?当我们需要一个快速回答时,+short选项是你最好的朋友:

$ dig www.ipyker.com +noall +answer +short
ipyker.github.io.
185.199.108.153
185.199.110.153
185.199.111.153
185.199.109.153

下面这段只返回解析记录,和直接执行nslookup很像。

$ dig +nocmd www.ipyker.com A +noall +answer
www.ipyker.com.		199	IN	CNAME	ipyker.github.io.
ipyker.github.io.	199	IN	A	185.199.109.153
ipyker.github.io.	199	IN	A	185.199.111.153
ipyker.github.io.	199	IN	A	185.199.110.153
ipyker.github.io.	199	IN	A	185.199.108.153

反解析,PTR解析,可以用-x的选项查找IP地址的主机名。

$ dig -x 185.199.111.153 +short # 通过+short直接获取值
cdn-185-199-111-153.github.com.

SRV记录

SRV记录(服务定位资源记录)是域名系统中用于指定服务器提供服务的位置(如主机名和端口)数据。它在DNS记录中的是个新鲜面孔,在RFC2082中才对SRV记录进行了定义,因此有很多老旧服务器并不支持SRV记录。SRV在RFC2082定义的标准记录格式如下:

_Service._Proto.Name TTL Class SRV Priority Weight Port Target

例如解析一条thanos-receiver的SRV记录

$ dig srv _grpc._tcp.thanos-receiver.monitor.svc.cluster.local
...
;; ANSWER SECTION:
_grpc._tcp.thanos-receiver.monitor.svc.cluster.local. 6	IN SRV 0 33 10901 10-59-155-238.thanos-receiver.monitor.svc.cluster.local.
_grpc._tcp.thanos-receiver.monitor.svc.cluster.local. 6	IN SRV 0 33 10901 10-59-42-68.thanos-receiver.monitor.svc.cluster.local.
_grpc._tcp.thanos-receiver.monitor.svc.cluster.local. 6	IN SRV 0 33 10901 10-59-48-162.thanos-receiver.monitor.svc.cluster.local.

;; ADDITIONAL SECTION:
10-59-48-162.thanos-receiver.monitor.svc.cluster.local.	6 IN A 10.59.48.162
10-59-42-68.thanos-receiver.monitor.svc.cluster.local. 6 IN A 10.59.42.68
10-59-155-238.thanos-receiver.monitor.svc.cluster.local. 6 IN A	10.59.155.238
...

可以看到这条SRV记录里面,分别返回了三个服务的IP地址、端口、以及服务的优先级和权重.

「真诚赞赏,手留余香」

云原生与运维

真诚赞赏,手留余香

使用微信扫描二维码完成支付


comments powered by Disqus