简介:
Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。由于一直缺失
Dig man page文档,本文就权当一个dig使用向导吧。Dig的源码是ISC BIND大包的一部分,但是大多编译和安装Bind的文档都不把它包括在内,但是在linux系统下,它通常是某个包的一部分,在Gentoo下是bind-tools,在Redhat/Fedora下是 bind-utils,或者在Debian下是 dnsutils。
如果你要查找Bind的配置相关的信息,请详读参考文档。
看懂默认输出:最简单最常见的查询是查询一台主机,但是默认情况下,Dig的输出信息很详细。你可能不需要所有的输出,但是它确实值得知道。
查询
1 | 下面是一个带有注释的查询: |
作用
最后一段默认输出包含了查询的统计数据,可以用+[no]stats保留。
我们可以查询什么呢?
Dig可以让你有效地查询DNS,最常用的查询是A记录,TXT(文本注释),MX记录,NS记录,或者任意综合查询。
查找yahoo.com的A记录:(此处一定是域而不是主机,如我公司为xinpindao.com)
1 | dig yahoo.com A +noall +answer |
查找yahoo.com MX记录的列表:
1 | dig yahoo.com MX +noall +answer |
查找yahoo.com的权威DNS:
1 | dig yahoo.com NS +noall +answer |
查询上面所有的记录:
1 | dig yahoo.com ANY +noall +answer |
在现在这种IPv4和IPV6混用的情况下,你也可以使用AAAA的选项查询主机的IPv6 AAAA记录:
1 | dig yahoo.com AAAA +short |
如果你要查询的域允许转发,你也可以查询到相关的信息,比如DNS记录在internet上的生存周期,但是,现
在只有很少的DNS允许无限制转发。
我们怎样查询?获得精简答案呢?
当我们需要一个快速回答时,+short选项是你最好的朋友:
1 | dig yahoo.com +short |
获得一个不是十分精简的答案?
精简答案和只有一个答案是不一样的,
获得没有附加信息的详细答案的方法是使用+noall选项,这样就只保留你想要的输出。
下面是只有一个答案的精简查询,最后包含所有的配置信息,包括TTL数据,格式化的BIND配置信息。
1 | dig fsf.org mx +short |
获得一个详细答案?
通过它的man page,你可以通过+multiline选项获得冗长的多行模式人性化注释的DSN的SOA记录,一般来说,
用+multiline选项获得的信息可以显示很多,就像BIND配置文件一样。
1 | $ dig +nocmd ogi.edu any +multiline +noall +answer |
查找PTR记录?
可以用 -x的选项查找IP地址的主机名。
1 | $ dig -x 204.152.184.167 +short |
查询一个不同的命名服务器?
查询命令如下:
1 | dig @ns1.google.com www.google.com |
使用/etc/resolv.conf里面的记录查询
主机将从/etc/resolv.conf文件里面自动查询DNS记录
1 | $ host www |
但是,默认情况下,dig会产生出一些意想不到的输出。如果你想查询本地主机名而不是全域名时候,使用
+search 选项
1 | dig www +search |
处理大部分的查询?
如果你想查询大量的主机名,你可以把它们存放在一个文本文件中(一条记录一行),使用带-f参数的dig来依
次查询。
查询大量的主机名
1 | dig -f /path/to/host-list.txt |
相同的,更明确的输出
1 | dig -f /path/to/host-list.txt +noall +answer |
但是我要告诉你的是,dig 9.2.3以及以后的版本都不支持使用-f的选项反向查询了。
验证DNS映射
不正确的DNS配置会给你带来很多苦恼,你可以通过如下两种方式验证你的DNS配置:
1.每个主机名应该被解析到一个IP地址,而且那个IP地址也应该反指向那个主机名。
2.如果你子网上一个地址被反指向一个主机名,那么那个主机名也必须指向这个IP。
对于这两条规则来说,还有一些例外情况,比如CNAME应该首先解析到另外一个主机名,而且只能指向一个IP
,有时多个主机名指向了相同的IP地址,但是那个IP只能有一个PTR记录。
综上,这些有助于你检查你的DNS映射是否像你想象的那样工作。
你也可以编写一个测试脚本写入你已知的主机名,如下所示,内容很简单;它执行时当捕捉到一个CNAME时它
就会中断,如果多个主机名指向同一个IP地址它会报错。我们假设这个文件包含你的主机名叫做named-hosts。
1 | !/bin/bash |
有趣的dig
创建属于你自己的named.root文件
任何连接到internet 的DNS服务器肯定会有InterNIC的named.root文件的拷贝,文件列出所有internet的根
DNS,如果你不怕麻烦的话,你可以经常从InterNIC的ftp服务器上把它下载下来,或者,你可以使用dig命令
创建属于你自己的时髦的named.root
1 | # compare with [ftp://ftp.internic.net/domain/named.root]() |
你的TTL值在这边可能会很小,但是它是你找到最新的named.root文件!
跟踪dig的查询路径
你可能是个traceroute的狂热爱好者,经常喜欢查看如何从点A连接点B。那你可以使用dig +trace选项做类似
的事。
1 | dig gentoo.de +trace |
你可以在dig输出的头部分看到根DNS,然后找到负责解析所有*.de的DNS,最后找到gentoo.de的域名IP。
获取SOA记录
作为一个DNS管理员,我有时会(对DNS配置)做一些改变,并且想知道我的DNS解析是否推送的还是旧数据,
这个+nssearch选项可以给你的公众服务器提供清楚的统计信息。
1 | the unvarnished truth |
解释TTL数值
我喜爱google有很多原因,其中一个原因就是它在我的WEB日志中提供了精确的链接,它会使我很容易地指出
哪种类型的查询引导人们来访问这个站点的页面。
出乎意料的是,我已经看到很多请求要求查询TTL数值,我从来没想到TTL会成为最受欢迎的东东,但是你每天
都在学习新东西,所以,应大家的要求,这里稍微介绍一下TTL。
如果你从本地DNS查询互联网地址,服务器指出从哪里获得权威的答案并获得地址,一旦服务器获知答案,它
将这个答案保存在本地缓存中以免你在稍后的时间内再次查询同样的地址,这样它就会很快地从缓存中获取你
要的答案,比你再次从internet查询要快很多。
当域管理员配置DNS记录时,他们可以决定这个记录可以在缓存中保存多长时间,这就是TTL数值(通常用多少
秒来表示)。
通常地,远端服务器一般对记录的缓存只保存TTL数值长的时间。时间过期后,服务器会刷新它的本地缓存并
重新查询一个权威答案。
当你用dig来查询DNS服务器某条记录时,服务器会告诉dig这条记录可以在缓存中保持的时间长短。
举个例子,像上面写的那样,gmail.com域的MX记录的TTL值是300s,gmail.com域的管理员要求远端服务器缓
存它的MX记录不能高于5分钟,所以当你第一次查询那个记录(gmail.com的MX记录)时,dig会告诉你一个300
的TTL。
1 | dig +nocmd gmail.com MX +noall +answer |
在那之后,你查询的DNS服务器会“忘记”这个问题的答案,在你下次查询这条记录时,整个循环又将开始(本例子中是300s)。
建议
在 unix 和 linux 下,建议大家使用 dig 命令来代替 nslookup。 dig 命令的功能比 nslookup 强大很多,不像 nslookkup 还得 set 来 set 去的,怪麻烦的。
用法
下面是 dig 的一些比较常用的命令:
dig 最基本的用法
1 | dig @server qianlong.com |
用 dig 查看 zone 数据传输
1 | dig @server qianlong.com AXFR |
用 dig 查看 zone 数据的增量传输
1 | dig @server qianlong.com IXFR=N |
用 dig 查看反向解析
1 | dig -x 124.42.102.203 @server |
查找一个域的授权 dns 服务器
1 | dig qianlong.com +nssearch |
从根服务器开始追踪一个域名的解析过程
1 | dig qianlong.com +trace |
查看你使用的是哪个 F root dns server
1 | dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT |
查看 bind 的版本号
1 | dig @bind_dns_server CHAOS TXT version.bind |
你可以到 www.isc.org 去下载一个 bind for windows 的版本安装,安装后就可以在 windows 上使用 dig 命令了。^O^
1 | ftp://ftp.isc.org/isc/bind/contrib/ntbind-9.3.0/BIND9.3.0.zip |
语法
1 | dig [@server] [-b address] [-c class] [-f filename] [-k filename] [ -n ][-p port#] [-t type] [-x addr] [-y name:key] [name] [type] [class] [queryopt...] |
多条查询
dig 的 BIND9 支持在命令行上指定多个查询(支持 -f 批处理文件选项的附加功能)。每条查询可以使用自己的标志位、选项和查询选项。
在这种情况下,在上面描述的命令行语法中,每条查询自变量代表一个个别查询。每一条由任意标准选项和标志、待查询名称、可选查询类型和类以及任何适用于该查询的查询选项。
也可以使用对所有查询均有效的查询选项全局集合。全局查询选项必须位于命令行上第一个名称、类、类型、选项、标志和查询选项的元组之前。任何全局查询选项(除了 +[no]cmd 选项)可以被下面的查询特别选项重设。例如:
1 | dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr显示 dig 如何从命令行出发进行三个查询:一个针对 www.isc.org的任意查询、一个 127.0.0.1 的逆向查询,以及一个 isc.org 的 NS 记录查询。应用了 +qr 的全局查询选项,以便 dig 显示进行每条查询的初始查询。最后那个查询有一个本地查询选项 +noqr,表示 dig 在搜索 isc.org 的 NS 记录时不显示初始查询。 |
示例
一个典型的 dig 调用类似:
dig @server name type其中:
server
待查询名称服务器的名称或 IP 地址。可以是用点分隔的 IPv4 地址或用冒号分隔的 IPv6 地址。当由主机提供服务器参数时,dig 在查询域名服务器前先解析那个名称。如果没有服务器参数可以提供,dig 参考 /etc/resolv.conf,然后查询列举在那里的域名服务器。显示来自域名服务器的应答。
name
将要查询的资源记录的名称。
type
显示所需的查询类型 - ANY、A、MX、SIG,以及任何有效查询类型等。如果不提供任何类型参数,dig 将对纪录 A 执行查询。