Chapter 10. 网域名称系统 (DNS)

Table of Contents
10.1. 注意事项与要件
10.2. 何谓 DNS?
10.3. DNS 档案
10.4. 使用 DNS
10.5. 设定只有 name 服务的快取

这一章 (网域名称系统) 是由 Jason R. Fink 贡献的

在 NetBSD 上的网域名称系统. 这一章描述利用在 NetBSD 上的网域名称系统 (DNS), 设定一个简单的小网域。它不会提供详细的说明什么是 DNS,而只有一个 摘要的解释。进一步的信息可以从 DNS Resources Directory 获得 (DNSRD) 位于 http://www.dns.net/dnsrd/

10.1. 注意事项与要件

这一章的范例中,参考了 BIND major version 8,应该注意的是数据库的格式和 named.conf 档在所有版本几乎是 100% 兼容的。 我注意到的唯一不同点是,"$TTL" 信息是不需要的。

读者应该对主机与 IP 地址的对映,和 IP 地址的分类有基本的认识。

10.2. 何谓 DNS?

网域名称系统是将机器的名称转变成 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。

10.3. DNS 档案

现在让我们看看如何实际地设定一个小型的 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
      

如果不是相当庞大的网络,并不需要使用大型网络所使用的规则, 如同我们在上下文中所讨论的一般。

10.3.1. /etc/namedb/named.conf

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

10.3.1.1. options

这部份定义了一些全域的参数,最需注意的是 DNS 表的位置, 在特定的系统上,它们被放置在 /etc/named

以下是其余的参数:

allow-transfer

远程 DNS 服务器的角色是次要的,并需要从你这里获得 zone 档案的信息。

allow-query

什么网络可以查询此台名称服务器

listen-on port

服务器执行 named 的 port

named.conf 档的其余部份包含了 "zones",每个 zone 都有一个关联的档案及伴随 的表格,被用来解析在网域中特殊的地区(或 zone)。显而易见地, 它们在 named.conf 中的格式是非常相似的,所以我只提及其中的一项:

10.3.1.2. zone "diverge.org"

type

除了 "." 以外,zone 的类型是 master

notify

当你的 zone 改变时,你想要寄出通知吗? 明显地,在这里的设定是不要。

file

在我们的 named 目录中,纪录关于此特殊 zone 的 文件名称。

10.3.2. /etc/namedb/localhost

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
        

逐行检视:

Line 1

用来设定 Time To Live,通常在所有档案皆相同。

Line 2

此行通常在所有 zone 档案中皆相同,除了 root 以外。 对此行中有兴趣的部份为 strider.diverge.org 和 root.diverge.org。明显地,一个是此服务器的名称,另一个是 和此服务器有所接触的,在大部分的例子中,root 似乎是有些 含糊不清的,它最好是一个正规的 email 账号,用来接收信息 (例如,我的将是 jrf.diverge.org)。

Line 3

此行是一序列的数字,大部分的人们使用他们安装服务器的 日期作为格式,像这样:MMDDYYYY。在最初的安装 之后,此序列的数字在档案被更改 时,都会增加,这是我喜欢以 1 为开始的原因。

Line 4

此行是服务器的的更新速率,在这里的设定是每 8 小时一次。

Line 5

登记速率。

Line 6

搜寻期限。

Line 7

Time To Live 的最小值

Line 8

Nameserver,如你所见,它被设为 localhost。

Line 9

区域主机的项目。

Line 10

ipv6 的项目。

10.3.3. /etc/named/zone.127.0.0

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 档以后,有时 我们将会讨论它。

10.3.4. /etc/namedb/diverge.org

此 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
      

有许多新的设定,让我们检视它们:

Line 12

此行展示了我们的邮件处理者,在此是 strider,但为了区隔 起见,我们要称它 maila。如你所见,在 maila.diverge.org 之前的数字代表优先度。数字愈低其优先度愈高。我们依此 方法设定,如果 strider 不能处理邮件,则 mailb(实际为 samwise)将接手。

Line 12

CNAME 是正规名称的标准,如果不是,则用别名。 所以我们有以下的别名:

maila.diverge.org to strider.diverge.org
mailb.diverge.org to samwise.diverge.org
www.diverge.org   to samwise.diverge.org
              

其余的纪录只是简单地对映 IP 地址到它们的全名。

10.3.5. /etc/namedb/192.168.1

此 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.
      

10.3.6. /etc/namedb/root.cache

此档是它收到请求搜寻在它所在网域之外的地址时,所可以查询的 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 作业 系统中。

10.4. 使用 DNS

在这一段我们将看到如何启动 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

10.5. 设定只有 name 服务的快取

只有 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 文件中相关的选项,以便 在开机时能自动地启动它。

10.5.1. 测试服务

现在服务已经被启动而我们可以用 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