如何在Linux上建立DNS服务器

Version: 0.20 (1998/09/11)

作者:四通立方网友 OpenView

E-mail:ws_sh@hotmail.com

一、 假定

本文假定你已对域名服务器 DNS 有基本的了解,如果不是,请参看相关的文裆。

许多DNS的文章都是从DNS原理开始介绍,本人则从使用的角度出发,为Linux的管理员提供一些简单实用的应用实例。

下面假定我们需要建立一台企业网的DNS主服务器,应用条件如下:

(1) 一个C类网段地址 (本例中假定是192.22.33)

(2)企业域名为 my.com,并已注册 (主域名服务器地址 192.22.33.20,主机名为 linux.my.com)

(3)企业网通过路由器与Internet连接

假如你的应用环境与上述条件不同,也请往下看,本文会在上述例子的基础上针对以下情况作修正:

(1) 多个网段

(2) 封闭的内部网

(3) 只能访问局部公共网的情况(如169网、上海热线等)

二、named、/etc/named.boot 和 ndc

DNS 服务器的主体是域名服务器进程 named ,named 启动后向DNS客户机提供域名解析服务,把域名转换成IP地址。

named 启动时需要读取一个初始化文件,缺省情况下是 /etc/named.boot,所以/etc/named.boot 是 named 的基本配置文件。

虽然启动 named 可直接执行 named,在Linux上我们可以使用一个控制 named 的工具 ndc。ndc 可以用于启动、中止、重启动、刷新DNS数据、输出DNS数据等多种调试功能,我在这里推荐大家用这个工具来帮助 DNS 服务器的调试。

有关 ndc 的详细用法,请参看 Linux 有关文档。

三、建立 named 配置文件 /etc/named.boot

/etc/named.boot 是基本的配置文件,但不包含任何 DNS 数据,针对我们前面的假定,我们先建立以下 /etc/named.boot,其内容如下:
;
;    boot file for name server
;
directory   /var/named

primary    my.com                                 db.my
primary    0.0.127.IN-ADDR.ARPA           db.127.0.0
primary    33.22.192.IN-ADDR.ARPA         db.192.22.33
cache      .                              db.cache
其中以“;”开头的行是注释行,其他各行含义是

(1)diretory /var/named

指定 named 从 /var/named 目录下读取 DNS 数据文件。这个目录用户可自行指定并创建,指定后所有的DNS 数据文件都存放在此目录下。

(2)primary my.com db.my

指定 named 作为 my.com 域的主域名服务器,db.my 文件中包含所有 *.my.com 形式的域名转换数据。

(3)primary 0.0.127.IN-ADDR.ARPA db.127.0.0

指定 named 作为127.0.0网段地址转换主服务器,db.127.0.0 文件中包含了 127.0.0.* 形式的地址到域名的转换数据。(127.0.0网段地址是局域网接口的内部 loopback 地址)

(4)primary 33.22.192.IN-ADDR.ARPA db.192.22.33

指定 named 作为 192.22.33 网段地址转换主服务器,db.192.22.33 文件中包含了所有 192.22.33.* 形式的地址到域名的转换数据。

(5) cache . db.cache

指定 named 从 db.cache 文件中获得 Internet 的顶层“根”服务器地址

要注意(3)(4)两行中的网段地址是倒写的,另外,各个文件名也是可以自行决定的。

四、建立各个 DNS 数据文件

下一步,要按 /etc/named.boot 中的定义,建立各个 DNS 数据文件。

(1)建立正向域名转换数据文件 db.my

根据 /etc/named.boot 的定义,我们在 /var/named 目录下建立 db.my,其中应该包括所有在 my.com 域内的主机节点。但在机器数量较多时,为了调试方便,建议一开始只把几台节点的数据放入文件,待 named 正常工作后再把其他节点的数据补充进去。下面是 db.my的例子:

@       IN      SOA     linux.my.com. root.linux.my.com. (
                        199511301       ; serial, todays date + todays serial #
                          28800           ; refresh, seconds
                          7200            ; retry, seconds
                          3600000         ; expire, seconds
                          86400 )         ; minimum, seconds
                NS      linux.my.com.
                MX      10      support.my.com.

localhost       A       127.0.0.1
linux           A               192.22.33.20
support2                A               192.22.33.102
hp712           A               192.22.33.160
support         A               192.22.33.100
mail                    MX      10      support.my.com.
                        MX      20      support2.my.com.
www                     CNAME   hp712.my.com.
ftp                     CNAME   hp712.my.com.
ns                      CNAME   linux.my.com.
其中第一行是 SOA 记录,定义了域名数据的基本信息,依次是 DNS 服务器名、DNS 管理员邮件地址,括号内的第一个数字是文件版本号,每次本文件内容修改后,必须更改此号。其余数字与DNS服务器直接的数据交换有关,在这里我们不需要改动。

括号后面有一条 NS 记录和一条 MX 记录,定义了域名服务器本身的域名和 username@my.com 形式邮件地址所对应的邮件服务器名字。

在此以下是各种域名/地址转换数据,其中 A 记录是 DNS 域名到 IP 地址的记录,是必须有的,以 hp712.my.com 为例,在 A 记录中域 my.com 被省略,只写成 hp712,named 在处理时会根据 named.boot 中的定义自动加上 my.com,而其对应 IP 地址为 192.22.33.160。

另一种记录是 MX 记录。MX 是邮件地址转换记录,本例中定义了将 username@mail.my.com 的邮件地址转换成 username@support.my.com 或 username@support2.my.com,即实际上真正的邮件服务器是 support.my.com 和 support2.my.com,其中 support.my.com 的优先数为 10,support2.my.com 的优先数为 20,所以通常邮件首先被发往优先数小的主机 support.my.com。

还有一些是为方便提供的 CNAME 记录。CNAME 定义了一些主机的别名,比如我们将 hp712.my.com 作为公司的 www 和 ftp 服务器,所以我们提供了 www.my.com 和 ftp.my.com 作为 hp712.my.com 的别名,用户只需要根据习惯就可以访问公司的 www、ftp 服务器了,如果将来我们换用别的主机作 www 和 ftp 服务器,只需要修改 CNAME 记录就可,对用户没有影响。

注意:MX 和 CNAME 记录最后的带域名的主机名后必须带一个“.”

(2)建立反向 DNS 数据文件 db.127.0.0 和 db.192.22.33

反向 DNS 数据文件用来提供根据 IP 地址查询相应 DNS 主机名,每个网段分别有一个数据文件。

对于内部网段 127.0.0 通常只有一个地址,即 127.0.0.1 loopback 地址,db.127.0.0 内容如下:

@       IN      SOA     linux.my.com root.linux.my.com.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      linux.my.com.

1       IN      PTR     localhost.
而外部网段的数据文件 db.192.22.33 中包含所有主机 IP 地址到 DNS 主机名的转换数据。db.192.22.33 内容如下:
@               IN      SOA     linux.my.com. root.pc590.my.com. (
                                  199609206       ; Serial
                                  28800   ; Refresh
                                  7200    ; Retry
                                  604800  ; Expire
                                  86400)  ; Minimum TTL
                        NS      linux.my.com.
;
;       All hosts
;
20      PTR     linux.my.com.
102     PTR     support2.my.com.
100     PTR     support.my.com.
160     PTR     hp712.my.com.
反向 DNS 数据文件中的主要部分是 PTR 记录,PTR 记录中的 IP 地址都只有主机号,named 会根据 named.boot 的定义自动加上前面的网络号,注意后面的主机名要附加一个“.”

(3)获得 db.cache 文件

在 Linux 系统上通常在 /var/named 下已经提供了一个 named.ca,该文件文件中包含了 Internet 的顶层域名服务器,但这个文件通常会发生变化,所以建议最好从 Internic 下载最新的版本。该文件可通过匿名 ftp 从 ftp.rs.internic.net 下载,在 domain 目录下,文件名为 named.root。注意该文件下载后要拷贝到 named 的工作目录并重命名成 named.boot 中指定的文件名,本文中为 db.cache。

五、启动和测试 named

首先,根据先前推荐的方法,用 ndc 启动 named:

ndc start

然后,为了使用和测试 named,要把 Linux 设置在使用 DNS 状态。方法是在 /etc 目录下,创建 resolv.conf 文件。以我们的例子,/etc/resolv.conf 内容为:

search my.com
nameserver 192.22.33.20
然后,我们就可以测试 named 了。

Linux 和其他 Unix 系统均提供了 nslookup 工具,在命令行状态下输入:

nslookup

就进入交换式 nslookup 环境,如果 named 正常启动,nslookup 会显示当前 DNS 服务器的地址和域名,否则表示 named 没能正常启动。下面简单介绍一些基本的 DNS 诊断:

(1)检查正向 DNS 解析

在 nslookup 提示符下输入带域名的主机名,如 hp712.my.com,nslookup 应能显示该主机名对应的 IP 地址,如果只输入 hp712,nslookup 会根据 /etc/resolv.conf 的定义,自动添加 my.com 域名并回答对应的 IP 地址。

(2)检查反向 DNS 解析

在 nslookup 提示符下输入某个 IP 地址,如 192.22.33.20,nslookup 应能回答该 IP 地址所对应的主机名。

(3)检查 MX 邮件地址记录

在 nslookup 提示符下输入:

set q=mx

然后输入某个域名,以本文的例子,输入 my.com 或 mail.my.com,nslookup 应能够回答对应的邮件服务器地址,即 support.my.com 和 support2.my.com。

(4)检查 CNAME 别名记录

在 nslookup 提示符下输入:

set q=cname

然后输入某个别名,如 www.my.com,nslookup 应能回答对应的真实主机名,即 hp712.my.com。

如要退出 nslookup,可输入 exit。

六、修改 DNS 数据

如果要在网络中增加主机,例如要增加一台叫做 pc01.my.com 的 PC 机,管理员要在 db.my 中增加该主机对应的 A 记录,并且要在 db.192.22.33 中增加对应的 PTR 记录,然后用 ndc 更新 named 的数据:

ndc reload

要注意必须同时更改 A 记录和 PTR 记录,许多管理员往往只增加 A 记录而忽略了逆向查询用的 PTR 记录,结果会使许多应用程序不能正常运行。

特别注意,一旦修改了 DNS 数据文件的内容,请务必改动数据文件的版本号( Serial )

七、使网络中的其他系统(客户机)使用 DNS 服务器

一旦 DNS 服务器开始工作,就可以配置所有企业网内的主机使用 DNS 服务。

Unix 主机配置的方法,已经在前面说明过,即创建 /etc/resolv.conf 文件,内容见前面第五节。

Windows 95 的配置则是在网卡的 TCP/IP 配置中,选择使用 DNS (enable),然后在配置窗口中分别填入各项参数。以本文的例子,如果运行 Windows95 的主机被命名为 pc01.my.com,则在主机名(Host)一栏中填 pc01,在域名(Domain)一栏中填 my.com,然后把域名服务器 (DNS Server)加入搜索列表中。

Windows NT 节点的配置大致相同。

八、几种不同环境下的修正

(1)如果 IP 网段多于一个

假定现在在 my.com 域中增加一个 IP 网段 192.22.37,则 /etc/named.boot 的内容中就增加一个网段的定义,具体如下:

;
;    boot file for name server
;
directory   /var/named

primary    my.com                               db.my
primary    0.0.127.IN-ADDR.ARPA           db.127.0.0
primary    33.22.192.IN-ADDR.ARPA         db.192.22.33
primary    37.22.192.IN-ADDR.ARPA         db.192.22.37
cache      .                              db.cache
而反向 DNS 数据文件则增加一个定义 192.22.37 网段的文件 db.192.22.37,其中包括了所有处于 192.22.37 网段中的节点,其格式与 db.192.22.33 类似。

(2)如果企业网是封闭的

如果企业网络不与外界 Internet 直接互连,DNS 服务器就不必关心本企业域以外的域名,所以配置 named 的时候可以不理会 db.cache,我们可以将 /etc/named.boot 中的 cache 行去除。

(3)如果你联入的公共网不能访问 Internet

如果你的内部网接入的公共网只能访问有限的范围,如免费的169网、上海热线等,那么你的 DNS 服务器就不能通过 Internet 的顶层服务器(root server)进行地址解析,所以你必须用你直接能访问到的 DNS 服务器来替代。具体办法是用 forwarders 选项来指定上级 DNS 服务器,以本文为例,named.boot 的内容为:

;
;    boot file for name server
;
directory   /var/named

primary    my.com                               db.my
primary    0.0.127.IN-ADDR.ARPA           db.127.0.0
primary    33.22.192.IN-ADDR.ARPA         db.192.22.33
primary    37.22.192.IN-ADDR.ARPA         db.192.22.37
forwarders   ...
options   forward-only
其中等是你能直接访问到的 DNS 服务器的地址,通常就是你的 ISP (169、上海热线等)的 DNS 服务器的地址,至少要有一个。

通过 forwarders 和 options forward-only 参数的指定,你的企业 DNS 服务器就工作在 forward-only 模式下,所有本地不能解决的名字都被传送到 ISP 的 DNS 服务器上去解析。

九、建立后备 DNS 服务器 (Secondary DNS Server)

通常有一台 DNS 主服务器,网络即可正常工作,但根据 Internic 对域名的管理规范,一个独立的域名必须至少有两台 DNS 服务器,即一台 DNS 主服务器 ( Primary Server )和一台后备 DNS 服务器 ( Secondary Server ),这主要是为 DNS 服务的可靠性考虑,能使 Internet 的性能更为可靠。

现在仍以前面的例子,现在要加入一台运行 Linux 的机器 nspc.my.com,IP 地址为 192.22.33.60。

(1)主服务器上的修改

首先确认 DNS 主服务器工作正常,然后,在主服务器上的正向 DNS 数据文件 db.my 中,加入 nspc.my.com 的有关记录,并增加一个NS记录,使主服务器上的 db.my 成为下列内容:

@       IN      SOA     linux.my.com. root.linux.my.com. (
                        199511301       ; serial, todays date + todays serial #
                          28800           ; refresh, seconds
                          7200            ; retry, seconds
                          3600000         ; expire, seconds
                          86400 )         ; minimum, seconds
                NS      linux.my.com.
                NS      nspc.my.com.   ; 必须增加的记录
                MX      10      support.my.com.

localhost       A       127.0.0.1
linux           A               192.22.33.20
support2                A               192.22.33.102
hp712           A               192.22.33.160
support         A               192.22.33.100
nspc                    A               192.22.33.60    ; 增加的记录
mail                    MX      10      support.my.com.
                        MX      20      support2.my.com.
www                     CNAME   hp712.my.com.
ftp                     CNAME   hp712.my.com.
ns2                     CNAME   nspc.my.com.    ; 增加的记录
ns                      CNAME   linux.my.com.
然后对主服务器上的各个反向 DNS 数据文件做类似的修改,增加有关后备服务器的 NS 记录,然后重新起动 named。

可见,其实在主 DNS 服务器上的改动主要是增加了一条 NS 记录,其余的改动和增加一台普通节点一样,如果是用现有的节点做后备 DNS 服务器,则增加 NS 记录是唯一必须的步骤。

(2)后备 DNS 服务器(secondary server)的配置

需要在后备 DNS 服务器上创建的配置文件只有 named.boot 和 db.cache,格式与主服务器相似,named.boot 内容为:

;
;    boot file for secondary name server
;
directory   /var/named

secondary   my.com                  192.22.33.20        db.my
secondary   0.0.127.IN-ADDR.ARPA    192.22.33.20 db.127.0.0
secondary   33.22.192.IN-ADDR.ARPA  192.22.33.20 db.192.22.33
cache       .                       db.cache
其中的三行 secondary 定义,使得 named 从 192.22.33.20,即主服务器上获得各种 DNS 数据,并存在本地的各个数据文件中。本地的数据文件由 named 从主 DNS 服务器的 named 下载后生成,通常与主服务器上的数据文件完全一样,万一后备服务器与主服务器失去连接而不能下载 DNS 数据,后备服务器可利用本地的数据文件工作。

而后备 DNS 服务器的 db.cache 通常由系统管理员从主服务器上拷贝过来即可。

通常,后备 DNS 服务器可以建立在企业网内,也可利用外部的 DNS 服务器充当,如让 ISP 的服务器作为企业的后备 DNS 服务器,这样可以提高 DNS 服务的可靠性。注意,同一台 DNS 服务器可以同时成为多个 DNS 域的服务器,而且可以既作某些域的主服务器,同时又是另一些域的后备服务器。

(3)DNS 客户机端的改动

对于内部网上的 Unix 主机,应该在 /etc/resolv.conf 中增加一行 nameserver 说明,使得系统能够搜索后备 DNS 服务器,以本文的例子,/etc/resolv.conf 的内容为:

search my.com
nameserver 192.22.33.20
nameserver 192.22.33.60
注意,我们可以根据需要决定 /etc/resolv.conf 中所列出的 DNS 服务器的顺序,通常选择访问速度快的服务器在前。

对于 Windows95 和 NT,则是在 DNS 服务器的列表中把后备 DNS 服务器添加进去即可,添加的顺序同样可以决定访问各 DNS 服务器的优先级。


欢迎各位网友对本文提出修正和改进意见,本人 E-mail:ws_sh@hotmail.com

嗯,nsswitch.conf的配置以及把DNS配置成cache only的方式没有讲,不过那比较简单,很多书上都有.
另外收集了一些问答集.
在收集整理这些FAQ集时,还看到了中文DNS系统已经实现的报道,可惜没有看到技术规范,我想在Linux
下实现它应该不会太难。
 
 
 
 

本文转自中文Linux论坛