TL;DR
两者工具在使用时会有一些差别。对于运维人员来说,dig无疑还是更好的选择,资料更多、对脚本更加友善、支持的发行版也更全。可如果考虑到dig工具“背负”的libbind9.so
libisc.so
等等,对比drill优雅的libldns.so
。相信你能作出自己的选择。
引子
随着dig
工具与bind
服务器的项目内高度耦合,使得dig工具的二进制包变得非常臃肿,拿ArchLinux发行版来讲,约6MB:1MB的区别。
但是4年过去了,网上铺天盖地的仍是dig教程,所以就有了这篇关于drill工具的使用简介。
简单说明
由NLnetlabs发起的ldns项目,自1.0.0版本起,drill工具与ldns代码库一并分发。drill工具继承了ldns库的特点,是对于新RFC标准能更快的支持。
在drill工具的手册(man page)中还有一个有趣的说明:
The name drill is a pun on dig. With drill you should be able to get even more information than with dig.
一般使用
1. 查A记录
USAGE: dig <domain>
USAGE: drill <domain>
查A记录是dns工具最常用的功能之一,两个工具的使用方式相同。值得注意的是dig v9.11.2
在回显的第一行和最后一行分别插入了空行,
同时会在查询记录时自动加上[ad 查询标识位][dig-info]
,用以查询通过DNSSEC验证的记录(后将详细演示),同时dig工具的回显更罗嗦(verbose)默认包含工具版本号。
2. 查其他域名记录
USAGE: drill <record-type> <domain> # dig <record-type> <domain>
两个工具使用方法一致,这里不作演示。
3. 追踪DNS查询过程
USAGE: dig +trace <domain>
USAGE: drill -T <domain>
dig v9.11.2
在回显的第一行和最后一行分别插入了空行,dig工具的回显更罗嗦(verbose)并且默认返回了DNSSEC验证相关的NSEC和RRSIG记录。
同时我们在使用中能明显感受到drill v1.7.0
工具在traceDns记录时返回结果更慢,原因不明。
4. 用TCP协议请求并指定DNS服务器端口
USAGE: dig +tcp -p <port> <domain> @dns-server-ip
USAGE: drill -t -p <port> <domain> @dns-server-ip
我们能从两个工具的手册(man page)中得知,drill工具的DNS查询选项(queryopt)是形如-t
,区别于dig工具的形如+tcp
。
FYI:
SYNOPSIS versus
- dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port#] [-q name] [-t type] [-v] [-x addr]
[-y [hmac:]name:key] [-4] [-6] [name] [type] [class] [queryopt…]
- drill [ OPTIONS ] name [ @server ] [ type ] [ class ]
5. 查询IP的PTR记录(域名的反向查询)
USAGE: dig -x x.y.z.o
USAGE: drill -x # drill仍没有适配于脚本的简短输出参数)
6. 查询DNSSEC验证的记录
USAGE: dig <domain> @dnssec-enabled-server
USAGE: drill <domain> @dnssec-enabled-server
dig v9.11.2
在回显的第一行和最后一行分别插入了空行,回显更罗嗦(verbose)并且会在了解到DNS服务器支持DNSSEC时自动加入ad 请求标识位
。两工具都在没有额外参数的情况下正确反应了服务器的DNSSEC应答。
值得注意的是dig v9.11.2
并不能很好的判断DNS服务器是否支持DNSSEC功能,至少博主路由器自带的DNS缓存服务器成功欺骗了dig,让它用ad 请求标识位
请求后续DNS记录。
FYI