1 概述 DNS (Domain Name System,域名系统),由RFC1034、1035协议定义规范,用于TCP/IP网络的名称到IP地址的转换及有关电子邮件的选路信息。DNS是应用层协议,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库。所谓分布式是指在Internet上的当个站点不能拥有所有的信息。 在Internet网络上,用户记住的是友好的容易记忆的域名,但是网络中的计算机互相进行访问是通过IP地址,DNS最常用的是给用户提供解析服务,将用户的域名解析成网络上能够访问的IP地址,也就是标准查询(或正向查询)。例如将 http://www.tom.com网址解析成IP地址:202.108.12.68。 2 协议栈 图1 DNS协议栈 DNS服务器支撑TCP和UDP两种协议的查询方式,RFC上端口默认都是53。而大多数的查询都是使用UDP查询的,因为UDP提供无连接服务,比较快,而且能降低服务器的负载。 需要TCP查询的有三种情况: 一是当查询数据过大以至于产生了数据截断(应答数据包头部字段TC标志为1,可参见 5.1报文结构。),这意味着响应的数据长度超过512字节,仅返回前512字节。在遇到这种情况时,主机名字解析器通常使用TCP重复原来的查询请求,它将允许返回的响应超过512字节,利用TCP的分片能力来进行数据传输。对UDP来说就无能为力了。 二是当主DNS名字服务器和辅助DNS名字服务器之间进行区域备份传送时,需要可靠的传输,而且这里传送的数据远比一个查询或响应多得多,这就需要TCP传输了。 三是DNS服务器设定可以使用TCP连接,DNS客户端用TCP发起DNS请求,这时DNS服务器就会返回TCP负载的DNS应答数据。 DNS交互的端口可以不是RFC默认的53端口,可以在DNS服务器上配置其他非53端口与客户端通信。 3 DNS协议解析原理DNS域名系统从某个角度来说由两部分构成:一部分是客户端(client)程序,也叫名字解析器,运行在用户的主机上,是应用程序的一部分;另一部分是服务器端(server)程序,位于服务器端的主机上,这个服务器通常也叫名字服务器。名字服务器是用来提供从域名到IP地址的转换,解析器通过一个或多个名字服务器来完成名字和IP地址的相互转换。DNS服务器所管辖的域名建立对应的正逆向解析数据文件。 不过,大多数的查询涉及的是本地名字查询,即与产生查询的机器在同一个名字空间分区中。为了提高查询过程的效率,DNS名字服务器使用高速缓存(caching)来优化查询开销。每个服务器维护一个高速缓存,存放最近用过的名字以及从何处获得名字映射信息的记录,这样若干以后遇到相同的查询请求,就直接使用缓存中的结果而无需通过其他服务器查询。高速缓存不仅在本地名字服务器中重要,在主机中也同样有高速缓存。大多数主机解析App会在主机中对DNS项进行缓存。这样,如果用户重复查询同一个名字,后面几次的查找可以从本地高速缓存中获取,而不需要使用网络。服务器响应报文中包含一个生存周期TTL (Time to Live),指示缓存结果有效时间。(可参见5.3报文结构。) DNS服务器实现域名解析服务并提供域名IP动态更新服务。DNS域名系统采用TCP和UDP两种方式来实现客户端和DNS服务器之间的通讯,为了防止窃取传输内容,可以采用加密技术进行加密传输。为了加强DNS服务器的安全性,防止被恶意攻击,防止DNS数据库的内容被恶意篡改,通常在DNS服务器前设置一个响应服务器,用户的所有请求都直接同响应服务器联系,DNS服务器只接受来自响应服务器的请求。由于隔离了用户和DNS服务器的直接联系,提高了系统的安全性。一般大家把DNS服务器和响应服务器一起通称为DNS服务器。如下图2所示: 图2 DNS响应服务器 由于客观存在着网络异常现象,比如断电、断网等情况,导致用户非正常断线,当用户再次上网运行客户端,在客户端使用[ipconfig /registerdns]这个命令来更新域名的注册信息,服务器端将及时更新用户的数据。为了保证部分用户上网期间服务的正确性,系统在服务器端增加了监控进程,能在规定的时间内探知用户的生存与否,并通知DNS服务器继续或停止该域名的解析,从而保证访问者能够得到正确的信息。 4 概念说明1) DNS的名字空间是具有层次结构的树形结构,如图3所示,每个节点有一个标识,这棵树的树根是没有任何标识的特殊节点。树的叶表示主机名,而树的节点叫做域,它是该节点以下所有主机名的总称。命令树上任何一个节点的域名就是将该节点到最高层的域名串联起来,中间使用“.”分隔,如 www.tsinghua.edu. 命名标识中一律不区分大小写。 图3 DNS的层次结构 从概念上看,顶级域名分成了三种不同的命名分级方式:地理域(国家域),组织域和特殊域。特殊域是一个用作地址到名字转换的特殊域。地理域划分是把全世界的机器按国家和地区来划分,组织域按组织结构划分,目前有com(商业组织)、edu(教育机构)、gov(政府部门)、int(国际组织)、mil(军事机构)、net(网络)、org(其他组织)。许多国家的二级域组织成类似于普通域的结构。 DNS的一个没在图3中表示处理的重要特征是DNS域名的授权。没有哪个机构来管理域名树中的每个标识,相反,只有一个机构,即网络信息中心(Network Information Center,NIC)负责分配顶级域和委派其他指定地区域的授权机构。 一个DNS服务器负责一个或多个区域(DNS服务器内的每个域名空间称为一个区域。)。一个区域必须提供一个主DNS服务器和至少一个辅助DNS服务器。主、辅DNS服务器必须是独立的和冗余的,以便当某个服务器发生故障时不会影响该区域的DNS服务器。所有的主DNS服务器必须知道根服务器的IP地址。 2) 域名系统相当通用化,因为它允许在一个系统中内置多个命名类型。为了让客户能够在多种类型的项中加以区分,每个命名项在系统中存储时都有分配一个类型(type),该类型指明了它是一台机器的地址,还是一个邮箱或者一个用户等。当客户请求域名系统解析一个名字时,必须指明所需回答的对象类型,并由服务器返回此类型的对象。 DNS查询类型目前已经定义了50多种,常用的类型(type)有: Ø A 主机IPv4地址 Ø AAAA 和A一样的记录,对应的是IPv6地址 Ø CNAME 规范名(canonical name),通常称为别名记录,是对A的记录使用域名的另外一个(或多个)名称。这种记录允许将多个名字映射到同一台计算机。例如,有一台计算机名为“host.mydomain.com”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个规范名(CNAME):WWW和MAIL。 这两个规范名的全称就是“ www.mydomain.com”和 “mail.mydomain.com”。实际上他们都指向“host.mydomain.com”同一个IP。 同样的方法可以用于当您拥有多个域名需要指向同一服务器IP,此时您就可以将一个域名做A记录指向服务器IP,然后将其他的域名做规范名到之前做A记录的域名上,那么当服务器IP地址变更时,就可以不必一个一个域名更改指向了,只需要更改作A记录的那个域名,其他作别名的那些域名的指向也将自动更改到新的IP地址上了。比如 www.baidu.com的cname是 www.a.shifen.com。 Ø PTR 指针记录(pointer record)用于指针查询,也叫反向查询。它是属于RFC标准中定义的特殊域in-addr.arpa域,是为了实行反向查询,即从IP地址查找对应的域名。在in-addr.arpa域名空间中,IP地址被看作是一个in-addr.arpa域下的一个域名。 Ø MX 邮件交换(mail exchanger)记录指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当Internet上的某用户要发一封信给 user@mydomain.com 时,该用户的邮件系统通过DNS查找mydomain.com这个域名的MX记录,如果MX记录存在, 用户计算机就将邮件发送到MX记录所指定的邮件服务器上。 Ø HINFO 主机的CPU和操作系统信息。并非所有的站点都提供它们系统的HINFO记录。 Ø SOA 授权开始 Ø TXT 文字说明,用来说明主机名或者主机网络环境设置 实际中,大部分数据是A类型的,第二个最有用的域类型是MX。 3) 除了指明所求结果的类型外,DNS还允许客户指明使用的协议族。域名系统按类别(class)划分整个名字集合,允许一个数据库存储用于多个协议族的映射。实际上,使用多协议族的域服务器很少见。目前使用的大部分都是Internet协议。 常用的类别(class)有: Ø IN Internet互联网查询 4) DNS进行域名到IP地址的映射查询时,有两种查询模式:递归查询和迭代查询。实际上一般查询名称的过程中,实际上这两种查询模式都是交互存在着的。 递归查询:用户和一个DNS服务器的查询。这种方式是将要查询的报文发送至本机的DNS域名服务器,若本机的DNS域名服务器不能直接应答该请求,那么DNS域名服务器会再向上级或者平级的DNS服务器查询,最终将返回的查询结果发送给客户端。在域名服务器递归查询期间,客户端将完全处于等待状态,而不会向其他的DNS服务器发送查询请求,也不会接收非本机DNS服务器的应答。这种方式客户端只需处理本机DNS服务器响应回来的报文是否是正确响应或是说是找不到该名称的错误讯息,或者是返回一个错误说明请求的地址不存在。 迭代查询:用户和多个DNS 服务器间的查询。这种方式是将要查询的报文发送至本机的DNS域名服务器,若DNS服务器不能直接查询到客户端所要查询的域名地址,则向客户端返回一个最近而且最佳的DNS服务器地址或者名称,然后DNS客户端再到此最接近的DNS服务器上去寻找所要解析的名称,按照提示依次查询直到找到正确的解析。一般的,每次都会更靠近根域名服务器(向上)的服务器查询,查询到根域名服务器后,则会再次根据提示向下查找。 5) 资源记录 (Resource record,RR),是DNS应答报文中采用的一种格式,详细说明请见5.4。 5 DNS报文格式5.1 DNS报文基本格式DNS的定义了一个用于查询和响应的报文格式。DNS数据包是承载在UDP(或TCP)上的负载报文。图4显示DNS数据报文总体格式。 图4 DNS查询和响应报文的一般格式 这个报文由12字节长的首部和4个可变长度的字段组成。 ● ID(标识) 标识字段由客户端程序设置并由服务器返回结果。客户程序通过它来确定响应与查询报文是否匹配。 ● Q 0表示查询报文,1表示响应报文。 ● Opcode 0表示标准查询(正向查询),通常是0;1表示反向查询;2表示服务器状态请求;3~15备用。 ● AA(Authoritative Answer) 表示授权回答,1表示该名字服务器是授权于该域的;0表示该DNS服务器是未授权的。 ● TC(truncated) 表示可截断的。1表示数据被切断,0表示数据未被切断。当TC置为1时,传输的数据总长度超过512字节时,只返回前512字节。 ● RD(recursion desired) 表示希望递归查询。RD bit可以在一个查询中设置,并在响应中返回。置1表示DNS服务器进行递归查询;置0表示DNS服务器进行迭代查询。 ● RA(recursion available) 表示递归可用性。如果DNS服务器支撑递归查询,则在响应中将该比特置1,否则置0。大多数DNS服务器都提供递归查询,除了某些根服务器。 ● Z(zero) 3个bit置0。 ● Rcode(Result code) 表示响应返回码字段,由DNS服务器设置以识别查询状态。取值有 0(没有差错),1(格式错误),2(服务器没有响应), 3(名字差错),4(服务器不支撑),5(服务器拒绝),6(名字不不应当出现时出现),7(RR设置存在),8(RR设置应当存在而不存在),9(服务器不具备该管理区的权限),10(名字步骤管理区中),11~15未开发。通常取值是0(没有差错)和3(名字差错)。名字差错只有从一个授权域名服务器上返回,它表示在查询中指定的域名不存在。 随后的4个16bit字段说明最后4个可变长字段中包含的条目数。对于查询报文,问题数(question)通常为1,其他三项则为0。类似地,对于应答报文,回答数(answer)至少是1,剩下的两项可以是0或非0。 ● Queries 定义请求问题部分的信息。 ● Answers 回答字段,定义应答部分的资源记录。 ● Authority RRs 授权字段,定义授权DNS服务器的资源记录。 ● Additional RRs 附加信息字段,定义附加信息的资源记录。 5.2 查询报文的格式查询报文的格式如图5所示。查询报文的DNS数据段承载的是Queries数据,Queries数据段中包含要查询的域名(NAME),类型(TYPE),类别(CLASS)详细信息。TYPE类型的代码和Class类别的代码请参考4节中的说明。最常用的查询类型是A,表示希望获得查询名的IP地址。PTR查询请求获得一个IP地址对应的域名。每个问题有一个查询类型 通常DNS Queries只有一个。 图5 DNS查询报文结构 当DNS客户端需要查询程序中使用的域名时,它会查询DNS服务器来解析该域名。客户端发送的每条查询消息都包括三个信息,指定服务器回答的问题。这三条信息要符合上面的报文结构,具体含义如下: ● NAME:指定的DNS域名,规定为完全合格的域名; ● TYPE:指定的查询类型,可根据类型指定资源记录或者指定查询操作的专用类型; ● CLASS:DNS域名的指定类别,目前最多的就是IN,对基于Internet网络的DNS服务器,它始终应指定为Internet(IN)类别。 5.3 响应报文的格式DNS应答数据包是DNS服务器对DNS客户端查询的响应。DNS应答报文格式如图6所示。在DNS应答数据包里会根据DNS服务器在数据库中的查询结果出现Queries、Answers、Authority RRs、Additional RRs字段。Queries字段是和DNS查询数据包中的字段一样,Answers(应答)、Authority RRs(授权RRs)、Additional RRs(附加RRs)字段有着相同的格式,均采用一种称为资源记录RR(Resource Record)的格式,如图9所示。它们的字段中包含名称(name)、类型(type)、类别(class)、生存时间(Time to live)、长度(data length)、返回应答数据(Rdata)。三者的不同点在于应答不同。Answers字段返回的应答数据有两种:别名(primary name)或者IP地址(Addr)。而Authority RRs的返回应答数据是域名服务器(name server)。在实际的网络环境中,三个字段可能在一个返回应答数据包同时存在,也可能单独出现。这是根据DNS服务器的搜索结果决定的,在DNS数据包中会有明确的字段表示包含查询个数、应答个数、授权服务器个数和附加资源个数。 图6 DNS响应报文结构 在DNS服务器对DNS客户端查询返回的一个响应中,最常见的应答有几种性质的应答: ● 权威性应答(Authority RRs) 返回至客户端的肯定应答,随DNS返回应答中设置的“授权回答AA”位一同发送,DNS应答指出此应答是从直接授权机构的服务器获取; ● 肯定应答(Answers) 肯定应答由查询的RR或RR列表(也称作 RRset)组成,它与查询的DNS域名和查询消息中指定的记录类型相符;在网络中的报文如下图: 图7 DNS的肯定应答 ● 参考性应答(Additional RRs) 包括查询中名称或类型未指定的其他资源记录。如果不支撑递归过程,则这类应答将返回至客户端。这些记录的作用是为了提供一些有用的参考性应答,客户端可使用参考性应答继续进行递归查询。具体报文如下图所示: 图8 DNS的参考性应答 ● 否定应答 来自DNS服务器的否定应答,当DNS服务器试图处理解析查询的时候可能遇到两种结果: 1)在DNS域名空间中没有查询的名称。 2)查询的名称存在,但该名称不存在DNS客户端指定类型的记录。 此时DNS服务器传回否定应答请求。 5.4 资源记录RR结构DNS响应报文中的资源记录部分,即DNS报文中最后的三个字段,回答字段(Answers)、授权字段(Authority RRs)和附加信息字段(Additional RRs),均采用一种称为资源记录RR(Resource Record)的相同格式。图9显示了资源记录RR的格式。 图9 DNSRR的格式 域名(NAME)是资源记录数据对应的名字,它的格式和前面先容的查询数据包格式中的域名格式相同。类型(TYPE)是说明RR的类型码,它的值和前面先容的查询数据包中的类型值是一样的。类别(CLASS)通常为IN,指Internet数据。生存时间(TTL)字段是客户端程序保留该资源记录的秒数,资源记录通常的生存时间由服务器指定。资源数据长度(DATA LENGTH)说明资源数据的长度数量。而该资源数据的格式依赖于类型字段的值。对于标准查询(A查询)资源数据是4字节的IP地址。 6 DNS协议基本交互流程6.1 DNS交互流程先容在大家设定主机的网络环境的時候,都要告诉每台主机DNS服务器的地址(可以手动的在每一台客户端主机上配置,也可以使用DHCP指定)。通过该DNS服务器地址,主机就可以向该DNS服务器请求解析域名或主机名称并返回其对应IP地址或者其他客户端主机要求类型的应答。 一个最基本的交互请求如下图所示。 图10 DNS基本查询流程图 如上图,DNS客户端A要与pop.tom.com进行交互,它首先向它的DNS服务器B发送DNS请求报文,DNS服务器返回查询的结果,通知DNS客户端A所要查询的域名的IP地址是:202.108.255.203,然后DNS客户端A就通过IP地址与目标网址C进行交互。 这样就是一个简单的DNS流程。 6.1.1 DNS递归查询流程DNS的递归查询具体运作流程如下: (1)客户端和服务器端必须有网络链接,可以互通; (2)客户端向服务器提出查询请求; (3)当被询问到该DNS服务器管辖之内的主机名称的时候,服务器会直接做出回答; (4)如果所查询的主机名称不属于该DNS服务器管辖的域名的话,会先检查DNS服务器的高速缓存 (Cache),看看有没有相关资料; (5)如果没有发现,则会转向上一级或root服务器查询; (6)上一级或root服务器会返回查询域名的下一层授权(authoritative)服务器的地址; (7)本地DNS服务器然后会向其中的一台服务器查询,并将这些服务器名单存到高速缓存中,以备将来之需(省却再向root查询的步骤); (8)远方服务器回应查询; (9)若该回应并非最后一层的答案,则继续往下一层查询,直到获的客户端所查询的结果为止; (10)将查询结果回应给客户端,并同时将结果储存一个备份在自己的高速缓存里面; (11)如果在存放时间尚未过时之前再接到相同的查询,则以存放于高速缓存(cache)里面的资料来做回应。 通过以上的步骤,DNS服务器提供给用户正确的DNS解析。 下面用实例说明DNS客户端和服务器端迭代查询的交互过程。如下图11,DNS客户端要查询 www.home.xin.com.cn这个域名的IP地址,客户端向DNS服务器发送一个请求报文,然后DNS服务器开始进行迭代查询,请参考下图: 图11 DNS递归查询详细流程实例 6.1.2 DNS迭代查询流程迭代查询一个最简单的理解就是若DNS服务器不能直接查询到主机地址,则向客户端返回一个最近而且最佳的DNS服务器地址或者名称,然后DNS客户端再到此最接近的DNS服务器上去寻找所要解析的名称,按照提示依次查询直到找到正确的解析。 具体的流程类似下图12所示,在下图中,客户端要查询一个域名的信息,DNS服务器中没有这个域名,返回DNS服务器B的地址,让其到DNS服务器B上去查询,依次类似,直到客户端得到正确的应答(或否定的应答)为止。 图12 DNS迭代查询示意图 在实际网络环境中,大家可以看到迭代查询的数据包,如下图13所示,客户端主机的IP地址是:192.168.1.11,主机DNS服务器的IP地址是192.58.128.30,如蓝色框所示,当客户端主机查询 www.borlander.com 这个域名的时候,服务器返回了另一个DNS服务器的地址:202.112.0.22,让客户端主机到这个DNS服务器去查询。这样类似的过程还可以继续,这样的查询方式就可以称为迭代查询。 图13 迭代查询数据包 6.2 DNS流程实例在实际网络环境中,大家截取一个客户端和DNS服务器标准查询交互过程: 图14 DNS交互数据流 在上图中,客户端主机的IP地址是59.64.180.144,红色标识。 DNS服务器的IP地址是:211.68.71.4,蓝色标识。 服务器收到请求后,在DNS的数据库中查询,然后向客户端返回一个DNS返回应答数据包,内含百度的cname( www.a.shifen.com)和百度的IP地址211.94.144.100。如上图中的序号为8的数据包。 下面先容一下DNS交互流程过程中的DNS数据报文的格式。 6.2.1 DNS查询数据包DNS查询数据包主要用于DNS客户端向DNS服务器发送查询请求。在数据包中,详细的说明了所要查询的域名,查询的类型和查询的类别。具体的DNS查询报文结构请参考5.2节所述。 在实际的网络环境中抓包,捕获到的DNS查询报文如下图15所示。DNS客户端IP是192.168.1.101,DNS服务器的IP地址是202.106.195.68。 在DNS查询的报文中,可以明显的的看出DNS查询报文Queries的结构:查询名称(name),查询类型(type),查询类别(class)。 图15 实际网络环境下的DNS查询报文 6.2.2 DNS查询成功应答数据包DNS应答数据包是DNS服务器对DNS客户端查询的响应。在DNS数据段里会根据DNS的查询结果出现Queries、Answers、Authority RRs、Additional RRs字段。 在实际的网络环境中,三个字段可能在一个返回应答数据包同时存在,也可能单独出现。这是根据DNS服务器的搜索结果决定的,在DNS数据包中会有明确的字段表示包含查询个数、应答个数、授权服务器个数和附加资源个数。 下图16所示是实际网络中的抓的DNS返回应答数据包。客户端主机的IP地址是59.64.180.144,DNS服务器的地址是:211.68.71.4。从这个数据包中,可以明显的看到返回应答的数据包的结构,有Answers, Authority RRs, Additional RRs字段。 图16 实际网络环境中的DNS返回应答报文 对于成功应答报文,Answer字段必须出现,而Authority,Additional这两个字段可能只出现一个,也可能出现两个,也可能一个也不出现。 图17 实际网络环境中的DNS返回应答报文 6.2.3 DNS查询失败应答数据包DNS应答数据包是DNS服务器对DNS客户端的响应。在实际的网络环境中抓包,如下图18所示,客户端的IP地址是192.168.1.109,本机的DNS服务器IP是:202.106.16.151。首先客户端向DNS服务器发送一个查询请求,请求 www.googlebaiduyahoosinasohutom.com域名的DNS解析,这时候服务器返回no such name的应答数据报文,如下图中的标号为2的数据包。 图18 实际网络中的DNS返回应答失败报文 DNS返回失败应答报文中,没有Answer字段,对于Authority,Additional这两个字段,根据DNS服务器查询的结果,而出现不同的情况。如下图19所示:
|