DNS入门概念

305 阅读4分钟

什么是DNS

Domain Name System,简单来说,它的作用就是根据域名查出IP地址。就像一个大字典,key是域名,value是ip地址。例如我们ping一下 www.baodu.com这个地址,如下:

ricktian@ricktian-ubuntu:~$ ping www.baodu.com
PING www.baodu.com (115.29.223.128) 56(84) bytes of data.
64 bytes from 115.29.223.128 (115.29.223.128): icmp_seq=1 ttl=51 time=22.4 ms

115.29.223.128就是这个域名对应的地址。

记录类型

域名与IP之间的对应关系,称为“记录”(record)。根据使用场景,“记录”有不同的类型,常见的类型如下:

简称描述域名类型
A地址记录(Address),返回域名指向的IP地址。 查看指令:dig a
NS域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。 查看指令:dig ns
MX邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。查看指令:dig mx
CNAME规范名称记录(Canonical Name),返回另一个域名,即当前域名是另一个域名的跳转。
PTR逆向查询记录(Pointer Record),只用于从IP地址查询域名。查看指令:dig -x

一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务器的冗余性,防止出现单点故障。 CNAME需要特殊说明一下,一般来说它用于域名的内部跳转,为服务器提供灵活性,用户感知不到。 以www.baidu.com为例:

ricktian@ricktian-ubuntu:~$ dig www.baidu.com
;; ANSWER SECTION:
www.baidu.com.		933	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	600	IN	A	183.2.172.185
www.a.shifen.com.	600	IN	A	183.2.172.42

可以看到它的dns信息中包含了一条CNAME记录,跳转到www.a.shifen.com这个域名。也就是说,我们访问www.baidu.com时,实际上返回的是www.a.shifen.com的地址,并且后者有两条A记录,分别指向183.2.172.185183.2.172.42这两个地址。这带来好处相当于用www.baidu.com对用户要访问的服务器做了一层封装,后续服务器变更的话,只要修改www.a.shifen.com就可以了,不需要改www.baidu.com这个访问域名。

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

PTR记录用于从IP地址反查域名。使用dig -x可以用于查询PTR记录。

ricktian@ricktian-ubuntu:~$ dig -x 185.199.110.153
...
;; ANSWER SECTION:
153.110.199.185.in-addr.arpa. 587 IN	PTR	cdn-185-199-110-153.github.com.

如上的结果显示,185.199.110.153这台服务器的域名是cdn-185-199-110-153.github.com

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

查询机制

这样看起来dns很简单嘛,就是找一台服务器,把key=>value字典一存,大家要访问服务的时候,往这个服务器查一下地址就可以了。 但是实际的情况却远远复杂。。。 接下来尝试用dig工具来剖析一下dns查询的过程。

www.baidu.com为例,我们使用dig工具来查询一下dns信息。

ricktian@ricktian-ubuntu:~$ dig www.baidu.com

; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14903
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 10

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

;; ANSWER SECTION:
www.baidu.com.		933	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	600	IN	A	183.2.172.185
www.a.shifen.com.	600	IN	A	183.2.172.42

;; AUTHORITY SECTION:
a.shifen.com.		82	IN	NS	ns3.a.shifen.com.
a.shifen.com.		82	IN	NS	ns1.a.shifen.com.
a.shifen.com.		82	IN	NS	ns4.a.shifen.com.
a.shifen.com.		82	IN	NS	ns2.a.shifen.com.
a.shifen.com.		82	IN	NS	ns5.a.shifen.com.

;; ADDITIONAL SECTION:
ns5.a.shifen.com.	964	IN	A	180.76.76.95
ns1.a.shifen.com.	176	IN	A	110.242.68.42
ns2.a.shifen.com.	964	IN	A	220.181.33.32
ns3.a.shifen.com.	131	IN	A	153.3.238.162
ns3.a.shifen.com.	131	IN	A	36.155.132.12
ns4.a.shifen.com.	65	IN	A	111.20.4.28
ns4.a.shifen.com.	65	IN	A	14.215.177.229
ns5.a.shifen.com.	364	IN	AAAA	240e:bf:b801:1006:0:ff:b04f:346b
ns5.a.shifen.com.	364	IN	AAAA	240e:940:603:a:0:ff:b08d:239d

;; Query time: 12 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Jun 01 17:09:34 CST 2024
;; MSG SIZE  rcvd: 359

上面的信息看起来很冗长,我们按照section来讲。

  • 查询参数和统计信息

这个部分是查询的输入参数和统计信息,不需要太关注。

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

问题section,展示我们向dig提出的问题。;www.baidu.com. IN A表示尝试查询www.baidu.com的A记录,A是Address的缩写。

  • ANSWER SECTION
;; ANSWER SECTION:
www.baidu.com.		933	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	600	IN	A	183.2.172.185
www.a.shifen.com.	600	IN	A	183.2.172.42

答案section,展示问题的答案。

这里可以看到出现了一个CNAME记录,CNAMEwww.a.shifen.com。同时带了www.a.shifen.com的2个A记录,两个IP地址。933600是TTL值(Time to live的缩写),表示缓存时间,即这么长时间内不用重新查询。

  • AUTHORITY SECTION
;; AUTHORITY SECTION:
a.shifen.com.		82	IN	NS	ns3.a.shifen.com.
a.shifen.com.		82	IN	NS	ns1.a.shifen.com.
a.shifen.com.		82	IN	NS	ns4.a.shifen.com.
a.shifen.com.		82	IN	NS	ns2.a.shifen.com.
a.shifen.com.		82	IN	NS	ns5.a.shifen.com.

Name Server section,展示域名a.shifen.comNS记录,即5个域名服务器,向其中任何一台查询就能知道域名的IP地址是什么。

  • ADDITIONAL SECTION
;; ADDITIONAL SECTION:
ns5.a.shifen.com.	964	IN	A	180.76.76.95
ns1.a.shifen.com.	176	IN	A	110.242.68.42
ns2.a.shifen.com.	964	IN	A	220.181.33.32
ns3.a.shifen.com.	131	IN	A	153.3.238.162
ns3.a.shifen.com.	131	IN	A	36.155.132.12
ns4.a.shifen.com.	65	IN	A	111.20.4.28
ns4.a.shifen.com.	65	IN	A	14.215.177.229
ns5.a.shifen.com.	364	IN	AAAA	240e:bf:b801:1006:0:ff:b04f:346b
ns5.a.shifen.com.	364	IN	AAAA	240e:940:603:a:0:ff:b08d:239d

补充信息section,内容为上述Name Server的IP地址。

  • DNS服务的传输信息
;; Query time: 12 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Jun 01 17:09:34 CST 2024
;; MSG SIZE  rcvd: 359

从上面的结果可以看出,本地的DNS服务器是127.0.0.53,端口为53(DNS服务器的默认端口),相应长度为359字节。

查询简要信息

可以通过+short参数,查看简要信息

ricktian@ricktian-ubuntu:~$ dig +short www.baidu.com
www.a.shifen.com.
183.2.172.185
183.2.172.42

DNS服务器

在Linux系统里,DNS服务器的IP地址保存在/etc/resolv.conf文件中。如下:

ricktian@ricktian-ubuntu:~$ cat /etc/resolv.conf 
nameserver 127.0.0.53

有一些公共的DNS服务器也可以使用,例如Google的8.8.8.8和Level3的4.2.2.2

本机只向自己的DNS服务器查询,如果要指定其他DNS服务器,可以通过dig @来查询,如下:

ricktian@ricktian-ubuntu:~$ dig @8.8.8.8 www.baidu.com

域名的层级

DNS服务器在呢么会知道每个域名的IP地址呢?答案是分级查询。

我们在之前的查询结果中,看到的域名是这样的www.a.shifen.com.,最后有个.,这不是句号,而是其实每个域名有个根域名,在尾部。例如www.a.shifen.com.的域名实际上是www.a.shifen.com.root,只是因为根域名大家都是root,索性直接忽略了。

根域名的下一级,称为“顶级域名”(top-level domain,缩写为TLD),比如:.com.net;再下一级叫做“次级域名”(second-level domain,缩写为SLD),比如www.a.shifen.com中的.shifen,这一级的域名是用户可以注册的;再往下可以称为“子域名”(sub domain),子域名是可以多级的,例如www.a.shifen.com中的www.a,这里有两级,一般来说,子域名不会甚至太多级,两、三级足够了。

总结来说,域名的层级结构如下: 子域名.次级域名.顶级域名.根域名

根域名服务器

DNS服务器根据域名的层级,进行分级查询。

需要明确的是,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。

所谓“分级查询”,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下:

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

源头是从“根域名服务器”开始的,那么“根域名服务器”是从那里获取到的呢?这里很简单,“根域名服务器”的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。

其它DNS工具

除了dig,还有一些其他小工具也可以使用。

host

host命令可以看作dig的简化版本,返回当前请求域名的各种记录。

ricktian@ricktian-ubuntu:~$ host www.baidu.com
www.baidu.com has address 183.2.172.42
www.baidu.com has address 183.2.172.185
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has IPv6 address 240e:ff:e020:9ae:0:ff:b014:8e8b
www.a.shifen.com has IPv6 address 240e:ff:e020:966:0:ff:b042:f296
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com is an alias for www.wshifen.com.

host命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x <ip>

ricktian@ricktian-ubuntu:~$ host 192.30.252.153
153.252.30.192.in-addr.arpa domain name pointer lb-192-30-252-153-iad.github.com.

nslookup

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

ricktian@ricktian-ubuntu:~$ nslookup
> www.baidu.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	www.baidu.com
Address: 183.2.172.42
Name:	www.baidu.com
Address: 183.2.172.185
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 240e:ff:e020:966:0:ff:b042:f296
Name:	www.a.shifen.com
Address: 240e:ff:e020:9ae:0:ff:b014:8e8b
> 

whois

whois github.com

参考资料

DNS 原理入门 (阮一峰大侠神作)

总结

本文介绍了DNS的入门概念,并通过dig工具简单地演示了dns的查询机制,希望对你有帮助~