架设DNS技术示例

由 北南南北 在 05-05-2002 11:47 发表:

架设DNS技术示例

架设 DNS

在 Linux 上面﹐执行 DNS 程序是叫BIND﹐ 但我们一般称它的服务程序为﹕named 。

设定NAMED

如果您在 NT 下面设定过 DNS 服务器﹐相信您会觉得在 Linux 下面难多了。除了概念上要比较清楚外﹐另外对档案的关联也要有清晰的追踪能力﹐这对于进行 debug 尤为重要。

下面﹐让我们设定一个最重要的 dns 设定档﹐它就是 /etc/named.conf 。我将我自己的设定档案列出来﹐然后逐部份进行解释﹕ // generated by named-bootconf.pl

options {

directory "/var/named";

/*

  • If there is a firewall between you and nameservers you want

  • to talk to, you might need to uncomment the query-source

  • directive below. Previous versions of BIND always asked

  • questions using port 53, but BIND 8.1 uses an unprivileged

  • port by default.

*/

// query-source address * port 53;

};

首先﹐在这个设定档上﹐用来做批注的符号是“//”﹐而不是一般 shell script 的“#”﹐而“/”与“/”之间则批注一整段文字。另外﹐一个完整的句子都以“﹔”结尾。

在这个档案开头部份的 options 里﹐首先指定了 named 的记录文件目录为﹕“/var/named”﹐也就是说﹐它会到这个目录下面寻找 DNS 记录档案。所以﹐我们在这个档案后面部份所指定的档案﹐就无需使用绝对路径了﹐但它们一定要放在这个目录下面。

接下来﹐有一段文字﹐如果您仔细阅读一下﹐它大致是说﹕如果您要设定的 DNS 服务器和 client 之间是隔着火墙的话﹐要将“// query-source address * port 53;”前面的批注符号“//”拿掉。当然﹐您也必须要设定好您的火墙啦。

接下来的句子﹕ //

// a caching only nameserver config

//

zone "." {

type hint;

file "named.ca";

};

这几行﹐我们为 named 指定了 DNS 系统中的根目录“.”(root zone)的区域记录文件为﹕“named.ca”﹐也就是“/var/named/named.ca”档案了。同时﹐还指定了 zone 的类别为﹕“hint”﹐也只有这个 zone 会使用这样的类别。虽然 named.ca 这个档案中的‘ca’是 cache 的意思﹔但如果您了解 DNS 的运作﹐就应该知道这个暂存盘的作用﹐同时﹐为什么我们会把 root zone 放在这里。

上面的句子﹐当您安装好系统之后就被建立起来的﹐相信您不用劳什么心力。然而﹐接下来的句子才真正是您要设定的开始。一般来说﹐我会先设定“反查询区域(revers zone)”﹕ zone "0.0.127.in-addr.arpa" {

type master;

file "named.local";

};

zone "0.168.192.in-addr.arpa" {

type master;

notify no;

file "named.192.168.0";

};

zone "1.168.192.in-addr.arpa" {

type master;

notify no;

file "named.192.168.1";

};

这里﹐我一共指定了三个反查询区域﹐它们都有一个识别标志﹕“ .in-addr.arpa ”。在设定反查询区域的时候﹐您一定要将您的 net ID 部份反过来写。例如﹕我的网络为192.168.0.0/24 ﹐它的反查询区域名则是﹕“0.168.192.in-addr.arpa”﹔如果我将 netmask 改为16bit﹐即192.168.0.0/16﹐它的反查询区域名就会变成﹕“168.192.in-addr.arpa”。如果您还搞不懂如何区分 Net ID 和 Host ID﹐请立即去看一看“网络基础”中的“IP基础”。

或许您还发现我为上面的 zone 加入了“ notify no ”这个叙述。为什么呢﹖因为﹐我这里设定的 DNS 是没有向 InterNIC 注册的﹐而且大部份使用私有IP地址。这行则会禁止我这里设定的 DNS (主动)向外面散播 DNS 信息。

同时﹐我将这些 zone 都设定为“主 DNS 服务器”(即﹕master﹐也有人称之为 primary)。事实上﹐如果有别的 slave DNS 指向该这台 master 的话﹐虽然将 notify 设为 no ﹐slave 主机还是可以用 pull 的方法来进行区域转移 (zone transfer)。当然﹐您也可以用 push 的方式进行转移﹕ notify yes;

also-notify {

203.30.35.161; };

在每个 zone 的最后部份﹐我分别指定了它们各自的记录文件名称。它们都存放在 /var/named 这个目录下面﹐也就是前面 options 指定的 directory 啦。档案的名称随您喜欢﹐不致做成混乱则可。

当反解 DNS 指定好之后﹐我们就要设定正解 DNS 了﹕ zone "siyongc.domain" {

type master;

notify no;

file "named.siyongc.domain";

};

zone "home" {

type master;

notify no;

file "named.home";

};

zone "virtual.test" {

type master;

notify no;

file "named.virtual.test";

};

zone "test.domain" {

type master;

notify no;

file "named.test.domain";

};

zone "siyongc.domain.nt" in {

type slave;

file "slave.siyongc.domain.nt";

masters { 192.168.0.20;

};

};

和反向查询区域一样﹐它们也有着各自的记录文件。另外﹐您或许已经发现﹕最后一个 zone 类别为 “ slave ” ﹐另外我还为之指定了它的 master DNS主机的 IP 地址。Slave 主机也有人称之为 secondary DNS。当您有一个很大的网络需要 slave 来分担 master 服务﹐或是需要多台 DNS 提供备份服务 (如申请 domain name 时就需要提供两台 DNS)﹐使用 slave 就非常方便了。

好了﹐现在﹐请回顾一下 /etc/named.conf 这个档案﹐将所有各 zone 的记录文件名称抄下来﹐我们要逐一将它们设定好。

先让我们转到 /var/named 这个目录吧﹐然后 输入 ls -l 看一看。最少﹐您应该会看到 named.ca 这个档案的﹐如果它不存在﹐用下面的内容建立一个吧﹕ . 3600000 IN NS A.ROOT-SERVERS.NET.

A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4

. 3600000 NS B.ROOT-SERVERS.NET.

B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107

. 3600000 NS C.ROOT-SERVERS.NET.

C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12

. 3600000 NS D.ROOT-SERVERS.NET.

D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90

. 3600000 NS E.ROOT-SERVERS.NET.

E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10

. 3600000 NS F.ROOT-SERVERS.NET.

F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241

. 3600000 NS G.ROOT-SERVERS.NET.

G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4

. 3600000 NS H.ROOT-SERVERS.NET.

H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53

. 3600000 NS I.ROOT-SERVERS.NET.

I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17

. 3600000 NS J.ROOT-SERVERS.NET.

J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10

. 3600000 NS K.ROOT-SERVERS.NET.

K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129

. 3600000 NS L.ROOT-SERVERS.NET.

L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12

. 3600000 NS M.ROOT-SERVERS.NET.

M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33

这里一共列出了 13 个 root zone 名称服务器的名称﹐和它们各自的 IP 地址。‘ 3600000 ’是 TTL(Time To Live) ﹐也就是在快取中保留的时间。‘ IN ’表示这是一个 internet 地址类型﹔‘ NS ’是“Name Server”的意思﹐是 DNS 记录名称之一。有时候﹐同一个区域可以由多个 NS 管理﹐这里的‘.’区域就一共有 13 个 NS 啦。 ‘ A ’呢﹖也是一个 DNS 记录名称﹐代表一个Host﹐它所对应的的通常会是主机名称和 IP 地址。(关于更多的记录名称﹐请参阅“网络基础”中的“DNS 协议”)。

除了刚才的 named.ca 之外﹐您还应该会看到一个 named.local 吧﹖如果您还没忘记 /etc/named.conf 的内容的话﹐应知道这个档案是 zone "0.0.127.in-addr.arpa" 的记录文件﹐它的内容很简单﹕ $TTL 86400

@ IN SOA localhost. root.localhost. (

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

691200 ; Expire

86400 ) ; Minimum

IN NS localhost. ;负责0.0.127.in-addr.arpa.的DNS主机是localhost.

1 IN PTR localhost. ;1.0.0.127.in-addr.arpa.的主机是localhost.

这里﹐我们看到“ $TTL ”这个 option (凡是带有“$”符号的都是DNS记录文件 option)﹐它的值是以“秒”为单位的。然后我们又看到一个特殊字符“ @ ”﹐它是“Origin”的意思﹐如果您喜欢﹐可以用“$ORIGIN 0.0.127.in-addr.arpa.”来代替。也就是说这个记录文件是源自“0.0.127.in-addr.arpa.”这个区域的。如果您使用“@”符号的话﹐它会自动的将区域换成在 /etc/named.conf 所指定的 zone ﹐既然这样﹐当然是使用“@”啦。

“ SOA ”是“Start Of Authority”的意思﹐表示该档案是该区域的授权记录文件。每一个记录文件只能有一个 SOA﹐不得重复﹐而且一定是档案中第一个“记录”。紧接 SOA 后面﹐指定了这个区域的授权主机和管理者的信箱﹐也就是“localhost. root.localhost.”。这里要注意的是﹕主机名称﹐必须要为一个 A 记录 (以后会提到)﹔另外﹐信箱通常使用“user@host”的格式﹐但因为“@”在 DNS 记录中是个保留字符(刚才已经提过)﹐所以这里就用“.”来代替了。

请留心观察记录文件中的主机名称﹐它们最后都是用一个“ . ”结尾的﹐在 DNS 记录中﹐这样的名称我们称为“ 全域名称 ”即 FQDN(Fully Qualified Domain Name) 。如果缺少了这个点会怎样呢﹖就会将所属的“ 区域名称 ”(取值于 @ 或 $ORIGIN)附加在记录名称后面了。也就是说﹕“localhost”会变成“localhost.0.0.127.in-addr.arpa”﹔而“localhost.”就只能是“localhost.”。所以﹐这个小点“.”非常重要﹐在以后设定中一定要非常留神﹗

还有一点我们也不能忽略﹐就是﹕记录文件中的每一列都会被视一个输入单位, 如果句子不是以空白﹑Tab﹑ 或批注符号 ( 开头﹐ 则表示要定义一个新资料项。所以﹐如果您要为一个名称定义好几个记录﹐而不想重复打字﹐您倒可以偷懒﹕在接着它的后面几行用空白或 Tab 来缩排就可以了。您将会在后面看到好多这样的例子﹐但您一定要知道为什么。

接下来在“( )”之间的数字﹐是用来和 slave 服务器更新 DNS 资料使用的数据﹕“ Serial ”的格式通常会是“年月日+修改次序”(但也不一定如此﹐您自己能够记得就行)﹐当 slave 到时候进行资料更新的话﹐会比较这个号码。如果发现在 master 上面的号码比原来的“大”﹐就进行更新﹐否则忽略。不过设 serial 一定要留意的地方是﹕不能超过 10 位数字﹗“ Refresh ”指定的是进行更新的时间间隔。“ Retry ”呢﹐是如果更新失败后进行重试的时间间隔。“ Expire ”是记录逾期时间。“ Minimum ”是最小预设 TTL 值﹐如果您不使用“$TTL”进行指定﹐就会以此值为准。另外﹐您也可以另行为每一行记录设定 TTL﹐只要将数字写在‘IN’前面就可以了。以上的数字都是以秒为单位﹐但您也可以用 H(小时)﹑D(天)﹑W(星期)来做单位﹐如﹕8H 和 28800 是一样的。(但要格外注意的是﹕如果您日后使用 netconf 这工具来设定 DNS 的话﹐就只能使用数字了。否则 netconf 会自动的把英文字母删除掉﹐那就不是您所预期的设定值了)。如果用秒来设定的话﹐这些规则要遵守﹕

expire >= refresh + retry

expire >= 10 * retry

接下来的“IN”和“NS”已经介绍过了。

最后一行我们看到一个“ PTR ”记录﹐它是“Pointer”的意思。 PTR 只会用于反查询记录当中﹐它是将 IP 和 主机名称对应起来(刚好和 A 记录相反)。我们看这行句子﹕ 1 IN PTR localhost.

所表示的意思是﹕127.0.0.1 所对应的主机名称是 localhost 。句子开头的“1”就是该网域中的 Host ID(以完整的Otec为准)。因为我们用来反向查询区域的 IP 顺序是掉过来写的﹐所以这行记录中的反查询 IP 就是﹕“1.0.0.127.in-addr.arpa.”了。

好了﹐当我们了解这个记录文件的内容之后﹐那么﹐我们就可以着手一一建立起那些在 /etc/named.conf 里面指定的记录文件了。让我们看看其中一个 zone 吧﹕ zone "0.168.192.in-addr.arpa" {

type master;

notify no;

file "named.192.168.0";

};

这是关于 192.168.0.0/24 这个 IP 网络的反解区域﹐从倒数第二行的 file 我们得知这个设定档的名称是 named.192.168.0。也就是说﹐我们现在要在 /var/named 这个目录下面建立起这个档案。我这里的设定是这样的﹕ ; File: /var/named/named.192.168.0

; This is the master sub-net for siyongc.domain, but not the only one.

$TTL 86400

@ IN SOA redhat52.siyongc.domain. netman.siyongc.domain. (

2000032701 ; Serial

28800 ; Refresh

14400 ; Retry

691200 ; Expire

86400 ; Minimum

)

@ IN NS redhat52.siyongc.domain.

;

$ORIGIN 0.168.192.in-addr.arpa.

;

11 IN PTR emilie.siyongc.domain.

15 IN PTR pii266.siyongc.domain.

16 IN PTR w2000ad.siyongc.domain.

17 IN PTR gw.siyongc.domain.

17 IN PTR redhat52.siyongc.domain.

19 IN PTR redhat62.test.domain.

20 IN PTR dellnt266.siyongc.domain.

21 IN PTR xlinux.siyongc.domain.

21 IN PTR alias01.test.domain.

在 DNS 记录文件里面﹐“ ; ”是批注符号﹐以它开始到句子结尾都会被忽略。我们可以用之为档案作些说明。

除了 $TTL 这个 option 我们刚才已经接触过﹐另外一个 $ORIGIN 也是一个 option ﹐前面也略略提到过了。紧接其后宣告的是一个全域名称的 domain name (带 “ . ”的)。如果其后的记录中﹐没有使用 FQDN 的话﹐则这个 domain name 就会附加上去﹔其值会直到下一个 $OROGIN 才改变。这行不是必须的﹐但如果您这台 DNS 机器上同时管理多个 zone 就最好加上去。(看您自己意思办吧)

从上面﹐您会看到管理 0.168.192.in-addr.arpa. 这个区的 NS 服务器是 redhat52.siyongc.domain. 。在 PTR 左边是各机器的 IP ﹐在 PTR 右边则是机器的全域名称。

如果您机器有多个名称的话﹐那么﹐在反解那里是容许一个 IP 有多个 PTR 记录的。不过﹐如果您用 nslookup 的正常模式查询的话﹐却只能看到最后一个记录﹐您要经过 set q=ptr 之后才可以看到全部记录。

当我们将 /etc/named.conf 中所有的反查询记录文件设定好之后﹐接下来﹐就应该进行正解查询记录的设定了。不过﹐您可能很喜欢知道的一件事情是﹕ slave 的记录文件不用设定哦~~~ ﹐只要您的机器能连得上 master 且 master 的 DNS 工作正常就可以了﹐然后记录文件会自动由 named 产生。

和反解一样﹐我这里不一一将所有档案内容列出来了。只挑选了‘siyongc.domain’这个区域进行说明一下﹕ ; File﹕ /var/named/named.siyongc.domain

;

; Zone file for domain﹕ 'siyongc.domain.'

;

$TTL 86400

@ IN SOA redhat52.siyongc.domain. webmaster.siyongc.domain. (

2000032702 ; Serial

28800 ; Refresh

14400 ; Retry

691200 ; Expire

86400 ) ; Minimum

;

IN TXT "A test domain, siyongc.domain., created by Netman"

IN NS redhat52 ;Note: the trailing dot is missing!

IN NS debian.home.

IN MX 10 redhat52.siyongc.domain.

IN MX 20 debian.home.

IN A 192.168.0.17 ; The default IP for domain

;

$ORIGIN siyongc.domain.

;

localhost IN A 127.0.0.1

;

gw IN A 192.168.0.17

IN HINFO "Redhat" "MASQ"

IN TXT "The masquerade gateway for internet."

;

redhat52 IN A 192.168.0.17

redhat52 IN A 203.30.35.137

IN MX 0 redhat52.siyongc.domain. ;pointing to itself!

IN MX 20 debian.home.

IN HINFO "Dell PII 266" "Linux RedHat"

www IN CNAME redhat52

ftp IN CNAME redhat52.siyongc.domain. ;same CNAME

news IN CNAME redhat52

mail IN CNAME redhat52

pop IN CNAME redhat52

smtp IN CNAME redhat52

;

pii266 IN A 192.168.0.15

IN HINFO "PII266" "CWin 98"

;

slware36 IN A 192.168.0.18

IN MX 10 redhat52.siyongc.domain.

IN MX 20 debian.home.

;

rhroute IN A 192.168.0.4

IN MX 10 redhat52.siyongc.domain.

IN MX 20 debian.home.

在这个文件里面﹐‘ TXT ’记录﹐是‘Text Information’的意思﹐它实际上不牵涉任何设定﹐只记录一些环境说明而已﹔这和后面的‘ HINFO(Host Information) ’差不多﹐但后者一定要有两项记录(可以分别用引号分开)﹐其中第一项是关于 CPU 的讯息﹐第二项则是操作系统。

然后﹐因为我这个区域的记录分别由两台主机负责﹐所以我这里指定了两个 NS 记录。不过﹐我在这里偷了一个懒﹕正如我上面解释过﹐如果名称后面不是以“.”结尾的话﹐它所属的区域名称就会自动的加在该记录名称后面。也就是﹕ “redhat52”没有用点结尾﹐就成了“redhat52.siyongc.domain.”了﹐这个名称实际就是我所要的。虽然这并不省很多﹐但对于像我这样的懒人来说﹐却是方便的。

MX 记录

接下来的 ‘ MX ’ 记录恐怕要花些时间解析。 MX 是‘Mail Exchange’的意思﹐它指定了负责该区域的邮件服务器名称(最好使用全域名称)﹐而且该名称必须是一个 A 记录(不建议使用 CNAME)。在邮件系统中﹐只要邮件服务器双方都知道对方的 IP 就可以进行邮件交换了。我们用 /etc/hosts 也可以做到名称查询的目的﹐但正如我们可以想象到的﹕ineternet 这么多邮件服务器﹐我们不可能一一为它们建立好 IP 对应。就算﹐我们可以这样做﹐如果对方要更换邮件服务器呢﹖要维护这样一个对应殊非易事。既然﹐我们可以用 DNS 来查询主机和 IP﹐为什么不使用这么便利的系统呢﹖但问题是﹐各区域的邮件服务器名称都不一样﹐我们也不可能知道对方的邮件服务器主机名称是什么(虽然我们可以用 CNAME 为每一个 zone 建立一个‘mail’名称记录﹐但也不尽然)。就算知道﹐如果对方以后更换名称呢﹖

您看﹐即使我们使用了 DNS 系统来进行邮件路由﹐也不是这么简单的事情。但是﹐使用 MX 记录就大大发挥了 DNS 系统的功能了﹕我们只要为每一个区域建立起 MX 记录﹐指定出用 DNS 查询得到的邮件服务器名称(邮件路由中﹐DNS 只是其中一种方法)﹐这样﹐当邮件服务器要和对方的区域进行邮件传递的时候﹐就可以通过 MX 记录得到对方的邮件服务器名称了。以后﹐就算对方更换名称﹐将 DNS 记录改改就可以了。而外面的邮件服务器﹐根本无需认知到这个改变。

另外﹐使用 MX 还有一个功能﹕您可以用 MX 同时指定好几台邮件服务器名称。在我这个例子中﹐我就分别为‘siyongc.domain’这个区域指定了两个 MX 记录﹕‘redhat52.siyongc.domain.’和‘debian.home.’。但您有没有发现它们前面都有一个数字呢﹖这数字有什么作用啊﹖问得好﹗当外面的邮件服务器通过 DNS 查询到我们的邮件服务器﹐如果发现超过一台主机负责邮件交换的话﹐数值越低的就越先被查询。但有时候该主机没有响应呢﹖那么就由下一个数值的主机负责了。这样还有一个好处是﹐就算第一台邮件服务器出现故障﹐也不至于令到邮件交换功能瘫痪掉。虽然我们通常喜欢用‘10’﹑‘20’﹑‘30’.... 这样的偏好值(preference)来分配 MX 记录﹐但只要您喜欢﹐用‘1’﹑‘2’﹑‘3’... 这样的顺序一样可以。

同时﹐您或许发现我也分别为所有 linux 主机指定了 MX 记录。因为在 Linux 机器上面﹐各主机本身就具备邮件交换功能(除非您将之移除了)。这里的设定是﹐从外面通过 DNS 查询寄往那些主机的邮件﹐会转向 MX 上面指定的邮件服务器。注意﹕请不要忽略了这个设定﹐尤其是负责该 domain 的邮件服务器﹐本身一定要有一个偏好值最低的 MX 记录指向自己﹐否则﹐会很容易得到‘loopback’的错误。

虽然前面我们不断的提到过“A”记录﹐或许您还以为会很复杂。但正如您看到的﹐‘A’记录其实最简单不过了﹕“主机名称”对“IP”﹗就是这么简单啦。如果您没忘记反解查询记录的话﹐‘A’记录正好和‘PTR’记录相反就是了。如果您的主机有超过一个 IP 地址﹐您也可以为它指定多个 A 记录。

至于‘CNAME’记录呢﹖它是一个别名记录﹐也就是所有关于 CNAME 左面的名称查询﹐都会转向 CNAME 右面的名称再进行查询﹐一直追踪到最后的 PTR 或 A 名称查询成功﹐才会做出响应﹐否则失败。例如﹐在正解查询中﹐一个 IP 通常(当然也有例外)﹐只会对应一个 A 记录﹐但我们可以使用 CNAME 在 A 名称之上赋予该 IP 更多的名称。也就是说﹕所有关于‘ www.siyongc.domain’或‘ftp.siyongc...in.’这个记录。

您看﹗这样我们就已经设定好一个 DNS 了﹐包括反解和正解哦~~~ ^_^。

如果﹐您打算使用 DNS forwarder 的话 (也就是 DNS 可以将有关外部的 DNS 查询转递给另外的机器﹐例如上一级的 DNS)﹐您可以在 /etc/named 的 options { }里面加入这样的句子﹕ forward first;

forwarders {

203.56.8.1;

203.56.8.2;

};

但是﹐对于刚开始接触 DNS 的朋友来说﹐常常会“硬性的”将反解和正解联系起来。其实在实际的设定中是非常多样化的﹐反解和正解在许多情形下是未必一致对应的。比如我有一组 192.168.0.* 的 C Class IP ﹐我并非只能分配给 siyongc.domain 这一个 domain 。如果我喜欢﹐可以将里面的 IP 分配给好几个 domain 来使用。同理﹐我的 siyongc.domain 下面﹐也未必只能用 192.168.0.* 里面的 IP﹐事实上我还可以使用其它的 IP 。很简单一个例子是﹕我的 redhat52 这台主机﹐就有两个网络卡﹐它们是分别属于不同的 IP 网络的﹐但它可以使用同一个主机名称。

子网设定

如果您真真正正明白到 IP 和 Net mask 的关系﹐这里我要出一道难题了﹕我在我的网络设定中﹐203.30.35.0 这个网络实际上借用了 3 个 bit 来切割成 8 个子网络。而我将这台机器分配到 sub-net ID 为‘100’的这个子网中去﹐也就是说﹐实际的 Net ID 会是‘203.30.35.128’。我的 DNS 也只负责这个子网络的名称服务﹐而其它的子网则由各自的 DNS 去管理。不同的是﹕我这里还负责了各子网的“父网”﹐即‘203.30.35.0’的查询而已。

对于切割子网的 DNS 设定﹐是非常难懂的﹐您一定要对 IP 地址划分有很清晰的了解。在以后的叙述里﹐务必留神﹗如果您不想弄那么复杂﹐最简单莫过于在“父网”上面做好﹑所有子网的记录设定。但问题是﹐如果子网那里要进行变更﹐就一定要劳烦上级网络管理员﹐网络的灵活性当然就大打折扣了。

或许﹐在一开始弄 DNS 的时候就把子网带进来﹐会显得过于艰难。我这里建议您大可先将关于子网的部份略过﹐等对 named 有一定的经验了﹐随时欢迎回来再看﹐也很欢迎和网中人讨论心得﹗

无论如何﹐我先得在 /etc/named.conf 为父网建立起反查询区域﹐如下﹕ zone "35.30.203.in-addr.arpa" {

type master;

notify no;

file "named.203.30.35";

};

然后﹐让我们转到 /var/named 去建立相应的档案﹕ ;File: /var/named/named.203.30.35

;

; This network has been devided by 3-bit sub-net mask.

; All requests will be redirected to the coresponding sub-net NS.

;

$TTL 86400

@ IN SOA redhat52.siyongc.domain webmaster.siyongc.domain. (

2000032703 28800 14400 691200 86400 )

;

;负责35.30.203.in-addr.arpa.(目前反解)的DNS主机是redhat52.siyongc.domain.

@ IN NS redhat52.siyongc.domain.

;

$ORIGIN 35.30.203.in-addr.arpa. ;设定属于当前网络范围

;

;负责子网128 (27 bit mask)的DNS主机是redhat52.siyongc.domain.

128-27 IN NS redhat52.siyongc.domain.

;

;子网中的整组可用 IP 需要转向负责该子网的 DNS 查询

$GENERATE 129-158 $ CNAME $.128-27

;

;

;------------------------------------------------

;如果还有其它子网的话﹐也请一一建立好转向....

;------------------------------------------------

;

;例如﹕另一子网(也是27 bit) 160.35.30.203.in-addr.arpa. 的设定﹕

160-27 IN NS dns.sub.siyongc.domain.

$GENERATE 161-190 $ CNAME $.160-27

;

;

;[以下略...]

;

这个例子有三个 NS 记录﹐第一个是本身区域的名称服务器﹔而第二个则指定了 128. 30.35.203.in-addr.arpa. 这个子网区域的 DNS 服务器为﹕“readhat52.siyongc.domain.”(要留意最后的“.”哦﹗)﹔第三个则属于子网 160 的 NS 。如果还有其它子网目前是运作的﹐各子网的 NS 记录都必须在这个档案里面指定好﹐(就算有些子网使用相同的 DNS 主机﹐也必须如此。)

在这个特殊的“切割子网例子中”﹐因为 134 这个 IP 实际上是子网 203.30.35.128 里面的范围﹐但您不能在 ineternet 上面使用 203.30.35.128.134 这样的 IP 格式的。所以﹐所有以 203.30.35 开头的 IP﹐都会先向 203.30.35.0 这个网络查询﹐然后再通过 CNAME 转向其子网络 203.30.35.128 进行查询﹐直至找到 134 为止。注意﹕在 A 和 B class 网络中的子网划分﹐只要不超过 24bit mask 且使用完整 otec 的话﹐应该无需使用这样的手段。

下面﹐让我们用已经经过切割了的子网 160 来示范一下﹕

首先﹐修改负责该子网的 DNS 主机 203.30.35.161 上面的 /etc/named.conf ﹕ options {

directory "/var/named";

};

zone "35.30.203.in-addr.arpa" {

type forward;

forwarders {

203.30.35.137;

};

};

zone "160-27.35.30.203.in-addr.arpa" {

type master;

notify no;

file "named.203.30.35.160";

};

这里﹐您或许发现了一个新的 DNS 主机类型﹕forward 。因为子网主机和负责父网的主机不是同一台机器﹐所以我们就将关于父网的查询全部 forward 到父网主机去。除非该子网有直接的 internet 联机﹐换句话说﹐它的 NS 主机可以从 root 反查询下来﹐否则的话﹐它就查询不到其它子网的记录了。当然﹐您直接在 options 里面指定 forwarders 也可以。另外还有一个方法是﹕用 slave 来做父网的 DNS 次主机。

方法很多﹐任选其一则可。您也可以参考下面例子﹐用 $ORIGIN 指定父网的 NS。

接下来﹐是 /var/named 下面的记录文件内容﹐首先是反解﹕ ;File: /var/named/named.203.30.35.160

;

;This is a sub-net born from 203.30.35.0

;

$TTL 86400

@ IN SOA dns.sub.siyongc.domain. root.dns.sub.siyongc.domain. (

2000060404 28800 14400 691200 86400 )

;

@ IN NS dns.sub.siyongc.domain. ;这应该和父网指定的一致

;

$ORIGIN 35.30.203.in-addr.arpa. ;关于父网的查询设定

IN NS redhat52.siyongc.domain.

;

$ORIGIN 160-27.35.30.203.in-addr.arpa. ;关于当前子网的设定

;

161 IN PTR dns.sub.siyongc.domain.

164 IN PTR host164.sub.siyongc.domain.

;

;其它 IP 如果没有分配出去的话﹐可以不设。

;

这样﹐我们已经成功地为切割子网建立起反解查询了。您应该知道怎么为子网 128 设定反解了吧﹖虽然它和父网的 DNS 主机都是同一台﹐相信也难不倒您的。

接下来让我们完成正解部份

在 DNS 系统中﹐每一个 zone 下面都可以包含有更多的 sub-zone ﹐但通常﹐我们只需为 domain 所在的第一级网域进行注册就可以了。从前面的反解设定中﹐我们已经知道在‘siyongc.domain.’下面有一个 sub-zone 叫做﹕‘sub.siyongc.domain.’。并且有一台 IP 为 203.30.35.161 的 dns.sub.siyongc.domain 主机负责该 sub-zone 自己的记录﹐而无需劳动上级 siyongc.domain 来管理其下的主机。

这是非常灵活的设定﹐您知道如何建立这个正解子区域吗﹖

下面就是我的步骤。不过﹐我想请您自己先尝试一下设定﹐再来对照我的方法﹐看看是否一至。说不定您自己的方法更有效呢﹗当然﹐我也很欢迎您和我讨论这个有趣的话题。

首先﹐我在上级主机的 /var/named/named.siyongc.domain 档案里面新增这几行﹕ sub IN NS dns.sub.siyongc.domain.

IN MX 10 dns.sub.siyongc.domain.

$ORIGIN sub.siyongc.domain.

dns IN A 203.30.35.161

IN NS dns.sub.siyongc.domain.

IN MX 10 dns.sub.siyongc.domain.

第一行﹐我在 parent zone 指定了 zub zone:‘ sub.siyogc.domain.’的 DNS 主机名称﹔第二行是该 sub-zone 的 MX 记录﹔第三行﹐我宣告下面的设定属于 sub.siyongc.domain 的﹔第四行指定 sub-zone 的 DNS 主机之 IP 地址。如果您不使用 $ORIGIN 这个 option的话﹐dns 应该改成 dns.sub ﹐或干脆使用 FQDN (带点“ . ”结尾)来设定 A 记录。

如果您了解 DNS 运作的话﹐应该知道要由其它 DNS 查询 sub.siyongc.domain. 里面的主机﹐会先从“.”那里一直查询到 siyongc.domain. 的 NS 主机﹐然后从该主机的记录中(也就是目前这个档案)里面得到 sub.siyongc.doamin. 的 NS 主机﹐即﹕dns.sub.siyongc.domain. ﹐然后再从 A 记录得到该主机的 IP 地址为﹕203.30.35.161 。有了 IP 之后﹐一切都好办事啦。

好了﹐然后我们移师到 dns.sub.siyongc.domain 这台主机上﹐修改 /etc/named.conf 档案﹐增加﹕ zone "siyongc.domain" {

type forward;

forwarders {

192.168.0.17;

};

};

zone "sub.siyongc.domain" {

type master;

notify no;

file "named.sub.siyongc.domain";

};

接下来﹐我们在 /var/named 目录下面建立 named.sub.siyongc.domain 记录文件﹕ ; File: /var/named/named.sub.siyongc.domain

;

; Sub-Zone file for domain: 'sub.siyongc.domain.'

;

;

$TTL 86400

@ IN SOA dns.sub.siyongc.domain. root.dns.sub.siyongc.domain. (

2000060404 28800 14400 691200 86400 )

IN TXT "A test sub-domain, created by Netman"

IN NS dns.sub.siyongc.domain.

IN MX 10 dns.sub.siyongc.domain.

;

$ORIGIN sub.siyongc.domain.

;

localhost IN A 127.0.0.1

;

dns IN A 203.30.35.161

IN HINFO "K6-233" "RH6.2 Linux"

IN TXT "A test host for sub.siyongc.domain."

IN MX 10 dns.sub.siyongc.domain.

www IN CNAME dns

ftp IN CNAME dns

news IN CNAME dns

mail IN CNAME dns

smtp IN CNAME dns

pop IN CNAME dns

;

host164 IN A 203.30.35.164

IN MX 10 dns.sub.siyongc.domain.

在当前环境来说﹐能顺利申请到完整的一组 class IP 的情况实在非常少见了。这时候您很可能要需要上游 ISP 帮您做反解﹐要惊动他们是在所难免的。如果他们肯受权下来﹐那么您自己的设计弹性就比较高﹐日后要修改也容易得多。但如果上游没有受权的时候﹐您可千万不要越俎代庖﹐因为设了也等于白设﹕别人还是不能从外面反查询得到的。但是﹐如果在上游没有授权的情况之下﹐您日后的每次修改﹐都必须要通知上游﹐才能保持资料的准确性﹐却是十分的不方便。下面的这个方法是是一个折衷的办法﹐您只需到上游注册一次﹐日后的变动则完全虽您自己的意思﹕

假设您是一个 ADSL 的用户﹐获得 5 个可用 IP﹐分别从 211.2.3.113 到 211.2.3.118。然后您为您目前的 domain 注册为 my.domain。这样﹐您首先要到上游完成反解的注册﹐这样设就可以了﹕ $ORIGIN 3.2.211.in-addr.arpa.

......

114 IN CNAME 114.my.domain.

115 IN CNAME 115.my.domain.

116 IN CNAME 116.my.domain.

117 IN CNAME 117.my.domain.

118 IN CNAME 118.my.domain.

......

然后您也无需在自己的 DNS 上面设反解﹐全部都在 my.domain 的记录文件上面设就可以了﹕ ......

$ORIGIN my.domain.

114 IN PTR dns.my.domain.

dns IN A 211.2.3.114

115 IN PTR www.my.domain.

www IN A 211.2.3.115

116 IN PTR ftp.my.domain.

ftp IN A 211.2.3.116

117 IN PTR pop.my.domain.

pop IN A 211.2.3.117

118 IN PTR smtp.my.domain.

smtp IN A 211.2.3.118

......

照这样看来应该没什么问题了。假如您对子网划分有些地方不理解﹐欢迎参考一篇我与网友的讨论信件 (注意﹕内容是引用旧版的文章﹐所以设定上和目前的方法有所不同﹐但原理还是一样的)。

如果子网授权有误﹐则很容易做成 lame server 的问题。您可以参考 DNS/bind-4.9.x Lame Server 讯息所代表的意义 ( 理论篇 ) 这篇文章认识问题产生的理论﹐然后进行修正。

关于 DNS 的安全问题

DNS 系统在网络沟通上面提供了非常便利的途径﹐一个设定完整的 DNS 系统﹐无论在管理或除错方面都是非常有效的。然而﹐在许多网络入侵案例中﹐往往因为 DNS 提供的信息过多﹐而让入侵者省却了许多步骤和时间﹐这也减少了检测到入侵的机会。

所以﹐如果有条件的话﹐最好设定多台 DNS 服务器﹐只让其中一或二台对外(internet)提供服务。在这些对外服务的机器上﹐我们只设定最少的必须记录就可以了﹐千万不要把 HINFO 等一些关于主机和网络环境的记录写进去。同时﹐任何不必要对外提供的 IP 和主机记录﹐一概删除就是了。而其它的仅为内部网络提供服务的主机﹐则无论如何也不要让过多的 DNS 信息流出 internet。您可以通过火墙过滤来保护内部的 DNS 信息。

为获得更好的安全效果﹐您可以在 /etc/named.conf 档案中设定一些限制﹐让 DNS

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus