Dig简单实践
dig 是个DNS 查找工具,也是跟CDN 打交道时最常用的指令之一。

dig — DNS lookup utility

man page 开宗明义的说,dig 是个DNS 查找工具,也是跟CDN 打交道时最常用的指令之一。

白话的说明就是:用来查某个网址会连到哪台主机。

dig 最基本的使用方式是

dig example.com

加上一点点的参数,则是

dig [@server] [name] [type]

name 代表你想查询的domain; type 代表record 类型,包含了A, AAAA, CNAME, ANY … 等,预设为A ;@server 则是指你想query 的DNS 服务器。

有趣的是,后面参数似乎是可以互换位置的,例如说

dig @168.95.1.1 any www.apple.com
dig @168.95.1.1 www.apple.com any
dig www.apple.com @168.95.1.1 any

以上三种输入会得到一样的结果,所以可能会在不同的用户或是说明页上看到不同的顺序。

以 www.google.com 为例,从我所在的地方得到这个结果(省去部份输出,以下皆同):dig [www.google.com](http://www.google.com/)

; <<>> DiG 9.10.6 <<>> www.google.com
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 208 IN A 172.217.160.100
;; SERVER: 1.1.1.1#53(1.1.1.1)

其中看到 [www.google.com.](http://www.google.com./) 208 IN A 172.217.160.100 这是一笔A record,代表DNS 解析出来的主机,代表你在浏览器输入 www.google.com  ,DNS 会告诉你把request 送到该主机。

而 SERVER: 1.1.1.1#53(1.1.1.1) 则是我使用的Public DNS ,如果你设定为google 或中华电信,那就会是8.8.8.8 之类的。53 Port 是DNS 预设的Port 。(突然就知道AWS Route 53 这样命名的原因了!)

@nameserver

有时候因为各式各样的原因,你希望把query 送给不同的DNS ,请加上这个参数。例如说

dig www.apple.com @1.1.1.1

ANY

一种特殊的record type,ANY 会列出所有找到的record。

… 本来应该是这样的,但是我在整理这篇笔记的时候却发现,希望拿到 anything 的时候, dig 却给你 nothing。

看看 dig [www.apple.com](http://www.apple.com/) 的输出:

; <<>> DiG 9.10.6 <<>> www.apple.com
;; ANSWER SECTION:
www.apple.com.  1794 IN CNAME www.apple.com.edgekey.net.
www.apple.com.edgekey.net. 21594 IN CNAME www.apple.com.edgekey.net.globalredir.akadns.net.
www.apple.com.edgekey.net.globalredir.akadns.net. 3594 IN CNAME e6858.dscx.akamaiedge.net.
e6858.dscx.akamaiedge.net. 14 IN A 23.48.141.18

这代表 www.apple.com 设置了 cname ,一路找到最后拿到 A record 是 23.48.141.18 。

再看看加上 ANY dig [www.apple.com](http://www.apple.com/) ANY 的结果:

; <<>> DiG 9.10.6 <<>> 
www.apple.com any
;; QUESTION SECTION:
;www.apple.com.   IN ANY

蛤?不止没有结果,连 ANSWER SECTION 都不见了?

后来找到 Cloudflare 的说明,ANY 已经在 RFC8482 中正式弃用,而且对于弃用后的 response 没有明确的标准,也就是说,会根据 DNS 有所不同

例如说,如果用中华电信的 DNS 会得到不太一样的结果:

; <<>> DiG 9.10.6 <<>> www.apple.com ANY @168.95.1.1
...
;; ANSWER SECTION:
www.apple.com.  1758 IN CNAME www.apple.com.edgekey.net.

大部份关于 dig 的说明都会提到这个 ANY ,拿来使用也不会拿到很明显的错误消息,但因为结果有很高的不确定性,使用上必需特别注意。

+trace

列出 Query 一路过关斩将的历程,我们还是用 www.apple.com 来看看:

dig www.apple.com +trace
; <<>> DiG 9.10.6 <<>> www.apple.com A +trace
...
.   510971 IN NS f.root-servers.net.
.   510971 IN NS g.root-servers.net.
.   510971 IN NS h.root-servers.net.
...
;; Received 525 bytes from 1.1.1.1#53(1.1.1.1) in 10 ms
...
com.   172800 IN NS c.gtld-servers.net.
...
;; Received 1173 bytes from 192.5.5.241#53(f.root-servers.net) in 11 ms
apple.com.  172800 IN NS a.ns.apple.com.
apple.com.  172800 IN NS b.ns.apple.com.
;; Received 778 bytes from 192.35.51.30#53(f.gtld-servers.net) in 45 ms
www.apple.com.  1800 IN CNAME www.apple.com.edgekey.net.
;; Received 81 bytes from 204.26.57.1#53(d.ns.apple.com) in 88 ms

(这次的输出很长,删掉满多的),但仍可以看到一路转发的过程:

从 root (.) 的 13 台 server,查到 .com. gTLD , 再从 gTLD 的 server 查到 apple.com. 最后拿到 [www.apple.com.edgekey.net.](http://www.apple.com.edgekey.net./) 详细的 Name Server 架构可以参考鸟哥的文章


一点个人开发配着用的小手段 & 好用工具

配合 watch 使用 watch -n 10 dig [www.apple.com](http://www.apple.com/)

科技始终来自于惰性。DNS 生效常常需要一定的时间,每十秒自动挖一次就不用三不五时自己看了。

whatsmydns

网络服务,可以快速的从世界各处查 DNS 解析

DNS Checker

网络版的 Dig

让业务之类的非技术人员,电脑没有装 dig 又临时需要用到的人使用

https://toolbox.googleapps.com/apps/dig/

RFC8482 – Saying goodbye to ANYLadies and gentlemen, I would like you to welcome the new shiny RFC8482, which effectively deprecates DNS ANY query…blog.cloudflare.com


上次修改於 2022-11-22