DNS 一站到家之常用工具

使用这些工具之前,你可能需要安装一个工具包。它里面包含了之后需要介绍到的工具:

Ubuntu

$ sudo apt-get update
$ sudo apt-get install dnsutils

Debian

$ sudo apt-get update
$ sudo apt-get install dnsutils

Fedora/Centos

$ sudo yum update
$ sudo yum install bind-utils

dig 命令

dig(domain information groper)是用于查询域名系统(DNS)服务器的网络管理 命令行工具。

dig 可用于网络故障排除和教育目的。挖掘可以通过从操作系统文件读取请求在交互式命令行模式或批处理模式下运行。当命令调用中未指定特定名称服务器时,将使用操作系统默认解析器,通常通过 resolv.conf 文件进行配置。没有任何参数,它查询 DNS 根区域。

dig支持国际化域名(IDN)查询。

dig是 BIND 域名服务器软件套件的一部分。dig 最初计划取代旧的工具,如 nslookup 和主机程序; 然而,它却成为一个补充工具。

基本格式

通过命令行查看帮助:

$ dig -h
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]
Where:  domain    is in the Domain Name System
        q-class  is one of (in,hs,ch,...) [default: in]
        q-type   is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]
                 (Use ixfr=version for type ixfr)

... ...
... ...

常用查询

1、查询根节点信息。

$ dig

; <<>> DiG 9.8.3-P1 <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57694
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.              IN  NS

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

;; Query time: 10 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Thu Mar 30 21:26:03 2017
;; MSG SIZE  rcvd: 228

会列出全球 13 组根服务器地址。

2、直接域名,这里默认查询 A 记录,使用 /etc/resolv.conf 的名称服务器,也就是你配置的 DNS 服务器。

$ dig baidu.com

; <<>> DiG 9.8.3-P1 <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20690
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.com.         IN  A

;; ANSWER SECTION:
baidu.com.      300 IN  A   220.181.57.217
baidu.com.      300 IN  A   111.13.101.208
baidu.com.      300 IN  A   123.125.114.144
baidu.com.      300 IN  A   180.149.132.47

;; Query time: 7 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Mar 30 20:51:43 2017
;; MSG SIZE  rcvd: 91

结果解读:

  1. 首先是 dig 的版本。
  2. global options,全局选项。
  3. HEADER,头信息。
  4. flags...,标识,统计信息等。
  5. QUESTION SECTION,查询域名:baidu.com,查询类型:A 记录,查询类:IN
  6. ANSWER SECTION,查询到 4 条记录,当然前面也清楚的标示了。
  7. Query time,耗时 7 msec。
  8. SERVER,我们通过 192.168.1.1 ,端口 53 进行查询。
  9. WHEN,我们查询的时间。
  10. MSG SIZE,接收到消息的大小。

这里的 300 是什么?它是 TTL(存活时间)的值。也就是剩余缓存时间。在缓存时间内,再次取查询 baidu.com 它将直接返回缓存的结果。

如果你不想看到这么多信息,你可以使用 +short 参数:

$ dig baidu.com +short
220.181.57.217
111.13.101.208
123.125.114.144
180.149.132.47

更多选项请查看帮助 $ dig -h

2、指定名称服务器进行查询

$ dig @114.114.114.114 baidu.com

; <<>> DiG 9.8.3-P1 <<>> @114.114.114.114 baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33692
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.com.         IN  A

;; ANSWER SECTION:
baidu.com.      95  IN  A   220.181.57.217
baidu.com.      95  IN  A   111.13.101.208
baidu.com.      95  IN  A   180.149.132.47
baidu.com.      95  IN  A   123.125.114.144

;; Query time: 62 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Thu Mar 30 21:16:10 2017
;; MSG SIZE  rcvd: 91

这里指定了电信的公共 DNS 服务器 114.114.114.114 进行查询,可以从 SERVER 看出。另外比较有名的 DNS 服务器地址有阿里云的 223.5.5.5,谷歌的 8.8.8.8(国内用不了)。由于篇幅有限,后面我将只展示部分结果信息。

3、查询 TXT 记录

$ dig baidu.com TXT

; <<>> DiG 9.8.3-P1 <<>> baidu.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62328
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.com.         IN  TXT

;; ANSWER SECTION:
baidu.com.      5605    IN  TXT "google-site-verification=GHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwM"
baidu.com.      5605    IN  TXT "v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com a mx ptr -all"

;; Query time: 25 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Thu Mar 30 21:32:59 2017
;; MSG SIZE  rcvd: 210

查询类型还有很多种,如:aanymxnssoahinfoaxfrtxt,…。

4、逆向查询

逆向查询通过 -x

$ dig -x 220.181.57.217
;; Warning: Message parser reports malformed message packet.

; <<>> DiG 9.8.3-P1 <<>> -x 220.181.57.217
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14685
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;217.57.181.220.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
181.220.in-addr.arpa.   459     IN      SOA     idc-ns1.bjtelecom.net. hostmaster11.ctid.com.cn. 1141804898 10800 3600 604800 38400

;; Query time: 14 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Fri Mar 31 09:59:58 2017
;; MSG SIZE  rcvd: 126

5、分级查询

大家都知道,域名是分区域的,如果你不是很理解,可以查看 DNS 一站到家之历史由来

其结构如下:

主机名.次级域名.顶级域名.根域名

# 即

host.sld.tld.root

查询流程如下:

  • 从”根域名服务器”查到”顶级域名服务器”的 NS 记录和 A 记录(IP 地址)
  • 从”顶级域名服务器”查到”次级域名服务器”的 NS 记录和 A 记录(IP 地址)
  • 从”次级域名服务器”查出”主机名”的 IP 地址

我们使用 +trace 来进行分级查询:

$ dig @114.114.114.114 deepzz.com +trace

; <<>> DiG 9.8.3-P1 <<>> @114.114.114.114 +trace deepzz.com
; (1 server found)
;; global options: +cmd
.           500466  IN  NS  b.root-servers.net.
.           500466  IN  NS  f.root-servers.net.
.           500466  IN  NS  j.root-servers.net.
.           500466  IN  NS  h.root-servers.net.
.           500466  IN  NS  l.root-servers.net.
.           500466  IN  NS  e.root-servers.net.
.           500466  IN  NS  k.root-servers.net.
.           500466  IN  NS  a.root-servers.net.
.           500466  IN  NS  i.root-servers.net.
.           500466  IN  NS  g.root-servers.net.
.           500466  IN  NS  c.root-servers.net.
.           500466  IN  NS  d.root-servers.net.
.           500466  IN  NS  m.root-servers.net.
;; Received 228 bytes from 114.114.114.114#53(114.114.114.114) in 160 ms

com.            172800  IN  NS  a.gtld-servers.net.
com.            172800  IN  NS  b.gtld-servers.net.
com.            172800  IN  NS  c.gtld-servers.net.
com.            172800  IN  NS  d.gtld-servers.net.
com.            172800  IN  NS  e.gtld-servers.net.
com.            172800  IN  NS  f.gtld-servers.net.
com.            172800  IN  NS  g.gtld-servers.net.
com.            172800  IN  NS  h.gtld-servers.net.
com.            172800  IN  NS  i.gtld-servers.net.
com.            172800  IN  NS  j.gtld-servers.net.
com.            172800  IN  NS  k.gtld-servers.net.
com.            172800  IN  NS  l.gtld-servers.net.
com.            172800  IN  NS  m.gtld-servers.net.
;; Received 488 bytes from 199.7.83.42#53(199.7.83.42) in 442 ms

deepzz.com.     172800  IN  NS  dns9.hichina.com.
deepzz.com.     172800  IN  NS  dns10.hichina.com.
;; Received 171 bytes from 192.43.172.30#53(192.43.172.30) in 240 ms

deepzz.com.     600 IN  A   192.168.100.110
;; Received 44 bytes from 140.205.81.24#53(140.205.81.24) in 9 ms

这里由于路由器的原因,不支持递归查询方式,故指定了电信公共 DNS 服务器作为岔村服务器,可以清晰的看到:

  1. 先查询根 .,返回 13 组根 NS 服务器地址。
  2. 取最先返回根域名地址,再查询顶级域名 com.,得到 13 组顶级域名 NS 服务器地址。
  3. 取最先返回顶级域名地址,再查询次级域名 deepzz.com,得到 5 组次级域名 NS 服务器。
  4. 取最先返回次级域名地址,查询主机名 @ 的地址,得到结果。

host 命令

host 命令可以看作 dig 命令的简化版本,主要用途是将主机名解析为因特网协议 (IP) 地址或将 IP 地址解析为主机名。

语法

host: illegal option -- h
Usage: host [-aCdlriTwv] [-c class] [-N ndots] [-t type] [-W time]
            [-R number] [-m flag] hostname [server]
       -a is equivalent to -v -t ANY
       -c specifies query class for non-IN data
       -C compares SOA records on authoritative nameservers
       -d is equivalent to -v
       -l lists all hosts in a domain, using AXFR
       -i IP6.INT reverse lookups
       -N changes the number of dots allowed before root lookup is done
       -r disables recursive processing
       -R specifies number of retries for UDP packets
       -s a SERVFAIL response should stop query
       -t specifies the query type
       -T enables TCP/IP mode
       -v enables verbose output
       -w specifies to wait forever for a reply
       -W specifies how long to wait for a reply
       -4 use IPv4 query transport only
       -6 use IPv6 query transport only
       -m set memory debugging flag (trace|record|usage)

简单查询

通过 -t 指定查询类型:

$ host -t TXT deepzz.com
deepzz.com descriptive text "v=spf1 include:spf.mxhichina.com -all"

它也可以逆向查询,类似 $ dig -x

$ host 192.100.13.1

nslookup 命令

nslookup 命令用于互动式地查询域名记录。

语法

$ nslookup [ - option ] [ name | - ] [ server ]

示例

$ nslookup

> facebook.github.io
Server:     192.168.1.253
Address:    192.168.1.253#53

Non-authoritative answer:
facebook.github.io  canonical name = github.map.fastly.net.
Name:   github.map.fastly.net
Address: 103.245.222.133

> 

whois 命令

whois 命令用来查看域名的注册情况。

$ whois github.com

FAQ

1、什么是 递归查询 和 迭代查询?

首先这种说法是对 DNS 服务而言的,比如:这个服务器支持递归查询还是迭代查询?

  • 递归查询:当你向一个服务器 NS1 发起查询请求时。如果该服务器有缓存则直接返回结果,没有则会帮你向其他服务器请求查询,直到有结果。你需要做的就是发起请求,等待结果。
  • 迭代查询:当你向一个服务器 NS1 发起查询请求时。如果该服务器又缓存则直接换回结果,没有则会返回一个能够查询该请求的 DNS 服务器。你要做的就是发起请求,得到 DNS 服务器地址,再发起请求,得到新的 DNS 服务器地址…

下面用一幅图来标示: dns-recursion

参考地址

[1] https://en.wikipedia.org/wiki/Dig_(command)

[2] http://www.ruanyifeng.com/blog/2016/06/dns.html

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 2568 天前,文中所描述的信息可能已发生改变,请谨慎使用。

专题「DNS 一站到家」的其它文章 »

Comments