一、DNS是什么
DNS(Domain Name System——域名系统)的作用非常简单,就是根据提供的域名,来查询相应的IP地址。这个系统的目的也很简单,避免人们去记忆数字形式的IP地址,因为字母比数字要容易记些。就好像你的电话簿,你不可能记住里面所有的电话号码,但你可以很容易的知道一个人的名字。
二、查询过程
DNS的作用虽然简单,但是它的查询过程却比看起来的要复杂得多,分为好几个步骤。在linux下,你可以通过命令dig来显示DNS的查询过程。
$ dig baidu.com
命令的执行结果如下:
查询的结果包括了五段内容,第一段为查询的参数和统计
; <<>> DiG 9.10.3-P4-Ubuntu <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21572
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
第三段为查询内容
;; QUESTION SECTION:
;baidu.com. IN A
上面的内容意思是,查询域名baidu.com的A记录,其中A表示地址,即address的缩写
第四段为DNS服务器的回应内容
;; ANSWER SECTION:
baidu.com. 556 IN A 111.13.101.208
baidu.com. 556 IN A 180.149.132.47
baidu.com. 556 IN A 220.181.57.217
baidu.com. 556 IN A 123.125.114.144
上面的内容意思是,baidu.com有四个A记录,即四个IP地址。数字556是TTL(生存时间)值,表示缓存时间,即556秒之内不用重新查询,DNS服务器会把之前查询的结果直接返回给你。
第五段是DNS服务器的传输信息
;; Query time: 2 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sat Apr 08 20:06:11 CST 2017
;; MSG SIZE rcvd: 102
它的内容显示,本地DNS服务器的地址是127.0.1.1,DNS服务器的端口是53,以及回应内容的大小是102个字节。你可以通过”+short”参数来简化查询结果。
$ dig +short baidu.com
111.13.101.208
123.125.114.144
180.149.132.47
220.181.57.217
它的返回内容是查询域名对应的IP地址。
三、DNS服务器
想要使用DNS服务,你当然要知道DNS服务器的IP地址,否则你没法上网浏览网页了。DNS服务器的IP地址可以由DHCP协议为子网中的计算机动态分配,也可以使用固定的地址(比如谷歌的8.8.8.8)。Linux中,DNS服务器的IP地址保存在/etc/resolv.conf中。dig命令默认使用本机设置好的DNS服务器地址进行查询,你也可以通过参数”@”,来显示指定其他DNS服务器进行查询。
$ dig @8.8.8.8 baidu.com
四、域名的分级
域名分为多层,DNS服务器查询域名的IP地址,采用的方式也是分级查询。如果你仔细看前面的查询结果,你会发现每个域名的后面都有一个点”.”。
baidu.com.
我们在查询时输入的是baidu.com,而显示的结果却多了一个点。这不是错误,而是所有域名的尾部都有一个根域名。比如,www.example.com真正的域名是www.example.com.root,简写为www.example.com.。因为,根域名.root对于所有域名都是一样的,所以加以省略。
根域名的下一级,叫做“顶级域名”(top-level domain,缩写TLD),比如.com、.net,再下一级叫做“刺激域名”(second-level domain,缩写SLD),比如www.example.com,中的.example,这一级的域名可以进行注册;再下一级的叫做主机名(host),比如www.example.com中的www,又称为“三级域名”,这是用户自己为域里面为服务器分配的名称,是用户可以任意分配的。
可以知道域名的层级结构如下:
主机名.次级域名.顶级域名.根域名
#即
host.sld.tld.root
五、根域名服务器
DNS根据域名的层级,进行分级查询。
你需要知道,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。分级查询的就是一级一级的查询域名的NS记录,知道查询到最终的IP地址,大致过程如下:
- 从“根域名服务器”查到“顶级域名服务器”的NS记录和A记录
- 从“顶级域名服务器”查到“次级域名服务器”的NS记录和A记录
- 从“次级域名服务器”查到“主机名”的IP地址
如过仔细看,你会发现没有提到根域名服务器的IP地址是怎么知道的,答案是,根域名服务器的NS记录和IP地址几乎不会变,所以在DNS服务器中设置好了。根域名服务器全世界一共有十三组,从“A.ROOT-SERVERS.NET——M.ROOT-SERVERS.NET”,你可以访问
根域名服务器
,来获取根域名服务器的NS和IP地址信息。
. 518400 IN NS a.root-servers.net.
. 518400 IN NS b.root-servers.net.
. 518400 IN NS c.root-servers.net.
. 518400 IN NS d.root-servers.net.
. 518400 IN NS e.root-servers.net.
. 518400 IN NS f.root-servers.net.
. 518400 IN NS g.root-servers.net.
. 518400 IN NS h.root-servers.net.
. 518400 IN NS i.root-servers.net.
. 518400 IN NS j.root-servers.net.
. 518400 IN NS k.root-servers.net.
. 518400 IN NS l.root-servers.net.
. 518400 IN NS m.root-servers.net.
可以看到这些记录的TTL为518400秒,为144个小时。
六、分级查询演示
通过dig命令的+trace参数可以显示DNS的整个查询过程
$ dig +trace baidu.com
命令执行结果的第一段如下,其中列出了根域名 . 的所有NS记录,即所有根域名服务器:
; <<>> DiG 9.10.3-P4-Ubuntu <<>> +trace baidu.com
;; global options: +cmd
. 2530 IN NS m.root-servers.net.
. 2530 IN NS a.root-servers.net.
. 2530 IN NS c.root-servers.net.
. 2530 IN NS e.root-servers.net.
. 2530 IN NS l.root-servers.net.
. 2530 IN NS d.root-servers.net.
. 2530 IN NS h.root-servers.net.
. 2530 IN NS k.root-servers.net.
. 2530 IN NS j.root-servers.net.
. 2530 IN NS f.root-servers.net.
. 2530 IN NS g.root-servers.net.
. 2530 IN NS b.root-servers.net.
. 2530 IN NS i.root-servers.net.
根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问baidu.com的顶级域名服务器com.的NS记录。DNS服务器会选择最先回复的结果,并缓存,以后只向这台服务器发请求。
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.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 l.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
第二段内容显示了.com域名的13条NS记录和IP地址。然后DNS服务器向这些顶级域名服务器发出查询baidu.com的次级域名baidu.com的NS记录的请求。
baidu.com. 172800 IN NS dns.baidu.com.
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 ns7.baidu.com.
接着的结果显示了baidu.com有5条NS记录,同时返回每一条记录的对应的IP地址。然后DNS服务器向这些NS服务器查询baidu.com的主机名。
baidu.com. 600 IN A 111.13.101.208
baidu.com. 600 IN A 123.125.114.144
baidu.com. 600 IN A 180.149.132.47
baidu.com. 600 IN A 220.181.57.217
baidu.com. 86400 IN NS ns2.baidu.com.
baidu.com. 86400 IN NS ns4.baidu.com.
baidu.com. 86400 IN NS ns3.baidu.com.
baidu.com. 86400 IN NS ns7.baidu.com.
baidu.com. 86400 IN NS dns.baidu.com.
;; Received 272 bytes from 180.76.76.92#53(ns7.baidu.com) in 45 ms
查询结果如上,baidu.com有4条A记录,即这四个IP地址都可以访问baidu.com。并且显示了最先返回结果的是ns7.baidu.com。
七、DNS的记录类型
域名和IP之间的对应关系,称为“记录”(record)。根据使用的目的不同,又分为不同的类型,常见的DNS记录类型如下:
- A:地址记录(Address),返回域名指向的IP地址。
- NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
- MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
- CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
- PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名。