2.2域和域区
理解域和域区的差别需要费一点精力。DNS域名树的分支是为域名所用的,而叶子则用于主机。在域名树中,子域和主机是树中所有在它们上层的域的成员。
域区在逻辑上覆盖了DNS树型结构的一部分,以确定每个DNS服务器支持的名字(子域名和主机名)。DNS服务器的域区决定了它所覆盖的树的分支、树的区域,以及有多少它所授权的域。
图2-3中有一个服务器的授权域区包括mkt和sales两个域。一个DNS服务器也可以在一个域区中只有一个域。图2-3中的eng就是一个域区只有一个域的例子,尽管它还有两个子域。因为Windows2000中的域区用于控制相邻的分支,也就要求mkt和sales域位于不同的域区中,这与一般的域区规则稍有不同。
由于DNS服务器之间的交互操作和DNS服务器及DNS客户机之间的交互操作决定了必须有域区和委托授权,域区规定了名字是在哪里存放的(即哪个DNS服务器具有这些名字),而委托授权则决定客户机和服务器应从哪条路径与其他DNS服务器通信。
一个域区包含的记录可以是单个域的记录、一个域记录的一部分、一个或几个子域的记录或者是父域和子域记录的组合。对于一类特殊的用来进行从地址到名字解析的反向地址域区,更是常有多个域的记录。反向地址域区将在第4章中描述。
域区向DNS服务器提供了它所管理的名字,而委托授权则告诉DNS服务器当一个查询是在其域区以外时到哪里去查找。域区和委托授权都不决定哪个DNS服务器是域记录授权的最初来源,哪些服务器只是备份。需指定一个服务器为主服务器并给予它这种授权,并指定一个服务器为辅服务器以作为主服务器的备份。
2.2.1主DNS服务器
如前所述,主DNS服务器(即SOA)负责域中名字的授权,关于那个域的名字的所有信息都要从这个服务器获得。当一个主DNS服务器启动时,它从它所运行主机的本地数据文件(或者活动目录)中取得域区数据。一个DNS服务器可以同时是一个或几个域的主服务器,也可以同时既是一个域的主服务器,又是另一个域的辅服务器。第3章将更详细地解释DNS服务器的类型。但现在至少应认识到域和域区不存在主或辅的问题,只有DNS服务器才有主或辅的概念,主DNS服务器才是一个域的名字的授权来源。
如果要配置一个机构的域的层次结构,最好首先为整个域配置一个主域名服务器。DNS服务器管理的域区应包含所有的域名,也许还应为子域配置一个或几个服务器。如果要为机构的各个部门建立子域,则每个子域应有一个主DNS服务器。如果服务器不包含这个域的所有记录,则必须指定一个子域授权(例如,example.net被分为sales.example.net,ops.example.net,eng.example.net等等)。
通过子域的选择提高了用户的灵活性。同时,因为每个子域都有一个授权的启动,所以潜在地增加了负载。因此,每次做出改变时,必须进入指定的主服务器。MS关于“域区”项的使用有时是令人费解的。在实现时应注意使用方式。
2.2.2辅DNS服务器
辅DNS服务器从主服务器获得数据。当一个辅DNS服务器启动时,它首先从主服务器处获得域区数据,并将自己的版本号和主服务器的版本号进行比较。如果觉得必要,辅服务器就进行域区数据的替换,用主服务器的数据覆盖原来的数据。辅服务器能和主服务器通信是因为辅服务器的名字连同SOA和NS资源记录一起保存在它的文件里。辅服务器仅用一个NS记录来表示,并且它不承担SOA的责任,只有主服务器才有权承担。当然,如果辅服务器仍然没有域区数据,它需要在它的启动文件建立时使用指示来定位主服务器以获得域区数据。
和主DNS服务器相似,辅服务器也是授权查找域名的地方。其差别在于主服务器是其他需要输入域区文件的服务器的初始域名来源,而辅服务器则不是传递域区数据的来源。辅服务器的存在只是为了备份并提供查询服务。
2.2.3从主DNS服务器向辅DNS服务器传送数据
对域、域区、委托授权有所了解后,可以转向讨论DNS的分布式数据库模型。域区文件本质上是DNS名字的数据库列表,主服务器拥有它自己的各个域的源域区文件。
子域域名服务器可以有主服务器的功能,可有效地将一个大的域名列表划分为几个较小的部分,成为几个域区文件。如果一个大型机构在建立其域名服务器时只使用一个域,而没有划分为几个子域,则域区文件将非常大。这样一个很大的无层次名字空间还会有另一个问题:一个不再划分的DNS分支不能支持两个同样的主机名。如果不对域进行划分,一个大机关就会遇到像ARPAnet决定建立DNS体系结构时所曾遇到的问题。然而,同样大的机构可以把它的域名空间分成几个子域,但仍然只用一个域区文件,如图2-3所示。这只能解决两个问题中的一个。
对域进行划分可以因域区文件变小并容易管理而改善性能。一个域名服务器不应该解析庞大的域区文件。虽然还受其他因素影响,但一般来说域区文件越小,从域名服务器得到的响应就越快。但子域也会带来一定的问题,即数据问题。委托授权解决了父域和子域的协调,但一个辅服务器又如何从数据源―它的主服务器―来获得数据?回答是通过传送主服务器的域区文件。这也被称作域区传送(zonetransfer)。域区传送可以是部分的也可以是完全的,主要取决于需求和最近一次全传送耗费的时间。把大的域区文件分成几个小文件也可提高域区传送的效率。这也是为什么要避免大而平面化的域名空间的重要原因之一。
当一个主服务器启动时,它只需要对名字查询请求做出响应。当一个辅服务器启动时,它就要查看主服务器的授权数据,并得到一个路径和文件名,以便当收到副本时保存为本地的备份。这由服务器的启动信息提供,在第4章中将会提到。如果辅服务器是第一次启动或者有人清除了它的数据目录,则辅服务器就向主服务器发出请求以得到域区文件的副本。
域区传送操作很像Windows(NT或2000)的文件复制,或者是Windows在域名服务器之间的WINS数据复制。当辅服务器得到了主服务器域区文件的副本后,它也能对名字查询提供授权的应答。如果主服务器的域区文件有所改变或更新,辅服务器将如何处理?在授权开始资源记录(SOARR)中包含的若干信息字段可指示辅服务器相隔多久检查主服务器的变化,这些字段设置了超期时限和刷新频率。SOA资源记录也有一个版本号或序列号。关于SOA资源记录的更多信息,请见第4章。
辅服务器将定期地向主服务器查询它所需刷新的域区文件,具体的就是检查序列号是否有变化,序列号是一种递增的指示数据库版本的数字。如果序列号有所变化,辅服务器就知道域区数据有了变化,就会启动新的副本传递(可能是部分的,也可能是完全的传送)。部分传送是在RFC1995中定义的一种逐渐递增的传送,即仅是被改变的部分而不是整个域区文件被传送。
只有当序列号增大后辅服务器才会进行域区文件传送。如果序列号因为某种原因而减少,则辅服务器将认为它的域区文件副本是最新的,并将继续使用直到期满。如果因某种原因序列号变为0,则辅服务器的本地域区文件将被删除,辅服务器就将启动一次传输,从主服务器传送完整的新的域区数据文件。但是无论在哪种情况下,都是从它的主服务器获得它的数据。
Windows2000DNS服务器和BIND8.0还有一种“通告”选项,以启动辅服务器的更新。这就是说,主服务器可以通知辅服务器数据已变化,以便加速传送新信息。“通告”选项还可以提高安全性,因为是由主服务器启动域区文件的传送。主服务器的管理员提供了应通知的辅服务器列表,而列表中的辅服务器只限于那些已经授权的服务器。将启动数据传送从辅服务器转为主服务器,有助于防止域区文件被非法窃走。这是一系列使用“通告”选项来提高传送效率的令人信服的原因。然而,一些BIND8.1.1服务器在从Windows2000DNS接收到这样的传送时会丢弃自己的所有数据。所以,当计划用这种方式使用BIND辅服务器时,应采用BIND8.1.2。
希望DNS查询在全局范围内都能得到迅速处理的机构应该在不同的地理位置上配置DNS服务器,也许可以把部分域区数据放在其他合作机构的服务器上。这样可以提供较好的本地查询性能,而配置的冗余有助于在Internet连接不正常时继续工作。
在有故障时,即使目的主机不能接通,辅DNS服务器仍然可以进行名字解析。对于如发送邮件这样的服务,这是很有用的,因为如果在发送邮件时可以解析主机名,但不能启动一次邮件发送过程,则只需将邮件在发送队列中继续排队,稍后再发送。而发送邮件时如果连主机名都不能解析,则只能退回邮件并给出“主机未知”错误。
Windows2000把域区数据集成到活动目录中作为第三类域区,从而逐渐模糊了标准主辅服务器之间的区别。集成后,仍然可以有标准辅服务器,但也可能有多个同等的使用活动目录进行复制的辅服务器。这在第7章中将会提到,那里将讨论一些有关活动目录技术的DNS问题。
本章关于域名空间和域名服务器的讨论就到这里。其余部分将集中于客户机。客户机的查询和DNS服务器是如何协作工作的。