DNS详解

DNS解析详解


一.  什么是DNS

    网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。
      DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

  • 权威DNS

权威DNS即最终决定域名解析结果的服务器,开发者可以在权威DNS上配置、变更、删除具体域名的对应解析结果信息。阿里云云解析( https://wanwang.aliyun.com/domain/dns )即权威DNS服务提供商。

  • 递归DNS

递归DNS又称为Local DNS,它没有域名解析结果的决定权,但代理了用户向权威DNS获取域名解析结果的过程。递归DNS上有缓存模块,当目标域名存在缓存解析结果并且TTL未过期时(每个域名都有TTL时间,即有效生存时间,若域名解析结果缓存的时间超过TTL,需要重新向权威DNS获取解析结果),递归DNS会返回缓存结果,否则,递归DNS会一级一级地查询各个层级域名的权威DNS直至获取最终完整域名的解析结果。关于域名解析的具体流程下文会举例说明。

  • 公共DNS

公共DNS是递归DNS的一种特例,它是一种全网开放的递归DNS服务,而传统的递归DNS信息一般由运营商分发给用户。一个比较典型的公共DNS即Google的8.8.8.8,我们可以通过在操作系统配置文件中配置公共DNS来代替Local DNS完成域名解析流程。
在实际的使用过程中,我们通常不需要手工指定自己的Local DNS地址。运营商会通过DHCP协议在系统网络初始化阶段将Local DNS地址分配给我们的计算机。当我们需要使用公共DNS服务时,我们就必须手工指定这些服务的地址。以Linux为例,我们可以通过在'/etc/resolv.conf'中添加Local DNS地址项来改变本机Local DNS的地址。

二.  DNS域名称

域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,例如:im.qq.com。
完全限定的域名 (FQDN) 唯一地标识在 DNS 分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。 下图显示与主机称为 im 内 qq.com DNS 树的示例。 主机的 FQDN 是 im.qq.com。


  • DNS域名的层次结构(根域、顶级域、二级域)
   DNS系统一般采用树状结构进行组织,以ru.wikipedia.org为例,org为顶级域名,wikipedia为二级域名,ru为三级域名,域名树状组织结构如下图所示。
 
  • DNS域名称空间的组织方式
按其功能命名空间中用来描述 DNS 域名称的五个类别的介绍详见下表中,以及与每个名称类型的示例。
 
  • DNS 和 Internet 域

互联网域名系统由名称注册机构负责维护分配由组织和国家/地区的顶级域在 Internet 上进行管理。 这些域名按照国际标准 3166。 一些很多现有缩写,保留以供组织中,以及两个字母和三个字母的国家/地区使用的缩写使用下表所示。一些常见的DNS域名称如下图:


  • 资源记录(RP)
DNS 数据库中包含的资源记录 (RR)。 每个 RR 标识数据库中的特定资源。我们在建立DNS服务器时,经常会用到SOA,NS,A之类的记录,在维护DNS服务器时,会用到MX,CNAME记录。

常见的RR见下图:


DNS分为正向查找区域和反向查找区域,然后在分为,主要,辅助,存根区域,在这些区域里,又存在着很多的记录,今天,就让我们来看看这些记录:
1,A记录
A记录也称为主机记录,是使用最广泛的DNS记录,A记录的基本作用就是说明一个域名对应的IP是多少,   它是域名和IP地址的对应关系,表现形式为   
  www.contoso.com   192.168.1.1  这就是一个A记录!A记录除了进行域名IP对应以外,还有一个高级用法,可以作为低成本的负载均衡的解决方案,比如说,www.contoso.com  可以创建多个A记录,对应多台物理服务器的IP地址,可以实现基本的流量均衡。
2,NS记录
  NS记录和SOA记录是任何一个DNS区域都不可或缺的两条记录,NS记录也叫名称服务器记录,用于说明这个区域有哪些DNS服务器负责解析,SOA记录说明负责解析的DNS服务器中哪一个是主服务器。因此,任何一个DNS区域都不可能缺少这两条记录。NS记录,说明了在这个区域里,有多少个服务器来承担解析的任务。
3,SOA记录
  NS记录说明了有多台服务器在进行解析,但哪一个才是主服务器呢,NS并没有说明,这个就要看SOA记录了,SOA名叫起始授权机构记录,SOA记录说明了在众多NS记录里那一台才是主要的服务器。
4,MX记录
  全称是邮件交换记录,在使用邮件服务器的时候,MX记录是无可或缺的,比如A用户向B用户发送一封邮件,那么他需要向DNS查询B的MX记录,DNS在定位到了B的MX记录后反馈给A用户,然后A用户把邮件投递到B用户的MX记录服务器里。
5,Cname记录
  又叫别名记录,我们可以这么理解,我们小的时候都会有一个小名,长大了都是学名,那么正规来说学名的符合公安系统的,那个小名只是我们的一个代名词而已,这也存在一个好处,就是比暴漏自己,比如一个网站a.com 在发布的时候,他可以建立一个别名记录,把B.com发不出去,这样不容易被外在用户所察觉!达到隐藏自己的目的。
6,SRV记录
  SRV记录是服务器资源记录的缩写,SRV记录是DNS记录中的新鲜面孔,在RFC2052中才对SRV记录进行了定义,因此很多老版本的DNS服务器并不支持SRV记录。那么SRV记录有什么用呢?SRV记录的作用是说明一个服务器能够提供什么样的服务!SRV记录在微软的Active Directory中有着重要地位,大家知道在NT4时代域和DNS并没有太多关系。但从Win2000开始,域就离不开DNS的帮助了,为什么呢?因为域内的计算机要依赖DNS的SRV记录来定位域控制器!表现形式为:
—ldap._tcp.contoso.com 600 IN SRV 0 100 389 NS.contoso.com
ladp: 是一个服务,该标识说明把这台服务器当做响应LDAP请求的服务器
tcp:本服务使用的协议,可以是tcp,也可以是用户数据包协议《udp》
contoso.com:此记录所值的域名
600: 此记录默认生存时间(秒)
IN: 标准DNS Internet类
SRV:将这条记录标识为SRV记录
0: 优先级,如果相同的服务有多条SRV记录,用户会尝试先连接优先级最低的记录
100:负载平衡机制,多条SRV并且优先级也相同,那么用户会先尝试连接权重高的记录
389:此服务使用的端口
NS.contoso.com:提供此服务的主机
7,PTR记录
PTR记录也被称为指针记录,PTR记录是A记录的逆向记录,作用是把IP地址解析为域名。由于我们在前面提到过,DNS的反向区域负责从IP到域名的解析,因此如果要创建PTR记录,必须在反向区域中创建。

三. DNS解析过程

1.现在我有一台计算机,通过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。

2.现在的我计算机要向这台ISPDNS发起请求查询www.baidu.com这个域名了,(经网友提醒:这里其实准确来说不是ISPDNS,而应该是用户自己电脑网络设置里的DNS,并不一定是ISPDNS。比如也有可能你手工设置了8.8.8.8)

3.ISPDNS拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答

4.如果缓存中没有的话,ISPDNS会从配置文件里面读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置文件中),

5.然后像其中一台发起请求。

6.根服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,一般来说是13台主机名和IP。

7.然后ISPDNS向其中一台再次发起请求,com域的服务器发现你这请求是baidu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查。

(目前百度有4台baidu.com的顶级域名服务器)。

8.ISPDNS不厌其烦的再次向baidu.com这个域的权威服务器发起请求,baidu.com收到之后,查了下有www的这台主机,就把这个IP返回给你了,

9.然后ISPDNS拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。

下面我们来用 nslookup 这个工具详细来说一下解析步骤:



从上图我们可以看到:

          第一行Server是:DNS服务器的主机名--210.32.32.1

          第二行Address是: 它的IP地址--210.32.32.1#53

          下面的Name是:解析的URL--   www.jsjzx.com

          Address是:解析出来的IP--112.121.162.168

但是也有像百度这样的DNS比较复杂的解析:


你会发现百度有一个cname = www.a.shifen.com  的别名。

这是怎么一个过程呢?

我们用dig工具来跟踪一下把(linux系统自带有)

Dig工具会在本地计算机做迭代,然后记录查询的过程。


第一步是向我这台机器的ISPDNS获取到根域服务区的13个IP和主机名[b-j].root-servers.net.。

第二步是向其中的一台根域服务器(Servername就是末行小括号里面的)发送www.baidu.com的查询请求,他返回了com.顶级域的服务器IP(未显示)和名称,

第三步,便向com.域的一台服务器192.33.4.12请求,www.baidu.com,他返回了baidu.com域的服务器IP(未显示)和名称,百度有四台顶级域的服务器


【此处可以用dig @192.33.4.12 www.baidu.com查看返回的百度顶级域名服务器IP地址】。

第四步呢,向百度的顶级域服务器(202.108.22.220)请求www.baidu.com,他发现这个www有个别名,而不是一台主机,别名是www.a.shifen.com。


按照一般的逻辑,当dns请求到别名的时候,查询会终止,而是重新发起查询别名的请求,所以此处应该返回的是www.a.shifen.com而已。

但是为什么返回a.shifen.com的这个域的NS呢?

我们可以尝试下面的这个命令:dig +trace  shifen.com 看看有什么结果。。。。。。。。



你会发现第三步时shifen.com这个顶级域的域名服务器和baidu.com这个域的域名服务器是同一台主机(即:dns.baidu.com)!

当我拿到www.baidu.com的别名www.a.shifen.com的时候,我本来需要重新到com域查找shifen.com域的NS,但是因为这两个域在同一台NS上,所以直接向本机发起了,

shifen.com域发现请求的www.a.shifen.com是属于a.shifen.com这个域的,

于是就把a.shifen.com的这个NS和IP返回,让我到a.shifen.com这个域的域名服务器上查询www.a.shifen.com。

于是我便从ns X .a.shifen.com中一台拿到了一条A记录,最终的最终也便是www.baidu.com的IP地址了.【此处也可以用dig +trace www.a.shifen.com】跟踪一下

用一个图来说明一下(图中第三步的全世界只有13台是错误的)



以下内容为在虚拟机中搭建local dns服务器得到的实验数据,纠正上述结论

在上面的分析中,我们用dig工具进行了追踪,但是dig没有继续追踪当我们从baidu.com拿到cname和ns2.a.shifen.com的IP之后的事情。

我们就所以然的下结论认为local dns会向ns2.a.shifen.com请求www.a.shifenc.om。

其实这个想法是错误,在自己的本地搭建一个local dns,抓取整个解析过程中是所有包,看看就明白拉。

实际的结果是虽然dns.baidu.com返回了a.shifen.com域的服务器地址和IP,

但是localdns并不是直接向上述返回的IP请求www.a.shifen.com,而是再一次去请求com域,得到shifen.com域的服务器(也就是baidu.com的那四台),

然后又请求www.a.shifen.com,返回a.shifen.com的域的服务器,最后才是去请求www.a.shifen.com,

虽然上面已经返回了IP,但是实验的结果就是再走一遍shifen.com域的查询。


上图就是localdns在解析www.baidu.com的抓包全过程。蓝色那条就是在收到cname和响应的a.shifen.com的域名服务器IP地址之后,继续向com域请求shifen.com。


这个图充分说明了返回cname的同时也返回了ns2.a.shifen.com的IP。

因此总结一下便是

 ①本机向local dns请求www.baidu.com

 ②local dns向根域请求www.baidu.com,根域返回com.域的服务器IP

 ③向com.域请求www.baidu.com,com.域返回baidu.com域的服务器IP

 ④向baidu.com请求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服务器IP

 ⑤向root域请求www.a.shifen.com

 ⑥向com.域请求www.a.shife.com

 ⑦向shifen.com请求

 ⑧向a.shifen.com域请求

 ⑨拿到www.a.shifen.com的IP

 ⑩localdns返回本机www.baidu.com cnamewww.a.shifen.com 以及 www.a.shifen.com的IP

四. DNS域维护

       域维护是指通过DNS协议来在主域名服务器和从域名服务器之间维护同一个zone文件。
  DNS中有两种域维护手段,一种是全量传输AXFR(full zone transfer),另一种是增量传输IXFR(incremental zone transfer)。

  • 全量传输AXFR

  全量传输时,从域名服务器从主域名服务器上请求zone文件,poll的时间间隔由SOA记录中的refresh标签定义。请求zone文件的过程是从域名服务器向主域名服务器发送查询来实现,如果主域名服务器中SOA记录中的序列号(serial number标签定义)大于从域名服务器SOA记录的序列号,从域名服务器就会向主域名服务器发送全量传输请求。所以主域名服务器一旦改变了zone文件,则需要增加它该zone中的序列号。整个SOA记录的完整格式见下图:
 
  通常情况下,序列号sn遵循“年+月+日+编号”的格式,如图中的2003080803表示该zone是2003年8月8日的第三次更新。
  全量传输时在TCP的53端口上进行。

  • 增量传输(IXFR)

  传递非常大的zone文件是非常耗资源的(时间、带宽等),尤其是只有zone中的一个记录改变的时候,没有必要传递整个zone文件,增量传输是允许主域名服务器和从域名服务器之间只传输那些改变的记录。
  需要注意的是,不是所有的域名服务器都支持增量传输,当不支持增量传输时,主从间就采用全量传输的方式。

  • 通告(NOTIFY)

  从上面的分析中可以看出,从服务器每隔refresh时间向主服务器发送请求,只有主服务器的SOA中的序列号大于从服务器的序列号才传输,但是如果这个时间间隔比较大的话(比如12个小时),快速变化的网络环境可能不允许有如此大时间的差异。
  所以在实现了通告消息的DNS集群中,DNS主服务器的zone文件发生改变后,它立即向从服务器发送一个NOTIFY消息,告诉从服务器我的zone文件发生改变了,接着从服务器马上对比两者的序列号,再采用上面介绍的全量传输或者增量传输的方法请求zone文件。
  BIND本身支持通告,通告的配置是在named.conf中的zone中的option中配置,配置指令是notify, also-notify和notify-source,具体见这里。

  • 动态更新

  每次需要更新zone文件的时候都需要停止域名服务器并重启,这样当zone文件很多的时候域名服务器重启时加载zone文件需要很多的时间。所以需要有一种不停止查询服务而且快速更新zone文件地方机制,这种机制主要有两种:
     一种是允许外部进程在服务器运行的时候更新zone文件;
  另外一种是将zone中的资源记录RR存储在数据库中,每次查找zone中记录的时候动态读取;

五. DNS协议及报文


1. DNS协议

    识别主机有两种方式:主机名、IP地址。前者便于记忆(如www.yahoo.com),但路由器很难处理(主机名长度不定);后者定长、有层次结构,便于路由器处理,但难以记忆。折中的办法就是建立IP地址与主机名间的映射,这就是域名系统DNS做的工作。DNS通常由其他应用层协议使用(如HTTP、SMTP、FTP),将主机名解析为IP地址,其运行在UDP之上,使用53号端口。
    注:DNS除了提供主机名到IP地址转换外,还提供如下服务:主机别名、邮件服务器别名、负载分配。
2. DNS报文
  • DNS报文格式
    DNS只有两种报文:查询报文、回答报文,两者有着相同格式,如下:
  

说明一下:并不是所有DNS报文都有以上各个部分的。图中标示的“12字节”为DNS首部,这部分肯定都会有,首部下面的是正文部分,其中查询问题部分也都会有。除此之外,回答、授权和额外信息部分是只出现在DNS应答报文中的,而这三部分又都采用资源记录(Recource Record)的相同格式,这个稍后会提到。下面逐个字段地分析DNS报文。

  • 首部区域(header)
标识数
    对该查询进行标识,该标识会被复制到对应的回答报文中,客户机用它来匹配发送的请求与接收到的回答。
标志[1]
 
QR(1比特):查询/响应的标志位,1为响应,0为查询。
opcode(4比特):定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求)。
AA(1比特):授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权威服务器(关于权威服务器以后再讨论)
TC(1比特):截断标志位。1表示响应已超过512字节并已被截断(依稀好像记得哪里提过这个截断和UDP有关,先记着)
RD(1比特):该位为1表示客户端希望得到递归回答(递归以后再讨论)
RA(1比特):只能在响应报文中置为1,表示可以得到递归响应。
zero(3比特):不说也知道都是0了,保留字段。
rcode(4比特):返回码,表示响应的差错状态,通常为0和3,各取值含义如下:
0 无差错
1 格式差错
2 问题在域名服务器上
3 域参照问题
4 查询类型不支持
5 在管理上被禁止
6 -- 15 保留


问题数、回答RR数、权威RR数、附加RR数

    这四个字段都是两字节,分别对应下面的查询问题、回答、授权和附加信息部分的数量。一般问题数都为1,DNS查询报文中,资源记录数、授权资源记录数和附加资源记录数都为0[1]。


  • 区域
     问题区域
    包含正在进行的查询信息。包含查询名(被查询主机名字的名字字段)、查询类型、查询类。
 
    查询名
    查询名部分长度不定,一般为要查询的域名(也会有IP的时候,即反向查询)。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。还是借个例子来说明更直观些,查询名为gemini.tuc.noao.edu的话,查询名字段如下[1]:
 

     查询类型
    通常查询类型为A(由名字获得IP地址)或者PTR(获得IP地址对应的域名),类型列表如下:

     NS记录指定了名字服务器。一般情况,每个DNS数据库中,针对每个顶级域都会有一条NS记录,这样一来,电子邮件就可以被发送到域名树中远处的部分。
查询类

    通常为1,指Internet数据。

回答、权威、附加区域   

回答区域包含了最初请求名字的资源记录,一个回答报文的回答区域可以包含多条资料记录RR(因为一个主机名可以对应多个IP地址,冗余Web服务器)。权威区域包含了其他权威DNS服务器的记录。附加区域包含其他一些"有帮助"的记录,例如,对于一个MX(邮件交换)请求的回答报文中,回答区域包含一条资料记录(该记录提供邮件服务器的规范主机名),附加区域可以包含一条类型A记录(该记录提供了该邮件服务器的规范主机名的IP地址)。

每条资料记录是一个五元组,如下:

(域名,生存期,类别,类型,值)

直接表示如下[1]:



域名(2字节或不定长)
    记录中资源数据对应的名字,它的格式和查询名字段格式相同。当报文中域名重复出现时,就需要使用2字节的偏移指针来替换。例如,在资源记录中,域名通常是查询问题部分的域名的重复,就需要用指针指向查询问题部分的域名。关于指针怎么用,TCP/IP详解里面有,即2字节的指针,最前面的两个高位是11,用于识别指针。其他14位从报文开始处计数(从0开始),指出该报文中的相应字节数。注意,DNS报文的第一个字节是字节0,第二个报文是字节1。一般响应报文中,资源部分的域名都是指针C00C(1100000000001100,12正好是首部区域的长度),刚好指向请求部分的域名[1]。
类型(记录的类型)
    A记录,Name是主机名,Value是该主机名的IP地址,因此,一条类型为A的资源记录提供了标准的主机名到IP地址的映射。
    NS记录,Name是域(如foo.com),Value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名(如dns.foo.com),这个记录常用于沿着查询链进一步路由DNS查询。
    CNAME记录,Name是主机别名,Value是主机别名对应的规范主机名,该记录能够向请求主机提供一个主机名对应的规范主机名。
    MX记录,Name是邮件服务器别名,Value是邮件服务器别名的规范主机名。通过MX记录,一个公司的邮件服务器和其他服务器可以使用相同的别名。
    注:有着复杂主机名的主机能拥有多个别名,前者称为规范主机名,后者称为主机别名(便于记忆)。

    对于Internet信息,它总是IN。
生存时间
    用于指示该记录的稳定程度,极为稳定的信息会被分配一个很大的值(如86400,一天的秒数)。该字段表示资源记录的生命周期(以秒为单位),一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间[1]。
资源数据长度(2字节)
    表示资源数据的长度(以字节为单位,如果资源数据为IP则为0004)。
资源数据

    该字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。

3. DNS查询报文

实例以www.baidu.com为例,用Wireshark俘获分组,结合2.1的理论内容,很容易看明白的,DNS请求报文如下:

 
  • DNS回答报文实例


  • 15
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值