DNS: Internet’s Directory

时间:2021-03-28 18:07:19

关于DNS

互联网上几乎一切活动都以DNS请求开始。DNS(Domain Name System)是Internet的目录。访问URL时,设备所要做的第一件事就是询问目录,根据域名查出IP地址。

查询过程

DNS: Internet’s Directory

例如:访问www.baidu.com

  1. 首先检查本机hosts文件
  2. 向本地DNS服务器查找www.baidu.com的IP
  3. DNS服务器查询
  4. 告知本地DNS服务器去com域名服务器查询
  5. 向com域名服务器查询
  6. 告知本地DNS服务器去baidu.com域名服务器查询
  7. baidu.com域名服务器查询
  8. 告知本地DNS服务器www.baidu.com的IP

dig

解析域名

  • dig www.baidu.com
  • dig www.baidu.com @114.114.114.114,查指定DNS服务器为114.114.114.114
  • dig www.baidu.com @114.114.114.114 ns,查指定域名记录ns

简单解析域名

dig www.baidu.com

结果如下:

; <<>> DiG 9.10.6 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22401
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.baidu.com. IN A ;; ANSWER SECTION:
www.baidu.com. 255 IN CNAME www.a.shifen.com.
www.a.shifen.com. 172 IN CNAME www.wshifen.com.
www.wshifen.com. 293 IN A 103.235.46.39 ;; Query time: 53 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Mar 19 19:06:52 CST 2019
;; MSG SIZE rcvd: 111

第一段是查询参数和统计

; <<>> DiG 9.10.6 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22303
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

第二段是查询内容,表示查询域名www.baidu.comA记录,A是address的缩写。

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

第三段是DNS服务器的答复,www.baidu.com有两个CNAME记录,一个A记录,即一个IP地址。35是TTL值(Time to live 的缩写),表示缓存时间,即35秒之内不用重新查询

;; ANSWER SECTION:
www.baidu.com. 789 IN CNAME www.a.shifen.com.
www.a.shifen.com. 95 IN CNAME www.wshifen.com.
www.wshifen.com. 35 IN A 103.235.46.39

第四段是DNS服务器的一些传输信息

;; Query time: 53 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Mar 19 18:35:33 CST 2019
;; MSG SIZE rcvd: 111

查指定域名记录

dig www.baidu.com @114.114.114.114 ns

结果如下:

; <<>> DiG 9.10.6 <<>> www.baidu.com @114.114.114.114 ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13293
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN NS ;; ANSWER SECTION:
www.baidu.com. 30 IN CNAME www.a.shifen.com.
www.a.shifen.com. 30 IN CNAME www.wshifen.com. ;; AUTHORITY SECTION:
wshifen.com. 30 IN SOA ns1.wshifen.com. baidu_dns_master.baidu.com. 1903190001 60 30 2592000 3600 ;; Query time: 225 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Tue Mar 19 19:07:32 CST 2019
;; MSG SIZE rcvd: 152

第四段显示www.baidu.comNS记录(Name Server的缩写),即哪些服务器负责管理www.baidu.com的DNS记录

;; AUTHORITY SECTION:
wshifen.com. 62 IN SOA ns1.wshifen.com. baidu_dns_master.baidu.com. 1903190001 60 30 2592000 3600

域名层级结构

www.example.com.root
主机名.次级域名.*域名.根域名

分级查询

dig +trace www.baidu.com

第一段列出根域名.的所有NS记录,即所有根域名服务器。根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问www.baidu.com的*域名服务器com.的NS记录。最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。

; <<>> DiG 9.10.6 <<>> +trace www.baidu.com
;; global options: +cmd
. 102290 IN NS a.root-servers.net.
. 102290 IN NS b.root-servers.net.
. 102290 IN NS c.root-servers.net.
. 102290 IN NS d.root-servers.net.
. 102290 IN NS e.root-servers.net.
. 102290 IN NS f.root-servers.net.
. 102290 IN NS g.root-servers.net.
. 102290 IN NS h.root-servers.net.
. 102290 IN NS i.root-servers.net.

接着是第二段

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.

第二段显示显示.com域名的13条NS记录,同时返回的还有每一条记录对应的IP地址。

然后,DNS服务器向这些*域名服务器发出查询请求,询问www.baidu.com的次级域名baidu.com的NS记录。

baidu.com.		172800	IN	NS	ns2.baidu.com.
baidu.com. 172800 IN NS ns3.baidu.com.
baidu.com. 172800 IN NS ns4.baidu.com.
baidu.com. 172800 IN NS ns1.baidu.com.
baidu.com. 172800 IN NS ns7.baidu.com.

上面结果显示baidu.com有五条NS记录。

然后,DNS服务器向上面这五台NS服务器查询www.baidu.com的主机名。

www.baidu.com.		1200	IN	CNAME	www.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
;; Received 239 bytes from 112.80.248.64#53(ns3.baidu.com) in 16 ms

上面结果显示,最先返回结果的NS服务器是ns3.baidu.com,IP地址为112.80.248.64

NS记录的查询

dig命令可以单独查看每一级域名的NS记录,+short参数可以显示简化的结果

dig ns com
dig ns example.com
dig +short ns com
dig +short ns example.com

常见域名记录类型

域名与IP之间的对应关系,称为记录。

A   主机记录,把一个域名解析成IP地址
CNAME 别名记录,把一个域名解析到另一个域名
NS 域名解析服务器记录
MX 邮件交换记录,返回接收电子邮件的服务器地址
PTR 指针记录,A记录的逆向记录,把IP解析成域名
TXT 为域名设置说明

一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。

CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。举例来说,www.baidu.com这个域名就是一个CNAME记录。

;; ANSWER SECTION:
www.baidu.com. 430 IN CNAME www.a.shifen.com.
www.a.shifen.com. 231 IN CNAME www.wshifen.com.
www.wshifen.com. 286 IN A 103.235.46.39

上面结果显示,www.baidu.com的CNAME记录指向www.wshifen.com。也就是说,用户查询www.baidu.com的时候,实际上返回的是www.wshifen.com的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改www.wshifen.com这个域名就可以了,用户的www.baidu.com域名不用修改。

由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录),这是为了防止产生冲突。举例来说,foo.com指向bar.com,而两个域名各有自己的MX记录,如果两者不一致,就会产生问题。由于*域名通常要设置MX记录,所以一般不允许用户对*域名设置CNAME记录。

PTR记录用于从IP地址反查域名。dig命令的-x参数用于查询PTR记录。

$ dig -x 192.30.252.153

...

;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 2635 IN PTR lb-192-30-252-153-iad.github.com.

上面结果显示,192.30.252.153这台服务器的域名是lb-192-30-252-153-iad.github.com

逆向查询的一个应用,是可以防止垃圾邮件,即验证发送邮件的IP地址,是否真的有它所声称的域名。

其他DNS工具

  • host
  • nslookup

参考:

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