如何在 Linux 上使用 dig 命令

Linux dig
命令允许您查询 DNS 服务器并执行 DNS 查找。您还可以找到 IP 地址返回的域。我们会告诉你怎么做!
dig 命令的工作原理
人们使用 Linux dig
命令查询域名系统 (DNS) 服务器。 dig
是 Domain Information Groper 的首字母缩写词。使用 dig
,您可以查询 DNS 服务器以获取有关各种 DNS 记录的信息,包括主机地址、邮件交换、名称服务器和相关信息。它旨在成为诊断 DNS 问题的工具。但是,您可以使用它四处浏览并了解有关 DNS 的更多信息,DNS 是保持 Internet 路由流量的中央系统之一。
互联网使用互联网协议 (IP) 地址来识别网络上的“位置”,但人们使用域名。当您在网络浏览器或 SSH 客户端等应用程序中键入域名时,必须将域名转换为实际 IP 地址。这就是域名系统的用武之地。
当您将域名与任何联网程序一起使用时,您的本地路由器无法解析它(除非它是从先前的请求中缓存的)。因此,您的路由器会查询您的互联网服务提供商 (ISP) 的 DNS 服务器,或者您已配置系统使用的任何其他服务器。这些称为 DNS 前体服务器。
如果 DNS 服务器最近从同一台计算机上的其他人收到了相同的请求,则答案可能在 它的 缓存中。如果是这种情况,它只是将相同的信息发送回您的程序。
如果 DNS 前身服务器无法在其缓存中找到域,它会联系 DNS 根名称服务器。根服务器不会保存将域名解析为 IP 地址所需的信息,但会保存可帮助处理您的请求的服务器列表。
根服务器看的是你的域名所属的顶级域,比如.COM、.ORG、.CO.UK等等。然后它将处理这些类型的域的顶级域服务器列表发送回 DNS 前体服务器。然后 DNS 前身服务器可以再次向顶级域服务器发出请求。
顶级域服务器将权威名称服务器的详细信息(存储域详细信息的位置)发送回 DNS 前体服务器。然后 DNS 服务器查询托管您最初输入程序的域区域的权威名称服务器。权威名称服务器将 IP 地址发送回 DNS 服务器,DNS 服务器再将其发送回给您。
安装挖掘
dig
已经安装在我们的 Ubuntu 18.04 和 Fedora 30 计算机上。但是,我们必须使用以下命令将它安装在 Manjaro 18.04 计算机上:
sudo pacman -Sy bind-tools

开始挖掘
在我们的第一个示例中,我们将返回与域名关联的 IP 地址。通常,多个 IP 地址与一个域名相关联。例如,如果使用负载平衡,这种情况经常发生。
我们使用 +short
查询选项,如下所示,它给了我们一个简洁的响应:
dig linux教程 +short

所有与 linux教程 域关联的 IP 地址都已为我们列出。另一方面,如果我们不使用+short
查询选项,输出会非常冗长。
因此,我们输入以下内容通过 less
进行管道传输:
dig linux教程 | less

输出显示在 less
中,如下所示。

这是完整的清单:
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> linux教程
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12017
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;linux教程. IN A
;; ANSWER SECTION:
linux教程. 3551 IN A 151.101.194.217
linux教程. 3551 IN A 151.101.130.217
linux教程. 3551 IN A 151.101.66.217
linux教程. 3551 IN A 151.101.2.217
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 22 07:44:37 EDT 2020
;; MSG SIZE rcvd: 106
让我们一块一块地剖析它。
标头
首先,让我们看一下标题中的内容:
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> linux教程
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12017
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
现在,这就是所有这些的含义:
- 第一行:
dig
的版本和被查询的域。 - 全局选项:如我们所见,您可以使用
dig
同时查询多个域。此行显示已应用于所有域查询的选项。在我们的简单示例中,它只是默认的+cmd
(命令)选项。 - 操作码:查询:这是请求的操作类型,在本例中是
查询
。对于反向查询,此值也可以是iquery
,或者如果您只是测试 DNS 系统的状态,则可以是status
。 - 状态:无错误:没有错误,请求已正确解决。
- ID:12017:这个随机 ID 将请求和响应联系在一起。
- 标志:qr rd ra:这些代表
query
、recursion desired
和recursion available
。递归是 DNS 查找的一种形式(另一种是迭代的)。您可能还会看到AA
,它代表权威答案,表示权威名称服务器提供了响应。 - Query: 1:本次会话中的查询数,是一个。
- 答案:4:此响应中的答案数,即四个。
- 权威:0 来自权威名称服务器的答案数,在本例中为零。响应是从 DNS 前身服务器的缓存中返回的。回复中不会有权威部分。
- 附加:1:有一条附加信息。 (奇怪的是,除非这个值是 2 或更高,否则什么都不会列出。)
选择伪截面
接下来,我们在 Opt Pseudosection 中看到以下内容:
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
让我们分解一下:
- EDNS:版本 0:正在使用的 DNS 扩展系统版本。 EDNS 通过扩展用户数据报协议 (UDP) 数据包的大小来传输扩展数据和标志。这由可变大小标志指示。
- flags:没有使用任何标志。
- udp:4096:UDP数据包大小。
问题部分
在问题部分,我们看到以下内容:
;; QUESTION SECTION:
;linux教程. IN A
这是什么意思:
- linux教程:我们正在查询的域名。
- IN:我们正在进行互联网课程查询。
- A:除非我们另有说明,
dig
将从 DNS 服务器请求 A(地址)记录。
答案部分
答案部分包含我们从 DNS 服务器收到的以下四个答案:
linux教程. 3551 IN A 151.101.194.217
linux教程. 3551 IN A 151.101.130.217
linux教程. 3551 IN A 151.101.66.217
linux教程. 3551 IN A 151.101.2.217
以下是这些答案的含义:
- 3551:这是生存时间 (TTL),一个 32 位有符号整数,用于保存记录可以缓存的时间间隔。当它过期时,数据必须用于响应请求,直到它被 DNS 服务器刷新。
- IN:我们进行了 Internet 类查询。
- A:我们从 DNS 服务器请求 A 记录。
统计科
统计数据是最后一部分,它包含以下信息:
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 22 07:44:37 EDT 2020
;; MSG SIZE rcvd: 106
这是我们得到的:
- 查询时间:0 毫秒:获得响应所花费的时间。
- SERVER: 127.0.0.53#53(127.0.0.53) 响应的 DNS 服务器的 IP 地址和端口号。在这种情况下,它指向本地缓存存根解析器。这会将 DNS 请求转发到配置的任何上游 DNS 服务器。在 Manajro 测试计算机上,此处列出的地址是 8.8.8.8#53,这是 Google 的公共 DNS 服务。
- 时间:美国东部时间 2020 年 3 月 22 日星期日 07:44:37:提出请求时。
- MSG SIZE rcvd: 106:从 DNS 服务器收到的消息的大小。
有选择性
你不必满足于守口如瓶和喋喋不休这两个极端。 dig
命令允许您有选择地包括或排除结果中的部分。
以下查询选项将从结果中删除该部分:
- +nocomments:不显示评论行。
- +noauthority:不显示权限部分。
- +noadditional:不显示附加部分。
- +nostats:不显示统计部分。
- +noanswer:不显示答案部分。
- +noall:不显示任何内容!
+noall
查询选项通常与上述选项之一结合使用,以在结果中包含一个部分。因此,无需输入一长串查询选项来关闭多个部分,您可以使用 +noall
将它们全部关闭。
然后,您可以使用以下包含的查询选项来重新打开您想要查看的选项:
- +comments:显示评论行。
- +authority:显示权限部分。
- +additional:显示附加部分。
- +stats:显示统计部分。
- +answer:显示答案部分。
- +all:显示所有内容。
我们键入以下内容以发出请求并排除注释行:
dig linux教程 +nocomments

如果我们单独使用 +noall
查询选项,如下所示,我们不会得到任何有用的输出:
dig linux教程 +noall

我们可以有选择地添加我们想看的部分。要添加答案部分,我们键入以下内容:
dig linux教程 +noall +answer

如果我们键入以下内容来打开 +stats
,我们还会看到统计信息部分:
dig linux教程 +noall +answer +stats

+noall +answer
组合经常使用。您可以根据需要将其他部分添加到命令行。如果您想避免在每次使用 dig
时都在命令行中键入 +noall +answer
,您可以将它们放在一个名为“.digrc”的配置文件中。它位于您的主目录中。
我们键入以下内容以创建一个带有 echo
的内容:
echo "+noall +answer" > $HOME/.digrc
然后我们可以键入以下内容来检查其内容:
cat .digrc

这两个选项现在将应用于 dig
的所有未来使用,如下所示:
dig ubuntu.org
dig linux.org
dig github.com

此 dig
配置文件将用于本文中的其余示例。
DNS 记录
返回给您的 dig
请求的信息是从 DNS 服务器上保存的不同类型的记录中提取的。除非我们要求不同的东西,否则 dig
查询 A(地址)记录。以下是 dig
常用的记录类型:
- A 记录:将域链接到 IP 版本 4 地址。
- MX 记录:邮件交换记录将发送到域的电子邮件直接发送到正确的邮件服务器。
- NS 记录:名称服务器记录将域(或子域)委托给一组 DNS 服务器。
- TXT 记录:文本记录存储有关域的基于文本的信息。通常,它们可能用于抑制欺骗性或伪造的电子邮件。
- SOA 记录:开始权限记录可以保存有关域的大量信息。在这里,您可以找到主要名称服务器、责任方、更改时间戳、区域刷新频率以及一系列重试和放弃的时间限制。
- TTL:生存时间是每个 DNS 记录的设置,指定允许 DNS 前身服务器缓存每个 DNS 查询的时间。当该时间到期时,必须为后续请求刷新数据。
- ANY:这会告诉
dig
尽可能返回所有类型的 DNS 记录。
指定A记录类型不改变默认动作,即查询地址记录,获取IP地址,如下图:
dig redhat.com A

要查询邮件交换记录,我们使用以下 MX 标志:
dig yahoo.com MX

名称服务器标志返回与顶级域关联的根名称服务器的以下名称:
dig fedora.com NS

要查询权限记录的开始,我们键入以下 SOA 标志:
dig manjaro.com SOA

TTL 标志将向我们显示 DNS 服务器缓存中数据的生存时间。如果我们发出一系列请求,我们会看到生存时间减少到零,然后跳回到它的起始值。
我们键入以下内容:
dig usa.gov TTL

要查看文本记录,我们键入 TX 标志:
dig usa.gov TXT

指定 DNS 服务器
如果您想为您的请求使用特定的 DNS 服务器,您可以使用 at 符号 (@
) 将其作为命令行参数传递给 dig
。
使用默认 DNS 服务器(见下文),dig
引用位于 127.0.0.53 的本地缓存存根解析器。
dig usa.gov +stats
现在,我们键入以下内容以使用位于 8.8.8.8 的 Google 公共 DNS 服务器:
dig @8.8.8.8 usa.gov +stats

对多个域使用挖掘
我们可以在命令行中将多个域传递给dig
,如下所示:
dig ubuntu.org fedora.org manjaro.com

如果您定期检查一组域,您可以将它们存储在一个文本文件中并将其传递给 dig
。将依次检查文件中的所有域。
我们的文件名为“domains.txt”。我们将使用 cat
显示其内容,然后使用 -f
(文件)选项将其传递给 dig
。我们键入以下内容:
cat domains.txt
dig -f domains.txt

反向 DNS 查询
如果您有 IP 地址并想知道它的去向,您可以尝试反向 DNS 查找。如果它解析为在 DNS 服务器上注册的服务器,您可能能够找到它的域。
是否可以取决于 PTR(指针记录)的存在。 PTR 将 IP 地址解析为完全限定的域名。但是,因为这些不是强制性的,所以它们并不总是出现在域中。
让我们看看能否找到 IP 地址 209.51.188.148 将我们带往何处。我们使用 -x
(反向查找)选项键入以下内容:
dig -x 209.51.188.148

急! IP 地址解析为 gnu.org。
因为 PTR 是 DNS 记录,而且我们知道 dig
可以请求指定的 DNS 记录,难道我们不能直接让 dig
为我们检索 PTR 吗?是的,我们可以,但这确实需要更多的工作。
我们必须以相反的顺序提供 IP 地址,并在最后加上 .in-addr.arpa
,如下所示:
dig ptr 148.188.51.209.in-addr.arpa

我们得到相同的结果;只是需要更多的努力。
你能挖一下它么?
我们每天都使用互联网,好奇的人常常想知道当我们在浏览器中输入网站名称时,魔法是如何发生的。使用 dig
,您可以探索网络召唤的过程。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts