DNS服务器详解
DNS组件
完整的DNS系统由DNS服务器、区域、解析器(DNS客户端)和资源记录组成,并且你需要正确的进行配置。DNS协议采用 UDP/TCP 53端口进行通讯:DNS服务器侦听UDP/TCP 53端口,DNS客户端通过向服务器的这两个端口发起连接进行DNS协议通讯。其中 UDP 53端口主要用于答复DNS客户端的解析请求,而TCP 53端口用于区域复制。
DNS服务器
运行 DNS服务器软件的计算机。常见的DNS服务器软件有Windows的DNS服务器和Unix下的BIND。一个DNS服务器包含了部分DNS命名空间的 数据信息,当DNS客户发起解析请求时,DNS服务器答复客户的请求,或者提供另外一个可以帮助客户进行请求解析的服务器地址,或者回复客户无对应记录。
当DNS服务器管理某个区域时,它是此区域的权威DNS服务器,而无论它是主要区域还是辅助区域。DNS服务器可以是一级或者多级 DNS命名空间的权威DNS服务器,例如,Internet根域的DNS服务器只是对于顶级域名例如“.org”具有权威,而顶级域名.org的权威 DNS服务器只是对于winsvr.org二级域名具有权威,而对于三级域名www.winsvr.org,则只有winsvr.org域的DNS服务器 才具有权威。
DNS区域
DNS区域是DNS服务器具有权威的连续的命名空间,一个DNS服务器可以对一个或多 个区域具有权威,而一个区域可以包含一个或多个连续的域。例如,一个DNS服务器可以对区域winsvr.org和isacn.org具有权威,而每个区 域下又可以包含多个域。不过,你可以通过区域委派来将连续的域例如winsvr.org、tech.winsvr.org存放在不同的区域中。
区域文件包含了DNS服务器具有权威的区域的所有资源记录。通常情况下,区域数据存在在文本文件中,但是运行在Windows 2000或者Windows Server 2003域控制器上的DNS服务器,可以把区域信息存放在活动目录中。
DNS解析器(DNS客户端)
DNS 解析器是使用客户端计算机用于通过DNS协议查询DNS服务器的一个服务。在Windows 2000及其后的系统中,DNS解析器是通过DNS客户端这 个服务来实现,除此之外,DNS客户端服务还可以对DNS解析结果进行缓存。你必须在客户端计算机的TCP/IP属性中配置使用DNS服务器,此时客户端 计算机的DNS解析器才会将DNS解析请求发送到相应的DNS服务器。
资源记录
资源记录是用于答复DNS客户端请求的DNS数据库记录,每一个DNS服务器包含了它所管理的DNS命名空间的所有资源记录。资源记录包含和特定主机有关的信息,如IP地址、提供服务的类型等等。常见的资源记录类型有:
资源记录类型
说明
解释
起始授权结构(SOA)
起始授权机构
此记录指定区域的起点。它所包含的信息有区域名、区域管理员电子邮件地址,以及指示辅 DNS 服务器如何更新区域数据文件的设置等。
主机(A)
地址
主机(A)记录是名称解析的重要记录,它用于将特定的主机名映射到对应主机的IP地址 上。你可以在DNS服务器中手动创建或通过DNS客户端动态更新来创建。
别名(CNAME)
标准名称
此记录用于将某个别名指向到某个主机(A)记录上,从而无需为某个需要新名字解析的主机额外创建A记录。
邮件交换器(MX)
邮件交换器
此记录列出了负责接收发到域中的电子邮件的主机 ,通常用于邮件的收发。
名称服务器(NS)
名称服务器
此记录指定负责此DNS区域的权威名称服务器。
理解DNS服务器的工作方式
当DNS客户端需要为某个应用程序查询名字时,它将联系自己的DNS服务器来解析此名字。DNS客户发送的解析请求包含以下三种信息:
需要查询的域名。如果原应用程序提交的不是一个完整的FQDN,则DNS客户端加上域名后缀以构成一个完整的FQDN;
指定的查询类型。指定查询的资源记录的类型,如A记录或者MX记录等等;
指定的DNS域名类型。对于DNS客户端服务,这个类型总是指定为 Internet [IN]类别。
DNS客户端完整的DNS解析过程如下:
1、检查自己的本地DNS名字缓存
当DNS客户端需要解析某个FQDN时,先检查自己的本地DNS名字缓存。本地的DNS名字缓存由两部分构成:
Hosts文件中的主机名到IP地址映射定义;
前一次DNS查询得到的结果,并且此结果还处于有效期;
如果DNS客户端从本地缓存中获得相应结果,则DNS解析完成。
2、联系自己的DNS服务器
如果DNS客户端没有在自己的本地缓存中找到对应的记录,则联系自己的DNS服务器,你必须预先配置DNS客户端所使用的DNS服务器。
当DNS 服务器接收到DNS客户端的解析请求后,它先检查自己是否能够权威的答复此解析请求,即它是否管理此请求记录所对应的DNS区域;如果DNS服务器管理对 应的DNS区域,则DNS服务器对此DNS区域具有权威。此时,如果本地区域中的相应资源记录匹配客户的解析请求,则DNS服务器权威的使用此资源记录答 复客户的解析请求(权威答复);如果没有相应的资源记录,则DNS服务器权威的答复客户无对应的资源记录(否定答复)。
如果没有区域匹配DNS客户端发起的解析请求,则DNS服务器检查自己的本地缓存。如果具有对应的匹配结果,无论是正向答复还是否定答复,DNS服务器非权威的答复客户的解析请求。此时,DNS解析完成。
如果DNS服务器在自己的本地缓存中还是没有找到匹配的结果,此时,根据配置的不同,DNS服务器执行请求查询的方式也不同:
默认情况下,DNS服务器使用递归方式来解析名字。递归方式的含义就是DNS服务器作为DNS客户端向其他DNS服务器查询此解析请求,直到获得解析结果,在此过程中,原DNS客户端则等待DNS服务器的回复。
如 果你禁止DNS服务器使用递归方式,则DNS服务器工作在迭代方式,即向原DNS客户端返回一个参考答复,其中包含有利于客户端解析请求的信息(例如根提 示信息等),而不再进行其他操作;原DNS客户端根据DNS服务器返回的参考信息再决定处理方式。但是在实际网络环境中,禁用DNS服务器的递归查询往往 会让DNS服务器对无法进行本地解析的客户端请求返回一个服务器失败的参考答复,此时,客户端则会认为解析失败。
递归方式和迭代方 式的不同之处就是当DNS服务器没有在本地完成客户端的请求解析时,由谁扮演DNS客户端的角色向其他DNS服务器发起解析请求。通常情况下应使用递归方 式,这样有利于网络管理和安全性控制,只是递归方式比迭代方式更消耗DNS服务器的性能,不过在通常的情况下,这点性能的消耗无关紧要。
根 提示信息是Internet命名空间中的根DNS服务器的IP地址。为了正常的执行递归解析,DNS服务器必须知道从哪儿开始搜索DNS域名,而根提示信 息则用于实现这一需求。全世界范围内的根DNS服务器总共有13个,它们的名字和IP地址信息保存在%systemroot% system32dnscache.dns文件中,每次DNS服务器启动时从cache.dns文件中读取。一般情况下,不需要对此文件进行修改;如果你 的DNS服务器是在内部网络中部署并且不需要使用Internet的根DNS服务器,则可以根据需要进行修改,将其指向到某个内部根域DNS服务器。
例如,当某个DNS客户端请求解析域名www.winsvr.org并且DNS服务器工作在递归模式下时,完整的解析过程如下:
DNS客户端检查自己的本地名字缓存,没有找到对应的记录;
DNS客户端联系自己的DNS服务器NameServer1,查询域名 www.winsvr.org;
NameServer1检查自己的权威区域和本地缓存,没有找到对应值。于是,联系根提示中的某个根域服务器,查询域名www.winsvr.org;
根域服务器也不知道www.winsvr.org的对应值,于是,向NameServer1返回一个参考答复,告诉NameServer1 .org顶级域的权威DNS服务器;
NameServer1联系.org顶级域的权威DNS服务器,查询域名www.winsvr.org;
.org顶级域服务器也不知道www.winsvr.org的对应值,于是,向NameServer1返回一个参考答复,告诉NameServer1 Winsvr.org域的权威DNS服务器;
NameServer1联系Winsvr.org域的权威DNS服务器,查询域名www.winsvr.org;
Winsvr.org域的权威DNS服务器知道对应值,并且返回给NameServer1;
NameServer1向原DNS客户端返回www.winsvr.org的结果,此时,解析完成
查询响应类型
DNS服务器对于客户请求的答复具有多种类型,常见的有以下四种:
权威答复:权威答复是返回给客户的正向答复,并且设置了DNS消息中的权威位。此答复代表从具有权威的DNS服务器处发出;
正向答复:正向答复包含了匹配客户端解析请求的资源记录;
参考答复:参考答复只在DNS服务器工作在迭代模式下使用,包含了其他有助于客户端解析请求的信息。例如,当DNS服务器不能为客户端发起的解析请求找到某个匹配值时,则向DNS客户端发送参考回复,告诉它有助于解析请求的信息;
否定答复:否定答复指出权威服务器在解析客户端的请求时可能遇到了以下两种情况之一:
权威DNS服务器报告客户端查询的名字不存在;
权威DNS服务器报告存在对应的名字但是不存在指定类型的资源记录。
无论正向答复还是否定答复,DNS客户端都将结果保存在自己的本地缓存中。
理解缓存的工作方式
DNS客户端和DNS服务器都会缓存获得的解析结果,这样可以提高DNS服务性能和减少DNS相关的网络流量。
DNS客户端缓存
当DNS 客户端服务启动时,会读取Hosts文件中的所有主机名和IP地址的映射,并且保存在缓存中。Hosts存放在%systemroot% system32driversetc目录,当你修改Hosts文件后,DNS客户端会立即读取Hosts文件并且对本地缓存进行更新。
另外,DNS客户端会缓存过去的查询结果,当DNS客户端服务停止时,将清空本地缓存。
DNS服务器缓存
DNS服务器像DNS客户端一样缓存名字解析结果,并且可以使用缓存中的信息来答复其他客户端的请求。你可以在DNS服务器管理控制台或者使用DNSCMD命令行工具手动清空缓存,另外当DNS服务器停止时,同样会清空DNS服务器缓存。
资 源记录的生存时间(TTL)指定了资源记录可以缓存的时间的长短,而无论是DNS客户端缓存还是DNS服务器缓存;默认情况下,TTL是3600秒(1小 时)。需要注意的是,由于缓存的作用,DNS服务器上对于资源记录的修改可能不能立即生效。并且对于Internet域名来说,资源记录的修改可能会需要 超过24小时的时间才能在所有DNS服务器上完成更新。
动态更新
当DNS客户端计算机上产生某个 事件触发更新时,DNS客户端计算机上的DHCP客户端服务将会为本地计算机中使用的所有网络连接在相应的DNS服务器中对自己的A记录进行更新,从而可 以确保DNS域名记录和IP地址记录的对应关系。而DNS服务器需要配置为允许动态更新,才能让DNS客户端计算机成功完成更新。
当DNS客户端计算机上产生以下事件时,会触发DHCP客户端服务的动态更新行为:
添加、删除或修改了本地计算机任何网络连接TCP/IP属性中的IP地址;
本地计算机的任何网络连接向DHCP服务器获取IP地址租约或者续约;
DNS客户端上运行了Ipconfig /registerdns命令;
DNS客户端计算机启动;
此DNS区域中的一台成员服务器提升为域控制器;
对 于标准主要区域,你可以选择不允许动态更新和允许非安全和安全动态更新。但是允许非安全和安全动态更新具有安全隐患,因为DNS服务器不会对进行动态更新 的客户端计算机进行验证,所以任何客户端计算机都可以对任何A记录进行动态更新,而不管它是否是此A记录的拥有者。通常情况下,你不应该使用此选项。
对于活动目录集成区域,除了上述的两个选项外,你还可以使用安全动态更新。当使用此方式时,在客户端计算机更新自己的记录时,DNS服务器将要求客户端计算机进行身份验证来确保只有对应资源记录的拥有者才能更新此记录。
只 有Windows 2000及以后版本操作系统的客户端计算机才能执行动态更新,低版本的Windows系统(NT4、9x/ME)不支持动态更新。不 过,你可以通过DHCP服务器为这些低版本客户端计算机代理进行动态更新。当DHCP服务器在代理低版本客户端计算机注册A记录时,会将自己设置为此A记 录的所有者。而在安全动态更新方式中,只有资源记录的所有这才能修改此记录,这样在其他DHCP服务器为此低版本客户端计算机代理注册时会出现拒绝访问的 问题。因此,你需要将此DHCP服务器加入到DnsUpdateProxy安全组中,这样当DHCP服务器更新A记录时,不会记录下此A记录的所有者信 息,从而允许其他DHCP服务器来修改此A记录。
区域委派
一个完整的DNS区域包含以自己的DNS域名为基础命名空间的 所有DNS命名空间的信息,当基于此DNS命名空间新建一个DNS区域时,新建的区域称为子区域。例如,完整的winsvr.org区域包含了以 winsvr.org为基础命名空间的所有DNS命名空间的信息,而tech.winsvr.org则称为winsvr.org的一个子区域。
默认情况下,DNS区域管理自己的子区域,并且子区域伴随DNS区域一起进行复制和更新。不过,你可以将子区域委派给其他DNS服务器来进行管理,此时,被委派的服务器将承担此DNS子区域的管理,而父DNS区域中只是具有此子区域的委派记录。
区域委派适用于许多环境,常见的场景有:
将某个子区域委派给某个对应部门中的DNS服务器进行管理;
DNS服务器的负载均衡,将一个大区域划分为若干小区域,委派给不同的DNS服务器进行管理;
将子区域委派给某个分部或远程站点。
你 只能在主要区域中执行区域委派。对于任何一个被委派的子区域,父DNS区域中只是具有指向子区域中权威DNS服务器的A记录和NS记录,而实际的解析过程 必须由委派到的子区域中的权威DNS服务器完成,即被委派到的DNS服务器上必须具有以被委派的子区域为域名的主要区域。
在Windows Server 2003的DNS服务器管理控制台中,提供了向导工具,可以让你轻松的完成DNS区域委派。
DNS区域类型
在部署一台DNS服务器时,你必须预先考虑DNS区域类型,从而决定DNS服务器类型。DNS区域分为两大类:正向查找区域和反向查找区域,其中
正向查找区域用于FQDN到IP地址的映射,当DNS客户端请求解析某个FQDN时,DNS服务器在正向查找区域中进行查找,并返回给DNS客户端对应的IP地址;
反向查找区域用于IP地址到FQDN的映射,当DNS客户端请求解析某个IP地址时,DNS服务器在反向查找区域中进行查找,并返回给DNS客户端对应的FQDN。
而每一类区域又分为三种区域类型:主要区域、辅助区域和存根区域,其中:
主 要区域(Primary):包含相应DNS命名空间所有的资源记录,是区域中所包含的所有DNS域的权威DNS服务器。可以对区域中所有资源记录进行读 写,即DNS服务器可以修改此区域中的数据,默认情况下区域数据以文本文件格式存放。你可以将主要区域的数据存放在活动目录中并且随着活动目录数据的复制 而复制,此时,此区域称为活动目录集成主要区域,在这种情况下,每一个运行在域控制器上的DNS服务器都可以对此主要区域进行读写,这样避免了标准主要区 域时出现的单点故障。
辅助区域(Secondary):主要区域的备份,从主要区域直接复制而来;同样包含相应DNS命名空间所有 的资源记录,是区域中所包含的所有DNS域的权威DNS服务器;和主要区域不同之处是DNS服务器不能对辅助区域进行任何修改,即辅助区域是只读的。辅助 区域数据只能以文本文件格式存放。
存根区域(Stub):存根区域是Windows Server 2003新增加的功能。此区域只是包含了用于分辨主要区域权威DNS服务器的记录,有三种记录类型:
SOA(委派区域的起始授权机构):此记录用于识别该区域的主要来源DNS服务器和其他区域属性;
NS(名称服务器):此记录包含了此区域的权威DNS服务器列表;
A glue(粘附A记录):此记录包含了此区域的权威DNS服务器的IP地址。
默认情况下区域数据以文本文件格式存放,不过你可以和主要区域一样将存根区域的数据存放在活动目录中并且随着活动目录数据的复制而复制。
当DNS 客户端发起解析请求时,对于属于所管理的主要区域和辅助区域的解析,DNS服务器向DNS客户端执行权威答复。而对于所管理的存根区域的解析,如果客户端 发起递归查询,则DNS 服务器会使用该存根区域中的资源记录来解析查询。DNS服务器向存根区域的NS资源记录中指定的权威DNS服务器发送迭代查询, 仿佛在使用其缓存中的NS资源记录一样;如果DNS服务器找不到其存根区域中的权威DNS服务器,那么DNS服务器会尝试使用根提示信息进行标准递归查 询。如果客户端发起迭代查询,DNS服务器会返回一个包含存根区域中指定服务器的参考信息,而不再进行其他操作。
如果存根区域的权 威DNS服务器对本地DNS服务器发起的解析请求进行答复,本地DNS服务器会将接收到的资源记录存储在自己的缓存中,而不是将这些资源记录存储在存根区 域中,唯一的例外是返回的粘附A记录,它会存储在存根区域中。存储在缓存中的资源记录按照每个资源记录中的生存时间 (TTL) 的值进行缓存;而存放在 存根区域中的SOA、NS 和粘附A资源记录按照SOA记录中指定的过期间隔过期(该过期间隔是在创建存根区域期间创建的,在从原始主要区域复制时更 新)。
当某个DNS服务器(父DNS服务器)向另外一个DNS服务器做子区域委派时,如果子区域中添加了新的权威DNS服务器,父 DNS服务器是不会知道的,除非你在父DNS服务器上手动添加。存根区域主要是用于解决这个问题,你可以在父DNS服务器上为委派的子区域做一个存根区 域,从而可以从委派的子区域自动获取权威DNS服务器的更新而不需要额外的手动操作。
DNS服务器类型
根据管理的DNS区域的不同,DNS服务器也具有不同的类型。一台DNS服务器可以同时管理多个区域,因此也可以同时属于多种DNS服务器类型。
主要DNS服务器
当DNS服务器管理主要区域时,它被称为主要DNS服务器。主要DNS服务器是主要区域的集中更新源,你可以部署两种模式的主要区域:
标 准主要区域:标准主要区域的区域数据存放在本地文件中,只有主要DNS服务器可以进行管理此DNS区域(单点更新)。这意味如果当主要DNS服务器出现故 障时,此主要区域不能再进行修改;但是,位于辅助服务器上的辅助服务器还可以答复DNS客户端的解析请求。标准主要区域只支持非安全的动态更新。
活 动目录集成主要区域:活动目录集成主要区域仅当在域控制器上 部署DNS服务器时有效,此时,区域数据存放在活动目录中并且随着活动目录数据的复制而复 制。在默认情况下,每一个运行在域控制器上的DNS服务器都将成为主要DNS服务器,并且可以修改DNS区域中的数据(多点更新),这样避免了标准主要区 域时出现的单点故障。活动目录集成主要区域支持安全的动态更新。
辅助DNS服务器
在DNS服务设计中,针对每一个区域,总是建议你至少使用两台DNS服务器来进行管理。其中一台作为主要DNS服务器,而另外一台作为辅助DNS服务器。
当DNS 服务器管理辅助区域时,它将成为辅助DNS服务器。使用辅助DNS服务器的好处在于实现负载均衡和避免单点故障。辅助DNS服务器用于获取区域数据的源 DNS服务器称为主服务器,主服务器可以由主要DNS服务器或者其他辅助DNS服务器来担任;当创建辅助区域时,将要求你指定主服务器。在辅助DNS服务 器和主服务器之间存在着区域复制,用于从主服务器更新区域数据。
注意:这个地方辅助DNS服务器是根据区域类型的不同而得出的概念,而在配置DNS客户端使用的DNS服务器时,管理辅助区域的DNS服务器可以配置为DNS客户端的主要DNS服务器,而管理主要区域的DNS服务器也可以配置为DNS客户端的辅助DNS服务器。
存根DNS服务器
管理存根区域的DNS服务器称为存根DNS服务器。一般情况下,不需要单独部署存根DNS服务器,而是和其他DNS服务器类型合用。在存根DNS服务器和主服务器之间同样存在着区域复制。
缓存DNS服务器
缓 存DNS服务器即没有管理任何区域的DNS服务器,也不会产生区域复制,它只能缓存DNS名字并且使用缓存的信息来答复DNS客户端的解析请求。当刚安装 好DNS服务器时,它就是一个缓存DNS服务器。缓存DNS服务器可以通过缓存减少DNS客户端访问外部DNS服务器的网络流量,并且可以降低DNS客户 端解析域名的时间,因此在网络的广泛的使用。例如一个常见的中小型企业网络接入到Internet的环境,并没有在内部网络中使用域名,所以没有架设 DNS服务器,客户通过配置使用ISP的DNS服务器来解析Internet域名。此时就可以部署一台缓存DNS服务器,配置将所有其他DNS域转发到 ISP的DNS服务器,然后配置客户使用此缓存DNS服务器,从而减少解析客户端请求所需要的时间和客户访问外部DNS服务的网络流量。