第六章 名字服务和解析器配置
正如第二章所述,TCP/IP网络可以依赖于不同的方案来将名字转换成地址。如果不利用名字
空间被分裂成区的好处的话,最简单的方法是用存储于/etc/hosts中的主机表。这仅对由一
个管理员管理的小型局域网有用,而且这个局域网要与外界没有IP通信。hosts文件的格式早
已在第5章中描述过。
作为选择,你可以使用BIND―伯克里互连网名字域服务(Berkeley Internet Name Domain
Service)--来解析主机名到IP地址。配置BIND可能很是繁杂,但是一旦你完成它,那么网络
拓扑的变化很容易做到。在Linux上,正如在许多其它UNIX样的系统中,名字服务是通过一个
称为named的程序提供的。在启动时,它将一组主要文件装入缓冲中,等待从远程或本地用户
进程来的请求。设立BIND有不同的方法,并且不是所有的方法都需要你在每个主机上都运行
名字服务器的。
虽然本章可以叙述的更详细一些,但却只是给出了如何操作一个名字服务器的粗略概况。如
果你计划在不只是一个小型局域网并且可能有一个Internet连接的环境下使用BIND,你应该
针对BIND取得一本好书,例如Crichet Liu的“DNS和BIND”(见[AlbitzLiu92])。对于当前
的信息,你也可以查阅包括在BIND原程序中的发行注释(release notes)。还有一个DNS问
题新闻组(newsgroup)称为comp.protocols.tcp-ip.domains。
6.1 解析器库
当谈及“解析器”,我们并不是指任何特殊的应用程序,而是指解析器库(resolver libra
ry),是一个能在标准C库中找到的函数的集合。主要的例程是gethostbyname(2)和gethost
byaddr(2),它们查寻属于一个主机的所有的IP地址,并且反之也然。它们可以被配置成只是
简单地在hosts中查询信息、请求名字服务器的一个数、或使用NIS的hosts数据库(Network
Information Service)。其它的应用程序,象smail,可能包括这些中的任何不同的驱动程
序,并且需要特别的照料。
6.1.1 host.conf文件
控制你的解析器设置的主要文件是host.conf。它存储于/etc中并且告知解析器使用哪个服务
、以及用什么顺序。
Host.conf中的选项必须出现在不同的行上。各个域要用空格(空格或制表符)隔离。一个“
#”号表示一个注释行。
有以下一些选项:
order
这确定了解析服务试验的顺序。有效的选项是:bind用于请求名字服务器、hosts用于在/et
c/hosts中查找、nis用于NIS查寻。可以指定其中的任何一个或所有。它们出现在一行上的顺
序决定了各个相关服务试验的顺序。
multi
以on或off做为选项。这决定了在/etc/hosts中的一个主机是否可以有几个IP地址,它通常指
的是作为“多宿主的”。这个标志对DNS或NIS请求是没有作用的。
nospoof
就如前章所解释的,DNS通过使用in-addr.arpa域,允许你找到属于一个IP地址的主机名。名
字服务器提供一个假主机名的企图被称为“哄骗”(“spoofing”)。为了防止这个做法,
解析器可以配置成检查是否一个原始IP地址实际上是与一个获得的主机名相关的。如果不是
,这个名字将被丢弃并且返回一个出错。这个行为是通过设置nospoof为on来打开的。
alert
这个选项使用on或off作为参数。如果它被打开,任何哄骗企图(见上面)将导致解析器将信
息写进syslog日志文件中。
trim
这个选项将一个域名作为参数,在查寻之前它将被从主机名中删去。这对于hosts项是很有用
的,那里你可能只想指定无本地域的主机名。附带有本地域名的一个主机的查寻将被移去本
地域,这样就使得在/etc/hosts中的查找获得成功。
Vlager的一个样本文件显示如下:
# /etc/host.conf
# We have named running, but no NIS (yet)
order bind hosts
# Allow multiple addrs
multi on
# Guard against spoof attempts
nospoof on
# Trim local domain (not really necessary).
trim vbrew.com.
6.1.2 解析器环境变量
host.conf中的设置可以通过使用环境变量来覆盖。这些环境变量是
RESOLV_HOST_CONF
这指定读一个文件而不是读/etc/host.conf。
RESOLV_SERV_ORDER
覆盖host.conf中给出的顺序选项。服务器以hosts、bind、以及nis顺序给出,用空格、逗号
、冒号、或分号来分隔。
RESOLV_SPOOF_CHECK
确定对待哄骗的方法。可以用off来完全禁止它。值warn和warn off启用哄骗检查,但分别打
开或关闭日志。值*启用哄骗检查,但留下在host.conf中定义的日志选项。
RESOLV_MULTI
值on或off可用于覆盖host.conf中的multi选项。
RESOLV_OVERRIDE_TRIM_DOMAINS
这个环境变量指定了一个修整域的列表,它覆盖host.conf中给出的修整域。
RESOLV_ADD_TRIM_DOMAINS
这个环境变量指定了一个修整域的列表,它对host.conf中的修整域作了增加。
6.1.3 配置名字服务器查寻―resolv.conf
当配置解析器库以使用BIND名字服务进行主机查找,你也必须告知它使用哪个名字服务器。
对此有一个独立的文件,称为resolv.conf。如果这个文件不存在或是空的,那么解析器就假
设名字服务器在你本地的主机上。
如果在你的本地主机上运行一个名字服务器,就象在下面一节中解释的那样,你必须单独地
设置它。如果你在本地网络上并且有机会使用一个现存的名字服务器的话,这将总是一种推
荐的做法。
resolv.conf中最重要的选项是nameserver,它给出了要使用的名字服务器的IP地址。如果你
通过几次给出nameserver选项指定了几个名字服务器,那么它们会以给出的顺序试用。因此
,你应该首先给出最可靠的服务器。目前,至多支持三个名字服务器。
如果没有给出nameserver选项,那么解析器试图连接本地主机上的名字服务器。
其它两个选项,domain和search涉及到如果BIND不能用第一个请求解析主机名时附加在主机
名上的缺省域。search选项指定了一个试用的域名列表。列表项是用空格或制表符分开的。
如果没有给出search选项,就会通过使用域名本身从本地域名以及直至root的父域中建立一
个搜寻列表。本地域名可以使用domain语句给出;如果一个也没有给出,那么解析器就通过
系统调用getdomainname(2)来获取。
如果这使得你感到混淆,考虑虚拟酿酒厂的resolv.conf样本文件:
# /etc/resolv.conf
# Our domain
domain vbrew.com
#
# We use vlager as central nameserver:
nameserver 191.72.1.1
当解析名字vale时,解析器将查询vale,并且vale.vbrew.com和vale.com都会失败。
6.1.4 解析器的稳固性
如果你在一个大型网络中运行一个局域网,你无疑地应该使用主要名字服务器如果它们存在
的话。这样做的优点是它们会有丰富的缓冲,因为所有的请求都转发给了它们。然而,这个
方案也有缺点:当一把火毁坏了我校的主干网电缆时,我们系的LAN就做不了什么工作了,因
为解析器不再能到达任何名字服务器了、在X-终端上不再能登录了、也没了打印等等。
尽管校园主干网在火中焚毁不是常有的事,但我们必须针对这种情况采取防范措施。
一种选择是设置一个从本地域解析主机名的本地名字服务器,并且转发对其它主机名的所有
请求到主服务器上去。当然,这只适用于你运行在自己的后台程序时。
另一种选择是,你可以在你的/etc/hosts中维护一个你的域或LAN的一个备份主机表。然后,
在/etc/host.conf中要包含“order bind hosts”使得解析器在主名字服务器不在时后退到
hosts文件。
6.2 运行named
在大多数UNIX机器上提供域名服务的程序通常称为named(发音为name-dee)。这是一个最初
为BSD开发的用于为客户提供名字服务的服务器程序,其它的名字服务器程序也可能是这样的
。目前在多数Linux安装中所使用的版本好象是BIND-4.8.3。现在BIND-4.9.3正处于Beta测试
阶段,不久就会有了。
本节需要对域名系统工作原理有一些理解。如果下面的讨论你一点也看不懂,你可以重新阅
读第2章,那里有关于DNS的更多的信息。
named通常在系统引导时启动的,并且一直运行到机器再次关闭为止。它从一个称为/etc/na
med.boot的配置文件中以及各种包含域名到地址映射数据的文件等中取得信息。后者称为区
域文件(zone files)。这些文件的格式和语义将在下一节中描述。
要运行named,只需在提示符下简单地键入
# /usr/sbin/named
named将启动,读取named.boot文件以及其中指定的任何区域文件。它将它的进程id以ASCII
写入/var/named.pid中、如有需要就从主服务器中下载任何区域文件,并且开始在端口53侦
听DNS请求。[1]
6.2.1 named.boot文件
named.boot文件通常很小并且只包括指向含有区域信息的主文件的指针、以及指向名字服务
器的指针。该boot文件中的注释行以一个分号开始一直延续到下一个新行开始。在我们详细
讨论named.boot的格式之前,我们将看一下图6.1中给出的vlager的样本文件。[2]
;
; /etc/named.boot file for vlager.vbrew.com
;
directory /var/named
;
; domain file
;---------------------