如何在 Linux 上使用 dig 命令

已发表: 2022-01-29
Linux 系统上的风格化终端窗口。
Fatmawati Achmad Zaenuri/Shutterstock

Linux dig命令允许您查询 DNS 服务器并执行 DNS 查找。 您还可以找到 IP 地址返回的域。 我们会告诉你怎么做!

dig 命令的工作原理

人们使用 Linux dig命令来查询域名系统 (DNS) 服务器。 dig是 Domain Information Groper 的首字母缩写词。 使用dig ,您可以查询 DNS 服务器以获取有关各种 DNS 记录的信息,包括主机地址、邮件交换、名称服务器和相关信息。 它旨在成为诊断 DNS 问题的工具。 但是,您可以使用它来探索并了解有关 DNS 的更多信息,DNS 是保持 Internet 路由流量的中央系统之一。

互联网使用互联网协议 (IP) 地址来识别网络周围的“位置”,但人们使用域名。 当您在应用程序(如 Web 浏览器或 SSH 客户端)中键入域名时,必须将某些内容从域名转换为实际的 IP 地址。 这就是域名系统的用武之地。

当您将域名用于任何连接互联网的程序时,您的本地路由器无法解析它(除非它是从先前的请求中缓存的)。 因此,您的路由器查询您的 Internet 服务提供商 (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 绑定工具

开始挖掘

在我们的第一个示例中,我们将返回与域名关联的 IP 地址。 通常,多个 IP 地址与一个域名相关联。 例如,如果使用负载平衡,这通常会发生。

我们使用+short查询选项,如下所示,它给了我们一个简洁的响应:

 挖掘 howtogeek.com +short 

为我们列出了与 howtogeek.com 域关联的所有 IP 地址。 另一方面,如果我们使用+short查询选项,输出会非常冗长。

广告

因此,我们键入以下内容以通过less管道:

 挖howtogeek.com | 较少的

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

这是完整的清单:

 ; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> howtogeek.com
;; 全局选项:+cmd
;; 得到答案:
;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:12017
;; 标志:qr rd ra; 查询:1,答案:4,权限:0,附加:1

;; 选择伪部分:
; EDNS:版本:0,标志:; UDP:65494
;; 问题部分:
;howtogeek.com。 在一个

;; 答案部分:
howtogeek.com。 3551 在 151.101.194.217
howtogeek.com。 3551 IN A 151.101.130.217
howtogeek.com。 3551 在 151.101.66.217
howtogeek.com。 3551 在 151.101.2.217

;; 查询时间:0毫秒
;; 服务器:127.0.0.53#53(127.0.0.53)
;; 时间:2020 年 3 月 22 日星期日 07:44:37 EDT
;; 味精大小 rcvd: 106

让我们一块一块地剖析它。

标题

首先,让我们看一下我们在 Header 中的内容:

 ; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> howtogeek.com
;; 全局选项:+cmd
;; 得到答案:
;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:12017
;; 标志:qr rd ra; 查询:1,答案:4,权限:0,附加:1

现在,这就是所有这些的含义:

  • 第一行: dig的版本和查询的域。
  • 全局选项:正如我们将看到的,您可以使用dig同时查询多个域。 此行显示已应用于所有域查询的选项。 在我们的简单示例中,它只是默认的+cmd (命令)选项。
  • 操作码:查询:这是所请求的操作类型,在本例中为query 。 如果您只是测试 DNS 系统的状态,此值也可以是iquery用于反向查询,或者是status
  • 状态:无错误:没有错误,请求已正确解决。
  • ID:12017 :这个随机 ID 将请求和响应联系在一起。
  • 标志: qr rd ra:这些代表queryrecursion desiredrecursion available 。 递归是 DNS 查找的一种形式(另一种是迭代的)。 您可能还会看到AA ,它代表权威答案,这意味着权威名称服务器提供了响应。
  • Query: 1:本次会话的查询数,为1。
  • 答案:4:这个响应中的答案数,即四个。
  • 权威:0:来自权威名称服务器的答案数,在这种情况下为零。 响应是从 DNS 前体服务器的缓存中返回的。 回复中不会有权威部分。
  • 附加: 1:有一条附加信息。 (奇怪的是,除非该值为 2 或更高,否则不会列出任何内容。)

选择伪截面

接下来,我们在 Opt Pseudo 部分看到以下内容:

 ;; 选择伪部分:
; EDNS:版本:0,标志:; UDP:65494

让我们分解一下:

  • EDNS:版本 0:正在使用的 DNS 扩展系统版本。 EDNS 通过扩展用户数据报协议 (UDP) 数据包的大小来传输扩展数据和标志。 这由可变大小标志指示。
  • 标志:没有使用标志。
  • udp : 4096: UDP 数据包大小。

问题部分

在问题部分,我们看到以下内容:

 ;; 问题部分:
;howtogeek.com。 在一个

这是什么意思:

  • howtogeek.com:我们查询的域名。
  • IN:我们正在做一个互联网课程查询。
  • A:除非我们另有说明,否则dig会向 DNS 服务器请求一条 A(地址)记录。

回答部分

答案部分包含我们从 DNS 服务器收到的以下四个答案:

 howtogeek.com。 3551 在 151.101.194.217
howtogeek.com。 3551 IN A 151.101.130.217
howtogeek.com。 3551 在 151.101.66.217
howtogeek.com。 3551 在 151.101.2.217

以下是这些答案的含义:

  • 3551:这是生存时间 (TTL),一个 32 位有符号整数,用于保存可以缓存记录的时间间隔。 当它过期时,数据必须用于响应请求,直到它被 DNS 服务器刷新。
  • IN:我们做了一个互联网课程查询。
  • A:我们要求 DNS 服务器提供 A 记录。

统计科

统计是最后一部分,它包含以下信息:

 ;; 查询时间:0毫秒 
;; 服务器:127.0.0.53#53(127.0.0.53) 
;; 时间:2020 年 3 月 22 日星期日 07:44:37 EDT 
;; 味精大小 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 EDT:提出请求的时间。
  • MSG SIZE rcvd:106:从 DNS 服务器接收到的消息的大小。

有选择性

你不必满足于守口如瓶和喋喋不休的两个极端。 dig命令允许您有选择地从结果中包含或排除部分。

以下查询选项将从结果中删除该部分:

  • +nocomments:不显示注释行。
  • +noauthority:不显示权限部分。
  • +noadditional:不显示附加部分。
  • +nostats:不显示统计数据部分。
  • +noanswer:不显示答案部分。
  • +noall:什么都不显示!
广告

+noall查询选项通常与上述选项之一结合使用,以在结果中包含一个部分。 因此,您可以使用+noall将它们全部关闭,而不是输入一长串查询选项来关闭多个部分。

然后,您可以使用以下包含性查询选项重新打开您想要查看的内容:

  • +comments:显示注释行。
  • +authority:显示权限部分。
  • +附加:显示附加部分。
  • +stats:显示统计数据部分。
  • +answer:显示答案部分。
  • +all:显示所有内容。

我们键入以下内容以提出请求并排除注释行:

 挖掘 howtogeek.com +nocomments 

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

 挖掘 howtogeek.com +noall 

我们可以选择性地添加我们想要查看的部分。 要添加答案部分,我们键入以下内容:

 挖掘 howtogeek.com +noall +answer 

如果我们输入以下内容来打开+stats ,我们还会看到统计部分:

 挖掘 howtogeek.com +noall +answer +stats 

广告

+noall +answer组合经常使用。 您可以根据需要将其他部分添加到命令行。 如果您想避免每次使用dig时都在命令行中键入+noall +answer ,您可以将它们放在一个名为“.digrc”的配置文件中。 它位于您的主目录中。

我们键入以下内容以使用echo创建一个:

 echo "+noall +answer" > $HOME/.digrc

然后我们可以键入以下内容来检查其内容:

 猫.digrc 

这两个选项现在将应用于dig的所有未来用途,如下所示:

 挖掘 ubuntu.org
 挖掘 linux.org
 挖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地址,如下图:

 挖redhat.com A 

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

 挖yahoo.com MX 

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

 挖 fedora.com NS 

要查询权限记录的开始,我们输入以下 SOA 标志:

 挖掘 manjaro.com SOA 

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

我们输入以下内容:

 挖 usa.gov TTL 

要查看文本记录,我们输入 TX 标志:

 挖美国.gov TXT 

指定 DNS 服务器

如果您想为您的请求使用特定的 DNS 服务器,您可以使用 at 符号 ( @ ) 将其作为命令行参数传递给dig

广告

使用默认 DNS 服务器(见下文), dig引用位于 127.0.0.53 的本地缓存存根解析器。

 挖掘 usa.gov +stats

现在,我们键入以下内容以使用位于 8.8.8.8 的 Google 公共 DNS 服务器:

 挖掘@8.8.8.8 usa.gov +stats 

将 dig 与多个域一起使用

我们可以在命令行中传递多个域进行dig ,如下图:

 挖掘 ubuntu.org fedora.org manjaro.com 

如果您定期检查一组域,则可以将它们存储在文本文件中并将其传递给dig 。 将依次检查文件中的所有域。

我们的文件名为“domains.txt”。 我们将使用cat显示其内容,然后使用-f (文件)选项将其传递给dig 。 我们输入以下内容:

 猫域.txt
 挖 -f 域.txt 

反向 DNS 查找

如果您有一个 IP 地址并想知道它的去向,您可以尝试反向 DNS 查找。 如果它解析为使用 DNS 服务器注册的服务器,您可能能够找到它的域。

广告

是否可以取决于 PTR(指针记录)的存在。 PTR 将 IP 地址解析为完全限定的域名。 但是,由于这些不是强制性的,它们并不总是存在于域中。

让我们看看我们是否可以找出IP地址209.51.188.148将我们带到哪里。 我们使用-x (反向查找)选项键入以下内容:

 挖 -x 209.51.188.148 

快! IP 地址解析为 gnu.org。

因为 PTR 是 DNS 记录,而且我们知道dig可以请求指定的 DNS 记录,所以我们不能只要求dig为我们检索 PTR 吗? 是的,我们可以,但确实需要更多的工作。

我们必须以相反的顺序提供IP地址并在末尾.in-addr.arpa ,如下所示:

 挖 ptr 148.188.51.209.in-addr.arpa 

广告

我们得到相同的结果; 只是需要更多的努力。

你能挖一下它么?

我们每天都在使用互联网,好奇的人经常想知道,当我们在浏览器中输入网站名称时,魔法是如何发生的。 使用dig ,您可以探索网络魔术的过程。

相关:适合开发人员和爱好者的最佳 Linux 笔记本电脑