命令行工具 dig 是用于解析域名和故障排查的一个利器。linux
从主要功能上来讲,dig 和 nslookup 之间差别不大,但 dig 更像一个增强版的 nslookup,能够查询到一些由域名服务器管理的信息,这在排查某些问题的时候很是有用。总的来讲,dig 是一个既简单易用又功能强大的命令行工具。(LCTT 译注:dig 和 nslookup 行为的主要区别来自于 dig 使用是是操做系统自己的解析库,而 nslookup 使用的是该程序自带的解析库,这有时候会带来一些行为差别。此外,从表现形式上看,dig 返回是结果是以 BIND 配置信息的格式返回的,也带有更多的技术细节。)ubuntu
dig 最基本的功能就是查询域名信息,所以它的名称其实是“域名信息查询工具Domain Information Groper”的缩写。dig 向用户返回的内容能够很是详尽,也能够很是简洁,展示内容的多少彻底由用户在查询时使用的选项来决定。浏览器
我只须要查询 IP 地址缓存
若是只须要查询某个域名指向的 IP 地址,可使用 +short 选项:服务器
$ dig facebook.com +short 31.13.66.35
在查询的时候发现有的域名会指向多个 IP 地址?这实际上是网站提升其可用性的一种措施。负载均衡
$ dig networkworld.com +short 151.101.2.165 151.101.66.165 151.101.130.165 151.101.194.165
也正是因为这些网站经过负载均衡实现高可用,在下一次查询的时候,或许会发现这几个 IP 地址的排序有所不一样。(LCTT 译注:浏览器等应用默认会使用返回的第一个 IP 地址,所以这样实现了一种简单的负载均衡。)dom
$ dig networkworld.com +short 151.101.130.165 151.101.194.165 151.101.2.165 151.101.66.165
标准返回ide
dig 的标准返回内容则包括这个工具自己的一些信息,以及请求域名服务器时返回的响应内容:工具
$ dig networkworld.com ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>*gt; networkworld.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39932 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;networkworld.com. IN A ;; ANSWER SECTION: networkworld.com. 300 IN A 151.101.194.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.2.165 ;; Query time: 108 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Thu Feb 13 13:49:53 EST 2020 ;; MSG SIZE rcvd: 109
因为域名服务器有缓存机制,返回的内容多是以前缓存好的信息。在这种状况下,dig 最后显示的查询时间Query time会是 0 毫秒(0 msec):网站
;; Query time: 0 msec <== ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Thu Feb 13 15:30:09 EST 2020 ;; MSG SIZE rcvd: 109
向谁查询?
在默认状况下,dig 会根据 /etc/resolv.conf 这个文件的内容决定向哪一个域名服务器获取查询结果。你也可使用 @ 来指定 dig 请求的域名服务器。
在下面的例子中,就指定了 dig 向 Google 的域名服务器 8.8.8.8 查询域名信息。
$ dig @8.8.8.8 networkworld.com ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> @8.8.8.8 networkworld.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21163 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;networkworld.com. IN A ;; ANSWER SECTION: networkworld.com. 299 IN A 151.101.130.165 networkworld.com. 299 IN A 151.101.66.165 networkworld.com. 299 IN A 151.101.194.165 networkworld.com. 299 IN A 151.101.2.165 ;; Query time: 48 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Feb 13 14:26:14 EST 2020 ;; MSG SIZE rcvd: 109
想要知道正在使用的 dig 工具的版本,可使用 -v 选项。你会看到相似这样:
$ dig -v DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu
或者这样的返回信息:
$ dig -v DiG 9.11.4-P2-RedHat-9.11.4-22.P2.el8
若是你以为 dig 返回的内容过于详细,可使用 +noall(不显示全部内容)和 +answer(仅显示域名服务器的响应内容)选项,域名服务器的详细信息就会被忽略,只保留域名解析结果
$ dig networkworld.com +noall +answer ; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> networkworld.com +noall +answer ;; global options: +cmd networkworld.com. 300 IN A 151.101.194.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.2.165
批量查询域名
若是你要查询多个域名,能够把这些域名写入到一个文件内(domains),而后使用下面的 dig 命令遍历整个文件并给出全部查询结果。
$ dig +noall +answer -f domains networkworld.com. 300 IN A 151.101.66.165 networkworld.com. 300 IN A 151.101.2.165 networkworld.com. 300 IN A 151.101.130.165 networkworld.com. 300 IN A 151.101.194.165 world.std.com. 77972 IN A 192.74.137.5 uushenandoah.org. 1982 IN A 162.241.24.209 amazon.com. 18 IN A 176.32.103.205 amazon.com. 18 IN A 176.32.98.166 amazon.com. 18 IN A 205.251.242.103
你也能够在上面的命令中使用 +short 选项,但若是其中有些域名指向多个 IP 地址,就没法看出哪些 IP 地址对应哪一个域名了。在这种状况下,更好地作法应该是让 awk 对返回内容进行处理,只留下第一列和最后一列:
$ dig +noall +answer -f domains | awk '{print $1,$NF}' networkworld.com. 151.101.66.165 networkworld.com. 151.101.130.165 networkworld.com. 151.101.194.165 networkworld.com. 151.101.2.165 world.std.com. 192.74.137.5 amazon.com. 176.32.98.166 amazon.com. 205.251.242.103 amazon.com. 176.32.103.205