如何在Linux上使用dig命令

时间:2020-01-09 10:39:53  来源:igfitidea点击:

Linux的dig命令可让我们查询DNS服务器并执行DNS查找。我们还可以找到IP地址返回的域。我们将向我们展示如何!

dig命令的工作方式

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

Internet使用Internet协议(IP)地址来标识Web上的位置,但是人们使用域名。当我们在Web浏览器或者SSH客户端等应用程序中键入域名时,必须将某些内容从域名转换为实际IP地址。这就是域名系统的用武之地。

当我们将域名与任何连接到Internet的程序一起使用时,本地路由器将无法解析该域名(除非从先前的请求中缓存了该域名)。因此,路由器将查询Internet服务提供商的(ISP)DNS服务器,或者已配置要使用的任何其他服务器。这些称为DNS前体服务器。

如果DNS服务器最近从同一计算机上的其他人收到相同的请求,则答案可能在其缓存中。如果是这样,它只是将相同的信息发送回程序。

如果DNS前体服务器无法在其缓存中找到域,则它将与DNS根名称服务器联系。根服务器不会保存将域名解析为IP地址所需的信息,但是会保留可以处理请求的服务器列表。

根服务器查看域名所属的顶级域,例如.COM,.ORG,.CO.UK等。然后,它将将处理这些类型的域的顶级域服务器的列表发送回DNS前体服务器。然后,DNS前体服务器可以再次向顶级域服务器发出请求。

顶级域服务器将权威名称服务器的详细信息(存储域的详细信息)发送回DNS前体服务器。然后DNS服务器查询托管我们最初在程序中输入的域的区域的权威名称服务器。权威名称服务器将IP地址发送回DNS服务器,DNS服务器又将其发送回我们。

安装dig

dig已经安装在我们的Ubuntu 18.04和Fedora 30计算机上。但是,我们必须使用以下命令将其安装在Manjaro 18.04计算机上:

sudo pacman -Sy bind-tools

dig命令

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

我们使用" + short"查询选项,如下所示,这使我们得到了简洁的响应:

dig theitroad.local +short

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

因此,我们键入以下内容以使其通过less

dig theitroad.local | less

输出显示为" less",如下所示。

这是完整的列表:

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> theitroad.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12016
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;theitroad.local. IN A

;; ANSWER SECTION:
theitroad.local. 3551 IN A 151.101.194.217
theitroad.local. 3551 IN A 151.101.130.217
theitroad.local. 3551 IN A 151.101.66.217
theitroad.local. 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 2017
;; MSG SIZE rcvd: 106

让我们逐一剖析。

标头

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

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> theitroad.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12016
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

现在,这就是所有这些的意思:

  • 第一行:dig版本和查询的域。

  • 全局选项:我们将看到,我们可以使用dig同时查询多个域。此行显示已应用于所有域查询的选项。在我们的简单示例中,它只是默认的+ cmd(命令)选项。

  • 操作码:查询:这是所请求的操作类型,在这种情况下,是"查询"。对于反向查询,该值也可以是" iquery",如果我们只是测试DNS系统的状态,则该值也可以是" status"。

  • 状态:无错误:没有错误,请求已正确解决。

  • ID:12016:此随机ID将请求和响应绑定在一起。

  • 标志:qr rd ra:这些代表"查询","需要递归"和"可用递归"。递归是DNS查找的一种形式(另一种是迭代形式)。我们可能还会看到" AA",它代表权威答案,这意味着权威名称服务器提供了响应。

  • 查询:1:此会话中的查询数,是1.

  • 答案:4:此响应中的答案数为4.

  • 权限:0:来自权威名称服务器的答案数量,在这种情况下为零。该响应是从DNS前体服务器的缓存返回的。答复中将没有权威部分。

  • 添加:1:有一个添加信息。 (奇怪的是,除非此值是两个或者更大,否则什么都没有列出。)

选择伪切片

接下来,我们在"选择伪"部分中看到以下内容:

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494

让我们分解一下:

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

  • 标志:未使用任何标志。

  • udp:4096:UDP数据包大小。

问题部分

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

;; QUESTION SECTION:
;theitroad.local. IN A

这是什么意思:

  • theitroad.local:我们正在查询的域名。

  • IN:我们正在进行互联网类查询。

  • A:除非我们另外指定,否则dig将向DNS服务器请求A(地址)记录。

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

theitroad.local. 3551 IN A 151.101.194.217
theitroad.local. 3551 IN A 151.101.130.217
theitroad.local. 3551 IN A 151.101.66.217
theitroad.local. 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 2017 
;; MSG SIZE rcvd: 106

这是我们得到的:

  • 查询时间:0毫秒:获得响应所花费的时间。

  • 服务器:127.0.0.53#53(127.0.0.53):响应的DNS服务器的IP地址和端口号。在这种情况下,它指向本地缓存存根解析器。这会将DNS请求转发到配置的任何上游DNS服务器。在Manajro测试计算机上,此处列出的地址是8.8.8.8#53,这是Google的公共DNS服务。

  • 时间:星期三3月22日07:44:37美国东部夏令时间2017:发出请求时。

  • MSG大小rcvd:106:从DNS服务器接收的消息的大小。

有选择性

dig命令允许我们有选择地从结果中包括或者排除部分。

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

    • nocomments:不显示评论行。
    • noauthority:不显示授权部分。
    • noadditional:不显示其他部分。
    • nostats:不显示"统计信息"部分。
  • +否答案:不显示答案部分。

    • noall:什么也不要显示!

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

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

  • +评论:显示评论行。

    • authority:显示权限部分。
  • +其他:显示其他部分。

    • stats:显示"统计信息"部分。
    • answer:显示答案部分。
  • +全部:显示所有内容。

我们输入以下内容进行请求,并排除注释行:

dig theitroad.local +nocomments

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

dig theitroad.local +noall

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

dig theitroad.local +noall +answer

如果我们键入以下内容打开+ stats,我们还将看到"统计信息"部分:

dig theitroad.local +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常用的记录类型:

  • 记录:将域链接到IP版本4地址。

  • MX记录:邮件交换将发送到域的直接电子邮件记录到正确的邮件服务器。

  • NS Record:名称服务器记录将一个域(或者子域)委派给一组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