dig 和 nslookup 的安装

Ubuntu、Debian:

1
# apt install -y dnsutils

Fedora / CentOS:

1
# yum install -y bind-utils

nslookup 命令详解

nslookup 命令用于查询 DNS 的记录查看域名解析是否正常在网络故障的时候用来诊断网络问题。nslookup 的用法相对来说还是蛮简单的,主要是下面的几个用法。

直接查询

查询一个域名的 A 记录:

1
nslookup domain [dns-server]

如果没指定 dns-server,用系统默认的 DNS 服务器。

查询其他记录

直接查询返回的是 A 记录,我们可以指定参数,查询其他记录,比如 AAAA、MX 等:

1
2
3
4
nslookup -qt=type domain [dns-server]
nslookup -q=type domain [dns-server]
nslookup -type=type domain [dns-server]
nslookup -querytype=type domain [dns-server]

注意以上四种查询用法结果相同,后面的 [dns-server] 可填可不填。

type 类型:

  • A:地址记录
  • AAAA:地址记录
  • AFSDB:Andrew 文件系统数据库服务器记录
  • ATMA:ATM 地址记录
  • CNAME:别名记录
  • HINFO:硬件配置记录,包括 CPU、操作系统信息
  • ISDN:域名对应的 ISDN 号码
  • MB:存放指定邮箱的服务器
  • MG:邮件组记录
  • MINFO:邮件组和邮箱的信息记录
  • MR:改名的邮箱记录
  • MX:邮件服务器记录
  • NS:名字服务器记录
  • PTR:反向记录
  • RP:负责人记录
  • RT:路由穿透记录
  • SRV:TCP 服务器信息记录
  • TXT:域名对应的文本信息
  • X25:域名对应的 X.25 地址记录

查询更具体的信息

查询语法:

1
nslookup –d [其他参数] domain [dns-server]

只要在查询的时候,加上 -d 参数,即可查询域名的缓存。

Linux 下解析域名命令 - dig 命令使用详解

Linux 下解析域名除了使用 nslookup 之外,还可以使用 dig 命令来解析域名,dig 命令可以得到更多的域名信息。dig 命令主要用来从 DNS 域名服务器查询主机地址信息。dig 的全称是(domain information groper)。它是一个用来灵活探测 DNS 的工具,会打印出 DNS name server 的回应。

查询单个域名的 DNS 信息

dig 命令最典型的用法就是查询单个主机的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
linuxidc@linuxidc:~$ dig www.linuxidc.com

; <<>> DiG 9.11.3-1Ubuntu1.5-Ubuntu <<>> www.linuxidc.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17774
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.linuxidc.com. IN A

;; ANSWER SECTION:
www.linuxidc.com. 5 IN A 122.228.238.15
www.linuxidc.com. 5 IN A 106.42.25.203

;; Query time: 10 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 03 10:55:35 CST 2019
;; MSG SIZE rcvd: 77

dig 命令默认的输出信息

dig 命令默认的输出信息比较丰富,大概可以分为 5 个部分:

  1. 第一部分显示 dig 命令的版本和输入的参数
  2. 第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束
  3. 第三部分中的 "QUESTION SECTION" 显示我们要查询的域名
  4. 第四部分的 "ANSWER SECTION" 是查询到的结果
  5. 第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等

默认情况下 dig 命令查询 A 记录,上图中显示的 A 即说明查询的记录类型为 A 记录。在尝试查询其它类型的记录前让我们先来了解一下常见的 DNS 记录类型。

常见 DNS 记录的类型

类型目的
A地址记录,用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录
AAAA用来指定主机名(或域名)对应的 IPv6 地址记录
CNAME如果需要将域名指向另一个域名,再由另一个域名提供 IP 地址,就需要添加 CNAME 记录
MX如果需要设置邮箱,让邮箱能够收到邮件,需要添加 MX 记录
NS域名服务器记录,如果需要把子域名交给其他 DNS 服务器解析,就需要添加 NS 记录
SOASOA 这种记录是所有区域性文件中的强制性记录。它必须是一个文件中的第一个记录
TXT可以写任何东西,长度限制为 255。绝大多数的 TXT 记录是用来做 SPF 记录(反垃圾邮件)

查询 CNAME 类型的记录

除了 A 记录,常见的 DNS 记录还有 CNAME,我们可以在查询时指定要查询的 DNS 记录类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
linuxidc@linuxidc:~$ dig m.linuxidc.com CNAME

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> m.linuxidc.com CNAME
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61349
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;m.linuxidc.com. IN CNAME

;; Query time: 26 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 03 11:20:34 CST 2019
;; MSG SIZE rcvd: 43

这样结果中就只有 CNAME 的记录。其实我们可以在查询中指定任何 DNS 记录的类型。

从指定的 DNS 服务器上查询

由于一些原因,希望从指定的 DNS 服务器上进行查询(从默认的 DNS 服务器上获得的结果可能不准确)。指定 DNS 服务器的方式为使用 @ 符号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
linuxidc@linuxidc:~$ dig @8.8.8.8 m.linuxidc.com

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> @8.8.8.8 m.linuxidc.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38966
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;m.linuxidc.com. IN A

;; ANSWER SECTION:
m.linuxidc.com. 199 IN A 122.228.238.71
m.linuxidc.com. 199 IN A 113.107.238.155

;; Query time: 120 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Mar 03 11:21:48 CST 2019
;; MSG SIZE rcvd: 75

从上图可以看到本次查询的 DNS 服务器为 8.8.8.8。

如果不指定 DNS 服务器,dig 会依次使用 /etc/resolv.conf 里的地址作为 DNS 服务器:

1
linuxidc@linuxidc:~$ dig m.linuxidc.com

上面查询的 DNS 服务器就变成了:

反向查询

在前面的查询中我们指定了查询服务器为 8.8.8.8,这是谁家的 DNS 服务器?其实我们可以使用 dig 的 -x 选项来反向解析 IP 地址对应的域名:

1
2
linuxidc@linuxidc:~$ dig -x 8.8.8.8 +short
google-public-dns-a.google.com.

好吧,应该是 Google 的,可以放心使用了。

控制显示结果

dig 命令默认返回的结果展示详细的信息,如果要获得精简的结果可以使用 +short 选项:

1
2
3
linuxidc@linuxidc:~$ dig +short m.linuxidc.com
122.228.238.15
106.119.182.141

这下显示的结果就清爽多了。

其实我们还可以通过更多选项来控制输出的内容,比如只想显示 "ANSWER SECTION" 的内容:

这个结果很不错,就是使用的选项太多了(dig 命令有很多这样的选项,详情请参考使用手册)。我们可以换一种优雅一些的方式来实现和上面相同的结果:

1
2
3
4
5
6
linuxidc@linuxidc:~$ dig m.linuxidc.com +noall +answer

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> m.linuxidc.com +noall +answer
;; global options: +cmd
m.linuxidc.com. 5 IN A 113.107.238.212
m.linuxidc.com. 5 IN A 122.228.238.15

跟踪整个查询过程

如果你好奇 dig 命令执行查询时都经历了哪些过程,你可以尝试使用 +trace 选项。它会输出从根域到最终结果的所有信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
linuxidc@linuxidc:~$ dig sohu.com @202.102.134.68 -p 53 -t MX +trace

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> sohu.com @202.102.134.68 -p 53 -t MX +trace
;; global options: +cmd
. 482761 IN NS f.root-servers.net.
. 482761 IN NS a.root-servers.net.
. 482761 IN NS c.root-servers.net.
. 482761 IN NS b.root-servers.net.
. 482761 IN NS j.root-servers.net.
. 482761 IN NS d.root-servers.net.
. 482761 IN NS k.root-servers.net.
. 482761 IN NS e.root-servers.net.
. 482761 IN NS h.root-servers.net.
. 482761 IN NS i.root-servers.net.
. 482761 IN NS m.root-servers.net.
. 482761 IN NS g.root-servers.net.
. 482761 IN NS l.root-servers.net.
;; Received 239 bytes from 202.102.134.68#53(202.102.134.68) in 40 ms

com. 172800 IN NS d.gtld-servers.net.

显示 13 个根域服务器

Internet 上有 13 个根域服务器,使用不加参数的 dig 命令显示这些服务器信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
linuxidc@linuxidc:~$ dig

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

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;. IN NS

;; ANSWER SECTION:
. 5 IN NS b.root-servers.net.
. 5 IN NS c.root-servers.net.
. 5 IN NS d.root-servers.net.
. 5 IN NS e.root-servers.net.
. 5 IN NS f.root-servers.net.
. 5 IN NS g.root-servers.net.
. 5 IN NS h.root-servers.net.
. 5 IN NS i.root-servers.net.
. 5 IN NS j.root-servers.net.
. 5 IN NS k.root-servers.net.
. 5 IN NS l.root-servers.net.
. 5 IN NS m.root-servers.net.
. 5 IN NS a.root-servers.net.

;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 03 11:37:11 CST 2019
;; MSG SIZE rcvd: 239