这一章 (网域名称系统) 是由 Jason R. Fink 贡献的
在 NetBSD 上的网域名称系统. 这一章描述利用在 NetBSD 上的网域名称系统 (DNS), 设定一个简单的小网域。它不会提供详细的说明什么是 DNS,而只有一个 摘要的解释。进一步的信息可以从 DNS Resources Directory 获得 (DNSRD) 位于 http://www.dns.net/dnsrd/。
这一章的范例中,参考了 BIND major version 8,应该注意的是数据库的格式和 named.conf 档在所有版本几乎是 100% 兼容的。 我注意到的唯一不同点是,"$TTL" 信息是不需要的。
读者应该对主机与 IP 地址的对映,和 IP 地址的分类有基本的认识。
网域名称系统是将机器的名称转变成 IP 地址。对映是指从名称到地址和 从地址到名称。在一般主机 IP 的对映和网域对映的不同是,DNS 使用 阶层式的命名标准。此阶层的运作方式是由右而左,在右边的表示最高 等级。简单的范例如下:
TOP-LEVEL .org | MID-LEVEL .diverge.org ______________________|________________________ | | | BOTTOM-LEVEL strider.diverge.org samwise.diverge.org wormtongue.diverge.org
这似乎是过于简单,无论如何,系统可以再被进一步地分割。此例在 diverge.org 网域中,显示了三个节点,但我们可以将 diverge.org 分成三个次网域,如 strider.net1.diverge.org, samwise.net2.diverge.org 和 wormtongue.net2.diverge.org, 在这里,两个节点位于 net2.diverge.org 而一个位于 net1.diverge.org。
现在让我们看看如何实际地设定一个小型的 DNS。我们将继续使用上述 的范例,在此之前,必须先做一些假设:
host-to-ip 可以正确地工作
IPNAT 可以正确地工作
目前所有的主机使用 ISP 作为 DNS
Note: 此类型的设定被描述在 Chapter 9 中。
我们的名称服务器将是 "strider" 主机,它也跑 IPNAT,而另两台机器使用 strider 作为网关器。 不论 strider 的联机接口是什么类型没有关系,在此我们假设它 使用 56k 的拨接连线。
所以,在进行下一步以前,让我们看看 strider 上的 hosts 档, 以便使用我们的 DNS。
Example 10-1. strider 的 /etc/hosts 檔
127.0.0.1 localhost 192.168.1.1 strider 192.168.1.2 samwise sam 192.168.1.3 wormtongue worm
如果不是相当庞大的网络,并不需要使用大型网络所使用的规则, 如同我们在上下文中所讨论的一般。
NetBSD 操作系统提供了一些预设的档案供你使用或参考,它们 存放在 /etc/namedb,我强烈地建议备份此 目录以供参考。
预设的目录包含以下档案:
127
localhost
loopback.v6
named.conf
root.cache
你将在我的设定中看见如何修改这些档案。
我们要看的第一个档案是 /etc/namedb/named.conf。此档用来设定 bind(即名称快取)。我们要做的 设定是相当简单的。首先,展示我的范例:
options { directory "/etc/namedb"; allow-transfer { 192.168.1.0/24; }; recursion yes; allow-query { 192.168.1.0/24; }; listen-on port 53 { 192.168.1.1; }; }; zone "localhost" { type master; notify no; file "localhost"; }; zone "127.IN-ADDR.ARPA" { type master; notify no; file "127"; }; zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" { type master; file "loopback.v6"; }; zone "diverge.org" { type master; notify no; file "diverge.org"; }; zone "192.168.1.in-addr.arpa" { type master; notify no; file "192.168.1"; }; zone "." in { type hint; file "root.cache"; };
在我的 named.conf 档中,root 部份是放在 最后的,这是因为在 internet 上已经有另一个叫做 diverge.org 的网域了(我正好拥有它),所以我要在最后才搜寻它。 这不是大多数系统的常例。
如果你有内部的设定,这将是一件重要的事,否则,如果没有 internet 的联机且/或不需要做 root 服务器的搜寻,则将 root 部份批注掉。如果特定的机器决定它要参考 internet 上的网域, 这将会造成搜寻的问题。
这看起来相当多,其实在进一步地检查之后,可以发现有许多部份是 重复的。所以我只对它们稍做解释。
让我们检视 named.conf:
这部份定义了一些全域的参数,最需注意的是 DNS 表的位置, 在特定的系统上,它们被放置在 /etc/named。
以下是其余的参数:
远程 DNS 服务器的角色是次要的,并需要从你这里获得 zone 档案的信息。
什么网络可以查询此台名称服务器
服务器执行 named 的 port
named.conf 档的其余部份包含了 "zones",每个 zone 都有一个关联的档案及伴随 的表格,被用来解析在网域中特殊的地区(或 zone)。显而易见地, 它们在 named.conf 中的格式是非常相似的,所以我只提及其中的一项:
除了 "." 以外,zone 的类型是 master
当你的 zone 改变时,你想要寄出通知吗? 明显地,在这里的设定是不要。
在我们的 named 目录中,纪录关于此特殊 zone 的 文件名称。
zone 档案大部分看起来是相当类似的,但是,每个档案都有独特 的属性。localhost 档看起来像这样:
Example 10-2. localhost
1|$TTL 3600 2|@ IN SOA strider.diverge.org. hostmaster.diverge.org. ( 3| 1 ; Serial 4| 8H ; Refresh 5| 2H ; Retry 6| 1W ; Expire 7| 1D) ; Minimum TTL 8| IN NS localhost. 9|localhost. IN A 127.0.0.1 10| IN AAAA ::1
逐行检视:
用来设定 Time To Live,通常在所有档案皆相同。
此行通常在所有 zone 档案中皆相同,除了 root 以外。 对此行中有兴趣的部份为 strider.diverge.org 和 root.diverge.org。明显地,一个是此服务器的名称,另一个是 和此服务器有所接触的,在大部分的例子中,root 似乎是有些 含糊不清的,它最好是一个正规的 email 账号,用来接收信息 (例如,我的将是 jrf.diverge.org)。
此行是一序列的数字,大部分的人们使用他们安装服务器的 日期作为格式,像这样:MMDDYYYY。在最初的安装 之后,此序列的数字在档案被更改 时,都会增加,这是我喜欢以 1 为开始的原因。
此行是服务器的的更新速率,在这里的设定是每 8 小时一次。
登记速率。
搜寻期限。
Time To Live 的最小值
Nameserver,如你所见,它被设为 localhost。
区域主机的项目。
ipv6 的项目。
localhost 的反查檔(或 zone)。看起来像这样:
1| $TTL 3600 2| @ IN SOA strider.diverge.org. root.diverge.org. ( 3| 1 ; Serial 4| 8H ; Refresh 5| 2H ; Retry 6| 1W ; Expire 7| 1D) ; Minimum TTL 8| IN NS localhost. 9| 1.0.0 IN PTR localhost.
此档中,除了第 9 行以外,每一行都和 localhost 的 zone 档相同, 这是反查纪录文件。定义成不同的档案是因为它是 localhost 且具有和 其余 zone 完全不同的地址。在搜寻过所有的 zone 档以后,有时 我们将会讨论它。
此 zone 常用做纪录在 192.168.1.0/24 网络上的主机。 看起来像这样:
1| $TTL 3600 2| @ IN SOA strider.diverge.org. root.diverge.org. ( 3| 1 ; serial 4| 8H ; refresh 5| 2H ; retry 6| 1W ; expire 7| 1D ) ; minimum seconds 8| IN NS strider.diverge.org. 9| IN MX 10 maila.diverge.org. ; primary mail server 10| IN MX 20 mailb.diverge.org. ; secondary mail server 11| strider IN A 192.168.1.1 12| maila IN CNAME strider.diverge.org. 13| samwise IN A 192.168.1.2 14| www IN CNAME samwise.diverge.org. 15| mailb 16| worm IN A 192.168.1.3
有许多新的设定,让我们检视它们:
此行展示了我们的邮件处理者,在此是 strider,但为了区隔 起见,我们要称它 maila。如你所见,在 maila.diverge.org 之前的数字代表优先度。数字愈低其优先度愈高。我们依此 方法设定,如果 strider 不能处理邮件,则 mailb(实际为 samwise)将接手。
CNAME 是正规名称的标准,如果不是,则用别名。 所以我们有以下的别名:
maila.diverge.org to strider.diverge.org mailb.diverge.org to samwise.diverge.org www.diverge.org to samwise.diverge.org
其余的纪录只是简单地对映 IP 地址到它们的全名。
此 zone 文件是对所有主机的反查文件的纪录,其格式相似于 localhost, 除了地址有些不同以外:
1|$TTL 3600 2|@ IN SOA strider.diverge.org. root.diverge.org. ( 3| 1 ; serial 4| 8H ; refresh 5| 2H ; retry 6| 1W ; expire 7| 1D ) ; minimum seconds 8| IN NS strider.diverge.org. 9|1 IN PTR strider.diverge.org. 10|2 IN PTR samwise.diverge.org. 11|3 IN PTR worm.diverge.org.
此档是它收到请求搜寻在它所在网域之外的地址时,所可以查询的 root 服务器的列表。这里是开头的数行:
; $NetBSD: chap-dns.sgml,v 1.1.1.2 2001/09/05 17:04:06 jrf Exp $ ; ; This file holds the information on root name servers needed to ; initialize cache of Internet domain name servers ; (e.g. reference this file in the "cache . file" ; configuration file of BIND domain name servers). ; ; This file is made available by InterNIC registration services ; under anonymous FTP as ; file /domain/named.root ; on server FTP.RS.INTERNIC.NET ; -OR- under Gopher at RS.INTERNIC.NET ; under menu InterNIC Registration Services (NSI) ; submenu InterNIC Registration Archives ; file named.root ; ; last update: Aug 22, 1997 ; related version of root zone: 1997082200 ; ; ; formerly NS.INTERNIC.NET ; . 3600000 IN NS A.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 ; ; formerly NS1.ISI.EDU ; . 3600000 NS B.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107 ; ; formerly C.PSI.NET ; . 3600000 NS C.ROOT-SERVERS.NET. C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 . . .
此档可以从 ISC 获得,位于 http://www.isc.org/ 并 通常和 BIND 一起散布。root.cache 文件也包含在 NetBSD 作业 系统中。
在这一段我们将看到如何启动 DNS 并设定 strider 以使用它的服务。
NetBSD 已经提供了一个 dns 快取服务器(下一段会介绍)。这些工具 可用以管理运作中的服务器。在开始以前,我们必须知道如何适当地 初始化服务器。
设定 named 并自动地启动是相当简单的。 在 /etc/defaults/rc.conf 中,简单地将 named 那一行的 NO 置换成 YES 即可。额外的选项也可以被指定, 例如,我想喜欢使用 -g nogroup -u nobody,使非 root 账号也可以 执行 named。
除了能在开机时启动 named,也可以使用 ndc 来控制。简言之,ndc 机制可以停止,启动或 重新启动 named。它也可以做其它重要的事(请看 ndc 在线手册, 以得到更详细的说明)。
通常的用法是 ndc。
接着,我们要将 strider 指向它自己来做搜寻。我们有两个简单的步骤, 第一,决定我们的解析顺序。如果网络如此小,最好每一台主机都有 hosts 表格的备份,因此我们可以不使用 hosts 而使用 dns,无论如何, 在大型的网络上,比较容易使用 DNS。此外,我们存放档案的地方是 /etc/nsswitch.conf (请看 Example 9-2.) 这里是典型 nsswitch.conf 檔的一部分:
. . . group_compat: nis hosts: files dns netgroup: files [notfound=return] nis . . .
我们在意的是有 hosts 的那一行,files 表示系统使用 /etc/hosts 来决定 ip 到名称的转换。 剩下的项目是解析的第一个方法。
下一个档案是 /etc/resolv.conf,此档是 dns 解析档,格式一目了然,但仍将稍做解释:
domain diverge.org search diverge.org nameserver 192.168.1.1
简言之,此档是告诉解析者,这台机器属于 diverge.org,应该优先 搜寻它,而且 nameserver 地址是 192.168.1.1。
使用以下命令测试我们的 nameserver:
# host www.blah.net
执行 host www.yahoo.com 的输出为:
www.yahoo.com is a nickname for www.yahoo.akadns.net www.yahoo.akadns.net has address 216.32.74.50 www.yahoo.akadns.net has address 216.32.74.51 www.yahoo.akadns.net has address 216.32.74.52 www.yahoo.akadns.net has address 216.32.74.53 www.yahoo.akadns.net has address 216.32.74.55
设定 client 主机的过程是相同的,设定 /etc/nsswitch.conf 和 /etc/resolv.conf。
只有 name 服务的快取并没有区域的 zone;所有的查询都送往 root 服务器,而响应的结果都累积在区域的快取上。下一次的 查询将获得较快的反应,因为数据已经在服务器的快取上了。 因此,此类型的服务器并不处理区域的 zone,它仍将使用已知的 /etc/hosts 文件来解析区域主机的名称。
因为 NetBSD 提供的默认值只有在服务器上才快取所需的档案,此类型 的 DNS 设定是非常容易的,并且可使用少许的指令执行,而不需要修改 设定档。
Note: 设定档的数目和内容依据 NetBSD 版本的不同而有所改变。
用作 DNS 服务器的程序是 named 常驻 程序,以 named.conf 作为它的设定档。 NetBSD 所提供的预设档案位于 /etc/namedb 目录中,但常驻程序会在 /etc/ 目录中寻找它, 所以我们可以建立一个链接:
# ln -s /etc/namedb/named.conf /etc/named.conf
name 服务已经可以使用了!我们现在可以告诉系统以使用它, 将此行加入 /etc/resolv.conf 檔中:
nameserver 127.0.0.1
现在可以启动 named。
# named
Note: 我们已经手动地启动 name 服务了。在测试并确认能正常工作后,可以 修改在 /etc/rc.conf 文件中相关的选项,以便 在开机时能自动地启动它。
现在服务已经被启动而我们可以用 nslookup 程序测试它。
# nslookup Default server: localhost Address: 127.0.0.1 >
让我们试着解析一个主机名称,例如 www.mclink.it(是一个离你最近的站台。)
> www.mclink.it Server: localhost Address: 127.0.0.1 Name: www.mclink.it Address: 195.110.128.8
如果你重复第二次的查询,结果会有些许不同:
> www.mclink.it Server: localhost Address: 127.0.0.1 Non-authoritative answer: Name: www.mclink.it Address: 195.110.128.8
你可能已经注意到了,地址相同但出现了 "Non-authoritative answer" 的讯息。 此讯息指出,响应来自我们的快取而不是 mclink.it 网域。
第一次测试的结果表示服务能正常地工作。
我们可以试试 host 指令,可得到以下结果。
# host www.mclink.it www.mclink.it has address 195.110.128.8