在Linux上建立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 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
其中、等是你能直接访问到的 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 服务器的优先级。