bind9配置精讲(二)

原贴位置:http://shcore.com.cn/gugong/gugong/html/bind9.html

重新启动 named

当您以为所有设定档都设定好之后,最想做的事情莫过于要测试一下啦。但在测试之前,我们还要重新启动 named ,否则,您查询出来的还是旧数据。聪明的您或许已经知道使用如下命令来重新启动DNS 服务了吧:

service named restart


然而,作为一个有经验的 DNS 管理员,在重新启动 named 服务之后,他一定会检查一个档案,就是 /var/log/messages 。因为,许多时候,当您执行 service named restart 之后您看到的都是绿色的 OK ,但事实上是否真的 OK 呢?谁也不敢保证,除非您在 log 档中没发现错误信息。所以,我也强烈建议您每次重新启动 named 之后,一定一定要做如下动作:

vi /var/log/messages


然后按“G”键(大写)跳到档案末尾部份(事实上,您也可以用 tail 命令)。您或许会看到如下这样的记录:

Nov 16 14:54:10 rh71 named[2211]: starting BIND 9.1.0 -u named
Nov 16 14:54:10 rh71 named[2211]: using 1 CPU
Nov 16 14:54:10 rh71 named: named startup succeeded
Nov 16 14:54:10 rh71 named[2215]: loading configuration from '/etc/named.conf'
Nov 16 14:54:10 rh71 named[2215]: the default for the 'auth-nxdomain' option is now 'no'
Nov 16 14:54:10 rh71 named[2215]: no IPv6 interfaces found
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface lo, 127.0.0.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth0, 192.168.100.23#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth1, 10.0.1.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth2, 10.0.1.131#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet1, 172.16.233.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet8, 192.168.183.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface ppp0, 211.74.244.213#53
Nov 16 14:54:10 rh71 named[2215]: running



上面虽然有 'auth-nxdomain' 和 IPV6 的提示,但那是正常的(除非您有设定相关的功能)。如果没有其它错误信息的话,那真要恭喜您了!

但有时候您或许会看到有其它错误信息的,例如:

Nov 16 15:01:49 rh71 named[2287]: loading configuration from '/etc/named.conf'
Nov 16 15:01:49 rh71 named[2287]: /etc/named.conf:41: parse error near zone
Nov 16 15:01:49 rh71 named[2287]: loading configuration: failure
Nov 16 15:01:49 rh71 named[2287]: exiting (due to fatal error)



这个错误信息明显指出了是 /etc/named.conf 的问题,而且很可能在 41 行附近。根据我个人的经验,这通常是您漏了 “ ;”符号的原因而已。

如果您碰到如下信息,那是没有为所有 RR 记录项设定 TTL 而已,您可以为每一个记录项补上 TTL (在 IN 前面),也可以在记录文件的前面用 $TTL 来设定:

Nov 16 15:04:47 rh71 named[2395]: master.c:1172: unexpected error:
Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:3: no TTL specified.
THIS ZONE WILL NO LONGER WORK IN FUTURE VERSIONS. Add a TTL.
Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:5: using
RFC 1035 TTL semantics



如果您碰到下面这样的信息,那多是因为您打字错误的关系,输入了 named 不认识的记录类别名称(例如漏了记录名称或打错了):

Nov 16 15:07:44 rh71 named[2422]: dns_master_load: siyongc:2: unknown RR
type 'siyongc.domain.'
Nov 16 15:07:44 rh71 named[2422]: dns_zone_load: zone siyongc.domain/IN: loading
master file siyongc: unknown class/type



如下的问题,那可能是您没有定义 SOA 记录,或设定有错误:

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could
not find NS and/or SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has
0 SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no
NS records



下面的问题可能是您的 SOA 记录中多输入了一组数字,或少输入了一组数字,或数字格式有错误:

Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could not
find NS and/or SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has
0 SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no
NS records

Nov 16 15:18:24 rh71 named[2562]: dns_rdata_fromtext: siyongc:4: near eol: unexpected
end of input
Nov 16 15:18:24 rh71 named[2562]: dns_zone_load: zone siyongc.domain/IN: loading
master file siyongc: unexpected end of input

Nov 16 15:19:34 rh71 named[2640]: dns_rdata_fromtext:
siyongc:4: near '14B400':
syntax error
Nov 16 15:19:34 rh71 named[2640]: dns_zone_load: zone
siyongc.domain/IN: loading
master file siyongc: syntax error



以下问题可能是 SOA 的 “ ( ) ”符号有问题,要么是“ ( ” 给断到下一行了,要么是“ ) ”给批注掉了:

Nov 16 15:22:08 rh71 named[2669]: dns_rdata_fromtext: siyongc:3: near eol: unexpected
end of input
Nov 16 15:22:08 rh71 named[2669]: dns_zone_load: zone siyongc.domain/IN: loading
master file siyongc: unexpected end of input

Nov 16 15:22:52 rh71 named[2696]: dns_rdata_fromtext: siyongc:4:
near 'IN': extra input text
Nov 16 15:22:52 rh71 named[2696]: dns_zone_load: zone siyongc.domain/IN:
loading master file siyongc: extra input text



以下是您没有设定 NS 记录或 NS 记录设定有错误:

Nov 16 15:25:30 rh71 named[2801]: dns_zone_load: zone siyongc.domain/IN: no NS records



下面的错误可能是您设定了一个记录项超出了当前 ORIGIN 的范围,例如 localhost. 或 siyongc. (也就是错误使用 FQDN );或是错误的使用了 $ORIGIN 设定;或是在 named.conf 中有多个 zone 在分享同一份记录文件:

Nov 16 15:31:20 rh71 named[2920]: dns_master_load: siyongc:16:
ignoring out-of-zone data



下面的错误,有可能您在设定多个 $ORIGIN 并同时尝试设定多个 SOA 时出现的错误:

Nov 16 15:28:31 rh71 named[2855]: dns_master_load: siyongc:26:
not at top of zone



许多许多问题,事实上您都可以在 /var/log/messages 中找到,当您发现这些错误信息之后,看看是关于什么记录的,然后顺藤摸瓜,留心一下档案内容,就比较容易找到错误的原因了。

有时候,您想简化您的 DNS 设定工作,您可以使用 netconf 来做。不过,根据我的经验是:netconf 未必能够完全帮您正确的设定起来。当您重新启动 named 之后,别忘了看一下 /var/log/messages ,确定没有错误发生。如果您使用工具来设定 DNS 而碰到问题,这就需要您有手工设定的能力了。



设定 DNS Client

DNS 系统是一个典型的 Client/Server 架构,前面介绍的动作仅是确保 DNS 的 server 成功启动起来而已,如果您要测试它,还必须设定好 client 端才行。

不知道您会不会设定 linux 的 dns client 呢?如果忘记了要打屁屁了哦~~~ 事实上我们在第一章的“网络设定”那里就设定过了,也就是修改 /etc/resolv.conf 这个档案,将您刚设定好的 DNS 主机 IP 放在档案的前排位置,如:

nameserver192.168.100.23
nameserver168.95.1.1
nameserver139.175.10.20
domainsiyongc.domain
searchsiyongc.domain dmz.domain test.com



假如您的 client 和 server 在同一台机器上,那可以将第一个 name server 设定为 0.0.0.0 或 127.0.0.1 。

要是您使用 Windows ,但不是透过 DHCP 来指定 DNS 的话,那您或许需要手工设定了:控制台 --> 网络 --> TCP/IP (-> 网络卡) --> 内容 --> DNS 组态 :



请注意:如果您修改了这里的设定,就算您的 Windows 是透过 DHCP 取得 IP 设定的话,也会以这里的设定为准。如果您想使用 DHCP 的设定,那就选择“关闭 DNS”吧。



测试 DNS

要测试我们的设定是否生效,我们可以使用的方法有很多,其中最简单的莫过于 ping 命令了。直接 ping 一下您所预期的 dns 名称就知道结果了。

不过,ping 毕竟很有限,例如:您不能查询 MX 和 NS 等记录。实作上,我们最最常使用的 DNS 查询工具是 nslookup 命令。关于 nslookup ,在“学习网络”的“DNS 协议”文章中有很详细的例子,这里不再重复。如果我们在测试中失败,例如 nslookup 响应说:

*** rh71.siyongc.domain can't find XXX.XXXX.XXXX:
Non-existent host/domain



这通常是反解记录没设定好的缘故,请确定 DNS 主机本身的反解有设定起来,而且可以被 DNS 追查得到。如果反解没有授权下来,那就请上游 ISP 帮忙设定。不过,我发现这个错误信息似乎在新版的 nslookup 中不会出现,anyway ,请您自己留意吧。

有时候 nslookup 会停在某处一动也不动,其实它不是当掉了,而是在查询没结果之后等 time out 而已。您可以按 Ctrl + C 终止查询,再打 exit 跳出来。不过,如果您在按了 Ctrl + C 之后接着再输入一个无结果的查询,那就好可能将 nslookup 当掉。这样您可能要登录进另外一个 terminal ,然后用 kill 将 PID 杀掉。同上,新版的 nslookup 没有这个困绕,但如果按 Ctrl + C 的话,则会直接跳离 nslookup 程序。

然而,nslookup 似乎在以后的版本中不再维护了,取而代之的,就是 dig 命令,所以,当您在 Redhat 7.1 上输入 nslookup,您会看到如下这样的信息:

Note: nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead. Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.



这段文字不用解释了吧?真的不知道说什么就查字典吧~~ 这里,我们不妨学习一下如何用 dig 来查询和测试 DNS 服务。

基本上,dig 命令的语法如下:


dig [@server] domain [] [] [+]
[-] [%comment]

看起来蛮复杂的,恐怕要 man dig 才知道怎么使用。不过,我们平时只用它来查询 dns 数据的话,要使用到的选项也不会太多啦,如果您会得在 nslookup 中设定 type=XXX 的话,那您也可以用 dig 来查询不同的记录类别数据。例如:

# dig siyongc.domain mx

; <<>> DiG 9.1.0 <<>> siyongc.domain mx
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8198
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;siyongc.domain. IN MX

;; ANSWER SECTION:
siyongc.domain. 86400 IN MX 20 lp64.dmz.domain.
siyongc.domain. 86400 IN MX 10 rh71.siyongc.domain.

;; AUTHORITY SECTION:
siyongc.domain. 86400 IN NS lp64.dmz.domain.
siyongc.domain. 86400 IN NS rh71.siyongc.domain.

;; ADDITIONAL SECTION:
rh71.siyongc.domain. 86400 IN A 192.168.100.23
lp64.dmz.domain. 86400 IN A 10.0.1.130

;; Query time: 8 msec
;; SERVER: 192.168.100.23#53(192.168.100.23)
;; WHEN: Fri Nov 16 21:13:18 2001
;; MSG SIZE rcvd: 138



上面是的命令是使用预设的 name server 来查询 siyongc.domain 的 mx 记录。当然,您也可以用 @ 来指定用某一台 name server 来查询其它的信息。例如,我要用 hinet 的 dns 来查询负责 com.tw 的 NS 有哪些:

# dig @168.95.1.1 com.tw ns

; <<>> DiG 9.1.0 <<>> @168.95.1.1 com.tw ns
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33339
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4

;; QUESTION SECTION:
;com.tw. IN NS

;; ANSWER SECTION:
com.tw. 518400 IN NS b.twnic.net.tw.
com.tw. 518400 IN NS c.twnic.net.tw.
com.tw. 518400 IN NS a.twnic.net.tw.

;; ADDITIONAL SECTION:
b.twnic.net.tw. 159497 IN A 192.72.81.200
c.twnic.net.tw. 159497 IN A 168.95.192.10
a.twnic.net.tw. 159497 IN A 163.28.1.2
a.twnic.net.tw. 159497 IN A 140.111.1.2

;; Query time: 167 msec
;; SERVER: 168.95.1.1#53(168.95.1.1)
;; WHEN: Fri Nov 16 21:17:46 2001
;; MSG SIZE rcvd: 146



除了用 nslookup 和 dig 之外,如果您只想简单的查询 dns 信息的话,那您可以用 host 命令。例如:

# host -t any siyongc.domain 0.0.0.0
Using domain server:
Name: 0.0.0.0
Address: 0.0.0.0#53
Aliases:

siyongc.domain. SOA rh71.siyongc.domain. root.rh71.siyongc.domain. 2001111601 28
800 14400 3600000 86400
siyongc.domain. name server lp64.dmz.domain.
siyongc.domain. name server rh71.siyongc.domain.
siyongc.domain. mail is handled by 10 rh71.siyongc.domain.
siyongc.domain. mail is handled by 20 lp64.dmz.domain.
siyongc.domain. has address 192.168.100.23



上面的命令就是用本机 name server 来查询 siyongc.domain 的 any 信息。至于 host 命令的格式如下:


host [-aCdlnrTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait]
name [server]

老话啦,看 man host 以了解那些参数和选项的用法吧。

您可以发现:透过 nslookup 、 dig 、与 host 命令,事实上可以查询到许多 dns 上面的设定信息。所以,如果您的 DNS 是对外提供服务的话,请尽量尽量控制 DNS 信息量,如果您觉得没必要对外提供的,那就拿掉它。无论如何,关于内部网络的 DNS 信息,是绝对不能对外散布的。如果查询的结果未如您所预期的,您就要进行 debug 工作了。



注册 domain

Okay,相信到此为止,您已经能够在单一的 dns 上面设定一个或多个 domain 的正解和反解服务了。这时候,您或许早已迫不及待想注册一个属于自己的 domain 来玩玩看吧?

呵呵~~ 有此冲动绝对正常,尤其现在的 domain 注册那么方便和便宜,前几天在‘讨论园地’得知原来现在注册一个 .com 或 .org 的网站,一年都不用 $10 块美金!实在是便宜得令人难以至信~~~ 如果您贪图方便的话,可以请任何一家网络公司代您申请 domain (当然需额外的服务费);要不然呢,也可以直接到网络上完成自己的 domain 注册。

不过,要注册自己的 domain 之前,有些条件您还是要准备好的:


还没被注册走的 domain 名字;
贵 domain 的拥有人、负责人、发票人、管理员 之姓名、住址、和联络数据(皆英文);
管理贵 domain 的 ns 主机,必须有固定 IP (最少要两台,可请别人代管);
合法有效的信用卡,而且您愿意在网络上使用它。

当您这些条件都符号之后,可以联机到网络上的著名 domain 服务网站,例如:


http://www.netsol.com/
http://www.dotster.com/
http://www.godaddy.com/
http://www.twnic.net/

当然,还有很多很多~~~ 而最后一个网站是负责台湾的 domain 注册的机构,您可以到那里注册所有以 tw 结尾的 domain,除了 twnic 之外,很多 ISP (例如 seednet )也有提供 tw domain 的注册服务。

各网站的注册手续和表格或许不尽相同,但基本上您需要提供的信息还是大同小异的,我这里就不介绍如何进行了,只要您身边有字典都没问题啦~~~ 在您所提供的信息中,其中有一项比较伤脑筋的,就是 ns 主机要指向哪里?(注册时需要最少两台)

以正规的手续来说,如果您要用一个 IP 来作为您的 name server,您必须先要将这个 IP 在 whois 数据库中注册为 NS 记录才能使用,假如该 IP 或是该 NS 已经注册过了,您就不能按您的意思来注册了,但您可以使用它(当然您要确定您能管理那台注册主机,或是获得对方的管理员同意)。但我这里告诉您一个秘诀: 第一次注册 domain 的时候,随便设定都可以!(哦,这是我在 dotster 上面的经验啦,其它网站是否如此我就不清楚了~~) 然后您在完成注册后,用您的账号进去修改 name server 的 IP 就可以了(当然,您要设定的 IP 必须还没被注册过,或已经从 whois 数据库中注销)。

然而,如果您日后要变更您的 NS 和 IP 的话,是很麻烦的一件事情!而根据我以往的经验,您最好用 email 和网站的支持人员取得联络,才能顺利完成修改。嗯,这种工作实际上一点也不好玩啦,而且各网站有各自的方法和表格。比方说,如果您透过 networksolution 注册的话,日后您要修改 name server,必须填写 host FORMs,然后会根据您提供的确认方式确认之后才能完成,他们的确认方式有三种:


MAIL FROM:以您所提供的 email 信箱为依据;
CRYPT-PW:以您提供的密码为依据;
PGP:以您的 PGP 签名为依据。

不过,在实作流程上非常复杂,比方说,如果原本采用 MAIL FROM 方式,但后来您的 email 信箱却变更了,那就很麻烦了,因为对方不能根据您的新 email 信箱来作为确认依据的。我曾经为所服务的公司修改过 NS 记录,到最后,只能以 fax 的方式来解决。

而像 dotster 网站,则只能透过账号进行在线修改。这原本很方便,但最不好的地方是:他们不提供确认信息!往往,您以为已经修改完毕,但等了一个星期还没生效,去信问他 们,才知道原来要修改的那个 IP 并没有注册为 ns 主机,或已经注册在别的名称下面了。我曾经数次写信给 doster 的 support 信箱,要求他们在在线修改后要向用户提供确认信息(不管成功与否),但不知道他们现在是否有改善了呢?(如果还没改变的话,请大家多作投诉,直到他们提供 确认服务为止。)


Tips:如果您在 dotster 或其它网站修改 NS,而不能成功的话,请穷追他们的 support 信箱就是了。通常他们都会帮您搞定的,而且提供的信息比较满意。例如,如果您要修改的 IP 还没注册,他们会帮您完成注册(注意哦,name server 的 host 注册和您的 domain 注册可是不同的哦~~)。

但我也曾经试过到 networksolution 上面注册一个 new host,然后到 dotster 那边修改,也能顺利完成!但这个后门,不知道现在是否还行得通呢?


说实在,就算您注册了 domain,如果您没有固定 IP 的话,最好不要自己管 DNS ,请别的有固定 IP 的朋友帮忙,或是付费请人代管就是了。而上面提到的 domain 网站,大都提供这样的服务。

另外,还有一个概念或许是许多 DNS 新手容易搞混乱的:我们这里所说的 domain 注册,在整个 DNS 系统中,仅属于“正解”方面的注册和授权而已;这和“反解”的授权毫不相关。而反解的授权,因为是跟据 IP 授权的,所以必须透过您的 IP 发放机构进行。换句话说:反解的授权,只能透过 ISP 进行。请您一定要区分这两种授权模式。



关于 Dynamic DNS

如果您还没有固定 IP 而又想让别人能够透过 DNS 来查询主机的话,您可以到网络上申请所谓的‘动态 DNS ’服务,大部份都是免费的,而且也有多种平台的 client 程序提供。如果您有兴趣,可以找到很多这类网站,下面只是其中两个:


http://www.dyndns.org/
http://dns2go.deerfield.com/
http://www.adsldns.org:8080/service.php (中文)

如果您不知道如何申请和安装这类动态 DNS 的话,您可以参考如下网页:


Steven 计算机世界 之“Linux 使用 ADSL (计时制) 的经验分享”
鸟哥的 Linux 与 ADSL 文件 之 “动态 DNS 申请 ”

Tips:如果您使用拨接式 ADSL (PPPoE) 并在 adsldns.org 上面完成注册之后,您只需在 /etc/ppp 目录下面修改一个 ip-up.local 档(如果没有请自行建立),增加如下内容:

#!/bin/bash
CMD="http://www.adsldns.org:8080/clientupdate.php/
?email=XXXXX@XXXXXX&passwd=XXXXX/
&hostname=XXXXXX.adsldns.org&debug=1"
lynx -dump $CMD > /tmp/adslclient.log



(注意:请将 XXXXX 修改为您的正确数据。同时,首两行结尾的 / 符号不要漏了,其左右没空白;要不然,拿掉 / 符号并将前面三行写成一行。)

然后,只要您完成 ADSL 拨接之后,就能‘自动’的帮您修改 IP 记录了!


关于动态 DNS 的应用,除了上述的环境之外,在 DHCP 分配的网络中设定 DNS 也可以应用得上。但前提条件是:您的 named 必须是 bind 9.x 或以后,以及 dhcpd 必须是 3.x 或以后的版本。然而,RedHat7.1 上面预装的 dhcpd 是 2.0p15-4 这个版本,您必须自行升级才能使用这个非常棒的功能。

下面,我将 dhcp 服务转移到 mandrake 8.1 (其预装的 dhcpd 版本是 3.0-0.rc12.1),然后保留 named 在 rh71 上面,再透过 ddns 技术更新和维护 dhcp 所发放的 DNS 数据。我初步整理出来的步骤如下:


在 mdk 上执行如下命令,产生 dns 加密验证所需的 secret :

dnssec-keygen -a HMAC-MD5 -b 128 -n HOST DHCP_MDK


这样会在当前目录下产生两个以 Kdhcp_mdk 开头的档案,有兴趣您可以看看其中的内容。然后您将 Kdhdp_mdk*.private 中的最后一行 Key: 后面那串字符串复制下来 (如:4sxutdFuNMqF1B0Q2GV1uQ==),待会要用到。


然后修改 /etc/dhcpd.conf 的内容,类似如下:

ddns-update-style ad-hoc;# 这行一定要加上

subnet 192.168.100.0 netmask 255.255.255.0 {
......# 其中内容略,请自行填写
}

key DHCP_MDK {
algorithm HMAC-MD5.SIG-ALG.REG.INT;# 加密算法名称
secret 4sxutdFuNMqF1B0Q2GV1uQ==;# 这就是上一步骤产生的 key
}

zone siyongc.domain. {
primary 192.168.100.23;# 指向 name server 所在地址
key DHCP_MDK;# 必须和前面的 key 名称一致
}

zone 100.168.192.in-addr.arpa. {
primary 192.168.100.23;# 同上
key DHCP_MDK;
}



然后重新启动 dhcpd 的服务,并确定其功能正常。关于更多的设定,请 man dhcpd.conf ,搜寻 ddns 子串就可以找到。


然后转移到 rh71 上面,修改 /etc/named.conf ,在 options 前面加上如下句子:

key DHCP_MDK {// 这段应该和 dhcpd.conf 设定一致
algorithm HMAC-MD5.SIG-ALG.REG.INT;
secret 4sxutdFuNMqF1B0Q2GV1uQ==;
};

logging {// 这是记录设定
channel update_debug {
file "/var/log/update-debug.log";
severity debug 3;
print-category yes;
print-severity yes;
print-time yes;
};
channel security_info {
file "/var/log/named-auth.info";
severity info;
print-category yes;
print-severity yes;
print-time yes;
};

category update { update_debug; };
category security { security_info; };
};



然后再为相应的 zone 加上 update 设定:

zone "siyongc.domain" {
type master;
file "siyongc.domain";
allow-update { key DHCP_MDK; };// 名称必须和前面的 key 一致
};
zone "100.168.192.in-addr.arpa" {
type master;
file "192.168.100.rev";
allow-update { key DHCP_MDK; };// 同上
};



然后建立所需的记录文件:

touch /var/log/update-debug.log
touch /var/log/named-auth.info
chown named.named /var/log/update-debug.log
chown named.named /var/log/named-auth.info


完成后请重新启动 named ,并检查 /var/log/messages 及测试服务是否正常。


最后,就是等待记录更新了~~~ 哦,我忘了准确的更新时机了,我在某处看到过(记不起来了:家里的书?书局的书?网络上?):更新的时机好像是 dns 那边累积 100 了一百个记录在 journal 的时候;或是每隔 60 分钟 (哪个标准先到达就采用哪个方法,不过,真的记得不是很清楚)。如果您在 /var/named 的记录文件下面发现更新(标志其一是 Serial 号码),或是在 /var/log/update-degub.log 上看到有记录。那就成功了!


如果一直没动作怎么吧?呵呵~~~ 我也不知道。但我会建议您将 /etc/dhcpd.conf 、named.conf、和 /var/named/ 的记录文件尽量简化,将那些有的没的全部拿掉,并重新启动服务看看。当然了,/var/log/ 里面记录文件也有很多重要信息,比方说提升 named.conf 里的 debug level 数值(如:severity debug 9 ),然后执行:

tail -f /var/log/update-dbug.log


再不然,用 tcpdump 抓封包看啰~~~


老实说,我原本写这篇文章的时候并没有打算将 dhcp + dns 的动态更新写进来的,因为还没实作过。幸得在新闻组上得到 小州兄 的指点,才装了个 Mandrak8.1 ,并按 man page 的步骤设定起来的。我觉得在本机上更新,也就是 dhcpd 和 named 都在同一台机器上,会比较容易成功。如果跨网络进行的话,那您得要首先解决网络想过的问题,例如路由和防火墙这些设定。

Anyway,我不敢保证您能按照上面的步骤实作出来,总要自己多尝试尝试吧。如果您想更进一步了解 DNS 的动态更新,您可以研究一下 nsupdate 这个命令。它可以让您以交谈模式来更新 named 的记录设定。


Tips:我知道许多所谓的动态 dns 服务,大都会于 server 上提供更新机制,我猜,只要透过简单的 cgi 或 client 程序,就应该可以完成的。看完下面 Leo 兄的文章,您应该会有灵感的:




动态 DNS 设定技巧

除此之外,如果您还有兴趣研究动态 DNS 技术的话,不妨到网络上找找 IXFR 的技术,也可以参考如下这些 RFC:1034,1995,1996,2136,2535,2694。

设定 master / slave

不管您是否有打算注册自己的 domain 和管理自己的 DNS 主机,在您真正架设对外服务的 dns 服务器之前,请先行在内部网络架设看看,直到您有信心之后才架设直接向 Internet 提供服务的 DNS 。而您需要练习的这些前置功夫中,其一就是 master 与 slave DNS 的设置。

假如您真的到网络上注册过 domain,他们通常需要您提供最少两台 NS 主机。为什么呢?这是基于备援考虑的。当一个注册 domain 同时授权到两台 ns 上面管理的话,那别人透过 DNS 查询的时候,会获得两个 NS 记录( root zone 就有 13 个 ns 之多!)。对方只需向其中一台进行查询就可以了,如果第一台不能成功的话,则转向下一台。究竟向哪一台 NS 查询,其先后顺序没什么关系,但关键的是数据的准确性!

在前面您已经知道如何在单一的主机上面进行 DNS 设定了,那么,当有两台主机需要为同一个 domain 提供 DNS 服务的时候又如何设定呢?您当然可以在两台主机上各设定一次。但数据的同步呢?您总不能在一台 NS 查询到一个 IP 地址、而在另一台 NS 得到另外一个地址吧?如果发生数据变更需求的时候,您也得同样的在两台机器上面进行修改,而且必须透过人为的观测,以确定双方的数据一致性。那~~ 是否有更好的办法来做到这点呢?

当然有啦,这就是 master 和 slave DNS 的设定了。透过 master 和 slave 的架构,您日后要进行数据变更的时候,只需在 master 上面维护就好,然后 slave 会定期的自动过来将更新数据同步回去(还记得 SOA 那堆数字的吗?您应该知道 Refresh 和 Serial 的作用吧?如果您忘记了,请回去温习一下)。

如果您没有理解错误,应该知道 slave 会在 refresh 时间到达的时候,就尝试和 master 进行数据同步的动作,这在 DNS 系统里面有一个专门术语,叫做“zone transfer”(区域转移),而在技术层面来说,则是 AXFR 查询:


当 slave 需要进行 zone transfer 之前,它首先查询 master 的 SOA 记录之 serial 数值;
如果发现数值比 slave 上的 serial 要大,就送出 AXFR 查询;
如果 master 允许 slave 的 zone transfer ,那就响应 AXFR 的查询结果;
然后 slave 根据查询结果更新自己的记录文件。

从上面的流程来看,您不难发现 serial 在整个区域转移过程中的重要性。所以,您每次修改了 master,一定要将增加 serial 数值。虽然,您可以依序的增加数值,但如果您的 Serial 号码是依照“日期 + 修改次数”格式的话,那么您只要修改日期部份,就肯定可以获得一个更大的数值(除非您又碰到 Y2K 的问题 );假如您的修改是在同一天发生的,那您可以修改最右边的两为数字(相信您一天之内不会修改 100 次吧?)。

要设定 slave DNS 其实非常简单,简单到或许您不相信!真的没骗您,您只需在 slave 主机上面的 /etc/named.conf 增加这几行就可以了:

zone "siyongc.domain" IN {
type slave;
masters { 192.168.100.23; };// 请不要漏了 masters 后面的 s !
file "slave.siyongc.domain";
};



一点也没错!就这么简单~~~ 我们假设上面的设定在 10.0.1.130 ( lp64 ) 上面进行,而 master 则是 192.168.10.23 ( rh71 )。这里,我再告诉您一个您非常乐意听到的信息:您根本无需担心如何建立 slave 的记录文件,named 会自动帮您搞定!您只需确定 /var/named 这个目录能够被 named 写入就行了。如果您不确定,那只需将目录的 owner 改一改就行了:

chown -R named.named /var/named


这样的话,只要 slave 的 refresh 时间到达,就会自动的帮您更新记录数据了(当然了,底层的路由和联机必须是畅通无阻的)。但是,每次当您修改了 master 上面的设定并重新启动 named 服务的时候,master 就会主动向资源记录当中的所有 NS 主机送出 NOTIFY 信号(自己除外,但 master 的 NS 记录必须是第一笔)。当 slave(s) 收到来自 master 的 NOTIFY 之后,会回复一个确认给 master ;然后根据 /etc/named.conf 档案中的设定,尝试向所定义的 masters 地址进行 zone transfer (是否要更新数据,当然还必须以 Serial 为依据),就好像 refresh 到达了一样。


Tips:假如您发现修改 master 后并不能及时同步 slave 上的数据,那可能是 slave 并没写在 NS 记录上。如果您不愿意修改 NS 记录,那您可以在 master 的 named.conf 里面的 zone 设定上加上这几行:

zone "siyongc.domain" IN {
type master;
file "siyongc.domain";
notify yes;
also-notify { 192.168.100.26; };
};



这样,master 在修改后同时还会通知名单中的 slave 主机。

事实上,如果有别的 slave DNS 被设定为指向该这台 master 的话,就算您这里将 notify 设为 no ,当 slave 主机的 refresh 到期的时候,还是可以进行区域转移 (zone transfer) 的。

当然了,为了防止别人任意的向 master 进行 zone transfer 而盗取 zone 数据,named 还允许您以 acl (Access Control List) 来控制哪些主机才能上来进行区域转移(这个我们后面再谈),同时,还允许 zone transfer 的时候以加密的方式传送数据。


除了上述的备援需求外,在其它情形也有可能需要 master / slave 的架构。比方说,您有一个很大型的网络,如果所有主机都集中向 master 进行 DNS 查询,那势必会增加 master 的工作负荷、而降低其效能,同时也产生额外的远程网络流量。这时,您最好设定多台 slave 放置在不同的地点来分担 master 的工作,同时也能提供备援服务。



设定 forwarder

我们除了能够用 slave 来分担 master 工作、减少网络流量之外,还可以透过另外一种 DNS 机制来减低网络流量的,那就是 forwarder 设定了。

所谓的 forwarder ,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 之查询请求的时候,将不直接向 root zone 查询而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。如果您不了解 DNS 的查询模式,那您很难理解这个 forwarder 的意义和好处。

我们知道,当 NS 主机在接到 client 的查询的时候,首先会检查这个查询是否属于本机管辖,否则将转向 root zone 再逐级的查询下去,最后将结果告诉 client 。而在这个过程之中,NS 主机还会将每一笔结果存放到 cache 中。这样,只要 cache 中的 TTL 没过期的话,在下次遇到同样查询的时候,就可以直接将结果响应给 client 了,而无需再重复上次的查询流程。如果 NS 上面指定了 forwarder,那这个 NS 发现 cache 没有记录的话,将不向 root 查询,而是将自己扮成一个 client,向 forwarder 送出同样的请求,然后等待查询结果;而逐级往下查询的动作,则交由 forwarder 负责,NS 自己就轻松多了。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,NS 都会保存一份数据在 cache 中。这样,其后的相同查询就快多了,这对于 NS 所服务的 client 而言更是有效率得多。

但是,假如您仔细研究一下这个 forwarder 机制,您会发现它的好处并非仅是上面所提到的效能提升,而且,对于整个网络流量(尤其是对外的流量)也有非常正面的帮助。比方说,您的内部网络需要 10 台 DNS 来提供服务,您只需在某一台能直接与外界沟通的计算机上架设 DNS 服务,然后将其它内部 NS 的 forwarder 指向该主机就行了。这样,本来需要 10 次的 root 查询,在 forwarders 的机制下,就只需 1 次而已!连同下层的往返查询来计算的话,总体上所省下的对外查询就更多了~~ 如果再加上 cache 的效能,forwarder 所降低的 DNS 流量是非常显著的。

事实上,forwarder 在我们的实际应用中也很常见,例如,我们只要将 forwarder 设定为 ISP 的 DNS ,那么,我们的 NS 就无需直接向 root 查询了;又因为 ISP 上的 DNS 也有 cache 的关系,所以我们的 NS 所获得的查询结果,也比直接向 root 查询来得要快。

如果您打算使用 forwarder 的话,您可以在 /etc/named 的 options { } 里面加入这样的句子:

forward first;
forwarders {// 别漏了最后的 s !
139.175.10.20;
168.95.1.1;
};



您或许从上面的设得知的这台 NS 主要是对外联机的,假如您的主机是内部的其它 NS,那就集中指向对外的 NS 就好了。

然而,上面的设定由于是在 options 里面设定的缘故,这样会让所有非本机的查询都转向 forwarder 。假如您不想这样做,而只是针对个别的 zone 设定 forwarder 的话,那您也可以这样设定:

zone "siyongc.domain" IN {
type forward;
forwarders { 192.168.100.23; 10.0.1.130; };
};



这样,在这台 NS 主机上面,所有关于 siyongc.domain 的查询,都将转交到 192.168.100.23 或 10.0.1.130 那边去。

你可能感兴趣的:(linux系统管理)