配色: 字号:
关于DNS,你应该知道这些
2017-01-09 | 阅:  转:  |  分享 
  
关于DNS,你应该知道这些

在互联网时代中,如果要问哪个应用层协议最重要的话,我想答案无疑是DNS.虽然我们每天都享受着DNS服务带来的便利,

却对它往往知之甚少.因此本文就来介绍一下DNS协议的工作流程,真正认识一下这个支撑着庞大互联网络的基础服务.



前言

DNS协议,全称为DomainNameSystem,即域名服务,其功能描述起来很简单,就是将域名(网址)转换为IP地址.

可以想象为一个存储了全世界域名到IP的映射的服务器,通过DNS请求查询获得IP地址.然而事实上域名的

数量繁多,如果全部存放在一台服务器之上显然不合适.因此对不同层级的域名往往需要在不同的域名服务器上查找,

直至找到最终的IP地址或者下一层级的域名服务器,是一个多次查找的过程.



域名的分级

我们日常上网所输入的网址,格式例子为http://www.pppan.net,其中www.pppan.net就可以看作是域名.

实际上,域名是从右到左分级的,格式如下所示:



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

即:

host.sld.tld.root

以www.pppan.net为例,其完整的域名应该是‵www.pppan.net.root‵,由于全球的根域名都是root,因此根域名

部分常常忽略,因此可以写成www.pppan.net.(注意最后的点),



根域名



根域名通过根服务器进行解析,根服务器对于每个请求告知顶级域名服务器的地址.目前全世界一共有十三台根服务器,

由于不同国家或机构管理维护,分别坐落在如下的地方:



root-servers



可以看到其中没有一台是在中国境内的,不知道这是好事还是坏事呢?呵呵.



顶级域名



顶级域名,英文名为TLD(Top-LevelDomains).根据用途不同被分为两部分.一部分称为通用顶级域名gTLD(genericTLD),

如.com,.net,.org,.biz,.info等都是常见的通用顶级域名;另一部分称为国别顶级域名ccTLD(countrysideTLD),

ccTLD对应的国家拥有对应域名进行任何限制的权力,有的国家只允许本国公民注册ccTLD域名,不过其他国家的机构可以通过"租"

的方式来获得对应国家的ccTLD域名,常见的ccTLD类型域名有.cn,.us,.ru等,还有些国家国别顶级域名因为有特殊的含义

而被批量租用的,如.tv,.ws,.tk等.



次级域名



次级域名,英文名为SLD(Sub-LevelDomains),通常又被称为二级域名.这一级别的域名是用户可以向域名代理商进行注册的,

我们通常说的购买域名,就是买的次级域名.



主机名



主机名(hostname),为用户在自己的域中为服务器所分配的不同的名称.常见的www就是一个主机名.



域名查找

当我们知道一个用名称表示的资源时,为了访问这个资源,我们就需要知道其地址,这个地址通常也称为记录(records).

这个根据资源名称(域名)来查找地址的过程,就称为DNS,DNS查找通常会经过下面四步:



询问Resolver

询问根服务器

询问顶级域名服务器

询问次级域名服务器

Resolver



resolver就是我们常说的DNS服务器,其作用是为我们提供域名服务器的地址.resolver的地址一般在我们接入网络的时候,

通过DHCP获得,也可以手动指定resolver地址.在Linux系统中可以查看/etc/resolv.conf文件查看resolver地址,

Windows则可以通过控制面板查看.



resolver通常有个root-hints文件,其中硬编码了十三个根域名服务器的地址.当我们向resolver发起DNS请求时,

resolver会同时向所有根域名服务器发出查找请求,并以最快返回的响应为结果执行下一步的操作.实际上,

resolver会根据响应速度获得一个优先查找的根服务器,并将随后的查找都只向此根服务器进行请求.当然,

优先服务器也有自己的更新机制,不过这是题外话了.



resolver获得根服务器的地址之后,通常还需要进行下一步的查询.如果我们要查找的域名为www.example.com,

则还需要向根服务器查找com的顶级域名服务器,然后再查找次级域名服务器和主机名等.



询问根服务器



上面也说了,全球一共是三个根域名服务器,其中每一个都知道可以处理此次DNS请求的次级域名服务器的地址,

或者至少知道可以处理请求的下级的域名服务器地址.



一般来说,根服务器处理DNS请求,并且告诉resolver下一步应该去询问哪个顶级服务器.不过如果根服务器识别出了

次级服务器的地址,就会把这个地址返回给resolver的.



询问顶级域名服务器



如果上一步根服务器没有识别出次级域名服务器的地址,那么就会给resolver返回顶级服务器的地址,从而resolver

需要再次向顶级域名服务器发起查询.



顶级域名服务器收到查询请求后,会将可以真正解析此请求的次级域名服务器地址返回给resolver.



询问次级域名服务器



上一步resolver请求顶级域名服务器后,会收到返回,内容是下一步要查询的域名服务器的地址,

也就是次级域名服务器的地址.于是resolver向次级域名服务器发起DNS查询请求,次级域名

服务器接收到请求后即返回对应次级域名的IP地址.



值得一提的是,次级域名还有如下的别名:



用户DNS名称服务器(UserDNSnameserver)

权威名称服务器(Authoritativenameserver)

其中后者更广为人知一些,因为SLD是查询到对应域名IP地址的最后一步(如果有的话),而且这个域名服务器也负责

对应资源的DNS设置,如添加不同主机地址的记录等.



resolver从次级域名服务器获得了域名的IP地址,并将其返回给用户,只此便完成了一次DNS查询.



域名查找实例

纸上得来终觉浅,绝知此事要躬行.上面介绍了域名查找的一般流程之后,我们就可以通过一次真实的DNS查找来

验证上述的过程.在Linux环境下,有默认的dig命令可以进行DNS的查找和调试,这里以域名test.pppan.net为例.

输入命令dig+tracetest.pppan.net可以看到详细的查找过程.



Step1



首先,向用户的DNS服务器(resolver,这里是10.0.20.166)查询根域名服务器的地址(stdqueryAa-m.root-servers.net),

其中A表示查询ipv4地址记录,AAAA表示查询ipv6地址,在下一节详细介绍.返回结果如下:



.318381INNSj.root-servers.net.

.318381INNSk.root-servers.net.

.318381INNSl.root-servers.net.

.318381INNSm.root-servers.net.

.318381INNSa.root-servers.net.

.318381INNSb.root-servers.net.

.318381INNSc.root-servers.net.

.318381INNSd.root-servers.net.

.318381INNSe.root-servers.net.

.318381INNSf.root-servers.net.

.318381INNSg.root-servers.net.

.318381INNSh.root-servers.net.

.318381INNSi.root-servers.net.

;;Received811bytesfrom10.0.20.166#53(10.0.20.166)in247ms

可以看到,一共有13个根域名服务器,地址分别是a-m.root-servers.net.,其中响应最快的根域名服务器是

j.root-servers.net.



Step2



然后,向j-root-servers.net(192.58.128.30)发起查询请求(standardqueryAtest.pppan.net),

得到的返回如下:



net.172800INNSa.gtld-servers.net.

net.172800INNSb.gtld-servers.net.

net.172800INNSc.gtld-servers.net.

net.172800INNSd.gtld-servers.net.

net.172800INNSe.gtld-servers.net.

net.172800INNSf.gtld-servers.net.

net.172800INNSg.gtld-servers.net.

net.172800INNSh.gtld-servers.net.

net.172800INNSi.gtld-servers.net.

net.172800INNSj.gtld-servers.net.

net.172800INNSk.gtld-servers.net.

net.172800INNSl.gtld-servers.net.

net.172800INNSm.gtld-servers.net.

net.86400INDS35886827862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D8BD973EE

net.86400INRRSIGDS8186400201701210500002017010804000061045.Y6+Td6BUfPw5RgC2aWX/pvC6OgEl8rVd3SCPtg+/qdwHxRa4TM8ppZWU+nTSRNTwgXX1VWxJ8D7MNu4q8gLZZWxO1U+3Viw8WNSRdIou+s2fVwonIQVF9y0GGpLaKt8mwlOaeHO3O1HiGGpR50GTlNhxyx6eGYHu5581ugFmNTjogYmrcTy5Es70WH6NhQ1z7+rO8rcuo5ES7fJoZWr4Bekd7YntSxXx+WCwOcpf3muLGPC9yshNprA/c9Fam3WDpJLYPjmCp2l96GyrJcv4o9z9gov5IV69HWQnCD9IGRIj/XG/JZerp6YIRGH8cnrVe3F87Hy95SkNWnYRlC5fIg==

;;Received863bytesfrom192.58.128.30#53(j.root-servers.net)in524ms

并没有返回IP,而是返回了可以解析该域名的顶级域名地址,由于是.net因此属于gTLD,

可以看到返回了多个顶级域名服务器(a-m.gtld-servers.net.)的地址.



Step3



接着,我们应该向返回的地址再次发起查询(standardqueryAtest.pppan.net),

这次返回了次级域名服务器的地址,如下:



pppan.net.172800INNSns01.freenom.com.

pppan.net.172800INNSns02.freenom.com.

pppan.net.172800INNSns03.freenom.com.

pppan.net.172800INNSns04.freenom.com.

A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.86400INNSEC3110-A1RUUFFJKCT2Q54P78F8EJGJ8JBK7I8BNSSOARRSIGDNSKEYNSEC3PARAM

A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net.86400INRRSIGNSEC38286400201701130608492017010604584943880net.WTfL5/hHBUsV2D5vusIP5KNSoiyfG4sG0GZQuBUqppWEY/WgZJ2wnnpkjjjfN5BlIExTuDyHclY2bXbiIqebcd1aVGp1ELUI7E5t3z7iCZmajPsTTLuLohKJmLC7b/OVdxoAuFoaIqj+GDsp2yDkXsem1IrfSOCbQlvJE9YaxbQ=

OKR8BNVHVTI8CTK5KIDNJN546MJM5M16.net.86400INNSEC3110-OKSF929IG7A7E1KLTJD5CF495DR06C54NSDSRRSIG

OKR8BNVHVTI8CTK5KIDNJN546MJM5M16.net.86400INRRSIGNSEC38286400201701130605462017010604554643880net.BGw3/vY9GzViJNHllwJkC1WB5XBtV9jzjy3LSA9I0zovOpVFHivHE01Sr3YUtqAUuJ0LOJ4wrxBPwDRB0wTgbQdIO7dol2nQWuYujbxEbJ6AOWtR7MTRhiG8BDn9LP06UWpUcWlsyywivKR70xCnamq3ZKeeI48dluRkVy9flig=

;;Received679bytesfrom192.33.14.30#53(b.gtld-swww.baiyuewang.netervers.net)in1813ms

这一步返回可以看到,pppan.net所属的次级域名服务器是ns01-ns04.freenom.com,因为我配置的就是这个地址.

但实际上可以自己在公网搭建这样一个次级域名服务器,只要可以解析出对应的hostname即可.



Step4



最后,向ns01.freenom.com发起查询,便可以从响应中看到,已经找到了test.pppan.net的一条地址记录:



test.pppan.net.14440INA233.233.233.233

;;Received59bytesfrom54.171.131.39#53(ns01.freenom.com)in464ms

因此便能得到本次DNS查询的结果,即test.pppan.net的ip地址为233.233.233.233.



注:对于用户而言,其实只进行一次DNS查询,即向resolver的查询,中间的过程由resolver进行按级查询,

并将最后查询到的结果返回给用户(如果有的话).上面的查询由dig命令发起,因此和实际的查询过程还是有点小差别的.



记录类型

从上面的示例中我们可以看到,我们查询的记录类型为A或者AAAA,返回的结果类型有NS,DS或者A等.

这些记录的类型在DNS协议中都有详细介绍,这里只解释几个常见的类型:



A



A记录(AddressMappingrecords),指示了对应名称的IPv4地址,A记录用来将域名转换为ip地址.



AAAA



AAAA记录类似于A记录,只不过指示的是IPv6的地址.



NS



NS记录(NameServerrecords),用来指定对应名称的可信名称服务器(authoritativenameserver).



PTR



PTR记录(Reverse-lookupPointerrecords),和正向DNS解析(A/AAAA记录)相反,主要用来根据IP地址查找对应的域名.



CNAME



CNAME记录即CanonicalNamerecords,用来指定一个新的域名用以完成本次查询.

当resolver查询过程中遇到一个CNAME记录时,则会重新开始本次查询,但是查询的域名会改为CNAME指定的域名.

举例来说,假如某次级域名服务器上有如下记录:



NAMETYPEVALUE

--------------------------------------------------

bar.example.com.CNAMEfoo.example.com.

foo.example.com.A192.0.2.23

则查询bar.example.com的时候,会在resolver端转而查询foo.example.com,从而得到查询的地址为192.0.2.23,

可以看到其实CNAME就是一个别名,但是增加了查找的步骤.不过这在当我们想要把自己的某个域名当作某个外部

域名的别称时还是很有用的.CNAME也有使用限制,比如记录值不可以是IP,以及不可同时有其他同名的A记录等,

具体可以参考这里.



MX



MX记录(MailExchangerrecords)为某个DNS域名指定了邮件交换的服务器.这个记录信息由SMTP协议使用来将

邮件发送到正确的主机上.通常对于一个域名有多个邮件交换服务器,并且他们之间都有对应的优先级.



TXT



TXT记录(textrecords)可以包含任意非格式化的文本信息,通常这项记录被SPF框架(SenderPolicyFramework)

用来防止发送给你的虚假邮件.



当然还有许多其他的记录类型,不过相对而言没有那么常见.需要了解的可以再深入查阅DNS协议的白皮书即可.



后记

经过上面对于DNS服务的解释,我们应该就能解决大部分日常遇到的DNS问题.比如为什么电脑能上QQ却打不开网页啦,

为什么我的网站突然解析不出来啦;或者有独立域名的还能实现一些好玩的功能,比如创建恶作剧的查询记录,或者

搭建个人邮件服务器等.毕竟DNS协议是我们日常直接或者间接所接触到的最多的协议,花上几个小时了解一下它的

工作机制,我想应该也是挺有趣的吧.

献花(0)
+1
(本文系thedust79首藏)