bind9配置精讲(三)

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

设定子网域授权

到这里,您所需要具备的 DNS 技巧相信已经足够应付普通网络的需要了。但如果您的网络非常庞大,而且 DNS 系统比较复杂,或是您有兴趣知道 Internet 上是如何进行 DNS 授权的话,那您或许需要了解一下 DNS 的子网域 (sub zone) 授权设定。

这个问题不如用实际的例子来说明好了。正如您从本章所看到的范例,目前我在 rh71 上面已经设定有两个 domain 的 zone :siyongc.domain 和 dmz.domain 。假设我现在要在 siyongc.domain 分出一个 sub-zone,称为 home.siyongc.domain ,同时将这个 sub-zone 授权给一台叫 diamond 的主机来管理;目前 diamond 上面有两张网络卡:192.168.100.26 和 192.168.2.1 ,而 home 这个 sub-zone 需要管理的 DNS 除了 diamond 本身外,还有 pc100 到 pc200 ( IP 范围从 192.168.2.100 到 192.168.2.200 之间) 等主机,他们都是由 DHCP 发放的。当然了,底层的网络连接,例如 hub、路由、防火墙、等等,都已经设定好了。那么,我们要如何进行呢?

首先,我需要修改 rh71 上的 /var/named/siyongc.domain 挡案,将 home 授权给 diamond.home.siyongc.domain 这台 NS 来管理,您只需在记录文件后面增加这些句子就可以了:

;; -- sub zones --
$ORIGIN home
@ IN NS diamond.home.siyongc.domain.
diamond IN A 192.168.2.1



上面我用一个 $ORIGIN 来宣告一个属于 siyongc.domain 范围内的 sub-zone 叫 home (如果改用带小数点的 FQDN 的话,则写成 home.siyongc.domain. ),以及负责这个 sub-zone 的 NS 主机,还有 NS 主机的 IP 地址所在。这里的 NS 记录就是用来授权用的了!目前我只授权给单一一台 NS 而已,如果您喜欢,那您可以授权多台 NS 主机。事实上,当您在网络上注册 domain 的时候,他们也是在上游(如 com. 或 com.tw. ) 那边帮您设定 NS 记录和 NS 主机的 A 记录而已~~~


Tips:假如您不使用 $ORIGIN 的话,那可以取消这行,然后将 @ 改为 home ,以及将 diamond 改为 diamond.home 就可以了(注:两个记录名称都没有小数点!)。

接下来的设定,需要转到 diamond 上面进行。首先,修改 /etc/named.conf 档案,增加如下数行:

zone "siyongc.domain" IN {// 上一级区域设定
type forward;
forwarders { 192.168.100.23; };
};

zone "home.siyongc.domain" IN {// 本机管辖区域设定
type master;
file "home.siyongc.domain";
};



这里,您或许发现我用 forwarder 将上游的查询转向正确的位置(当然,您直接在 options 里面指定 forwarders 也可以),您应该知道这样做的好处了吧?除了无需绕到 root zone 往下查询下来之外,更重要的原因是:这个 sub-zone 主机和上游主机不是同一台 NS ,除非这两台主机同时是 internet 的合法 IP 且经过注册(换句话说:父网的 NS 主机可以从 root zone 查询下来),否则的话,它就查询不到其它 sub-zone 的记录了!除了用 forwarder ,另外还有一个方法是:就是架设 slave 主机以获得上游的 zone 数据。不管用哪一种方法,如果您不能查询到上游 NS 的话,您就没办法查询其它 sub-zones 了。

除此之外,我们还必须建立 /var/named/home.siyongc.domain 这个档案,内容如下:

$TTL 86400
$ORIGIN home.siyongc.domain.
@ IN SOA diamond.home.siyongc.domain. root.diamond.home.siyongc.domain. (
2001111701 28800 14400 3600000 86400 )
IN NS diamond.home.siyongc.domain.
600 IN MX 10 diamond.home.siyongc.domain.

;; -- servers --
diamond IN A 192.168.2.1
IN MX 0 diamond.home.siyongc.domain.

;; -- workstations --
$GENERATE 100-200 pc$ A 192.168.2.$



在这里,我首先将 MX 的 TTL 降为 10 分钟,因为我目前还不很确定这个 sub-zone 的邮件是否由 diamond 来管。如果不增加 600 这个字段的话,那么 TTL 会以前面的 $TTL 值为准,也就是一天。然则,一旦有别的 DNS 查询过这个 MX 记录,那么这个记录会在对方的 cache 中存在一天时间。假如我日后修改 MX 记录的话,那我很可能要等一天之后,才能让别的 DNS 查询到新的设定值。


Tips: 事实上,在您进行任何 DNS 记录的修改,都必须认识到 TTL 的重要性以及它可能产生的影响,这点,我在本章最后再谈。

然而,在这个档案中,您首次接触到 $GENERATE 这个选项。如果您有写过 shell script,或是具有“变量 (variable) ”概念的话,这行一点都不难理解:


首先,我用 $GENERATE 产生一段数值范围,您可以将之当成一个变量数组( array )。注意:这段数值并不能直接用来作记录项;
然后,在这个句子后面的“ $ ”符号就是变量数组里面的值(还记得 for 循环吗?如果忘记了,请回去 system 系列那边补习 shell 的知识);
其后,我所定义的 pc$ 才是记录项名称的开始:它的意思就是定义一个 pcXXX 的名称,而 XXX 的值就是 $ 。
那后面的 A 呢?您应该知道什么是 A 记录类别了吧?(不过,我觉得奇怪,这个版本竟不接受“ IN A ”这样的设定!不知道新版有没有解决了?)
同样道理,192.168.2.$ 的那个 $ ,和 PC$ 那个 $ 是同一样的值。

不难理解吧?换而言之,如果您不使用 $GENERATE 的话,那就为 pc100 到 pc200 这 100 台主机设定 100 行 A 记录就是了。那么,请问:您愿意用那个方法呢?


注:假如您已经在 Internet 上注册了一个合法的 domain ,那么您在这个 domain 下面切分出去的 sub-zone 就无须再注册了。因为您的 domain 所使用的 zone 已经获得授权,并且也有自己的 SOA ,那么其下要再授权出多少个 sub-zone,或往下授权多少层,完全由您自己作主。



设定子网反解授权

好了,刚才介绍的 sub-zone 授权,是属于正解部份的,那么反解又如何呢?通常来说,如果您获得的 IP 是一整段 class (或 A 或 B 或 C ) 的话,在反解设定上也不会太难就是了。我相信聪明的您一定已经知道如何设定吧?(前面不是设定过了吗?)

如果您真真正正了解 IP 和 Net mask 的关系,那我这里要出一道难题了:我在我的网络设定中,10.0.1.0 这个网络实际上借用了 3 个 bit 来切割成 8 个子网络。而我将这台 rh71 上其中一个界面分配到 sub-net ID 为‘100’的这个子网中,也就是说,实际的 Net ID 应该是‘10.0.1.128’;而另外一个界面则分配在 10.0.1.0/27 这个子网络中。

在前面,我们已经设定过 0.1.10.in-addr.arpa 的反解了,但那次只是单纯的为整个 C Class 做反解,事实上并没考虑到 sub-net 的问题。现在我打算将这个网络的反解再进行子网络的授权设定。我暂时保留 10.1.0 这个‘父网’的反解,然后将 128 这个子网的反解授权给 10.0.1.130 ( lp64 ) 上面进行(至于其它网暂时不设定了,反正只要会了设定其中的一个,就能举一反三)。


Tips:对于切割子网的 DNS 反解设定,是非常难懂的,您一定要对 IP 地址划分有很清晰的了解,要不然,请您先搞定 IP 的 subneting 再回来(可参考“学习网络”中的 “ IP 地址 ”一文)。在以后的叙述里,请务必留神!如果您不想弄那么复杂,最简单莫过于在“父网”上面做好所有子网的记录设定(像是请 ISP 那边帮忙设定反解一样)。但问题是,如果子网那里要进行变更,就一定要劳烦上级网络管理员,网络的灵活性当然就大打折扣了。

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


无论如何,我先得在 rh7.1 上面确定 /etc/named.conf 这个档案有关于‘父网’的设定::

zone "1.0.10.in-addr.arpa" IN {
type master;
file "10.0.1.rev";
};



事实上,上面的内容和我们以前的设定没什么不一样,您只需确定它有这个设定就行了。然而,原本的 /var/named/10.0.1.rev 却必须修改一下,使之变成如下内容:

$TTL 86400
$ORIGIN 1.0.10.in-addr.arpa.; 宣告当前网络(父网)反解
@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
2001111701 28800 14400 3600000 86400 )
IN NS rh71.siyongc.domain.

; 以 $GENERATE 的方式,建立 CNAME ,将查询转往子网:
$GENERATE 128-159 $ CNAME $.sub-128

; 将 128 这个子网授权出去:
sub-128 IN NS lp64.dmz.domain.



在这个特殊的“切割子网”例子中,其中最关键的设定是 CNAME 的设定,如果您没忘记我前面是如何解释 CNAME 的话,您会知道凡是查询 CNAME 左边的记录,就转到 CNAME 右边再查一次。这里,我们用 $GENERATE 的方式将 128-159 这段记录用 CNAME 转向 sub-128 这个子网查询。


Tips:事实上,这个子网名称在 DNS 系统里面可以随便定义,比方说,有些人喜欢用 mask bit 的数目来定义,那就可以写成 128-27 ;当然,如果您喜欢用 IP 范围来定义也可以:128-159 。如何定义没关系,只要不混乱就行。

因为 128 至 159 这段 IP 实际上是在子网 10.0.1.128 里面的范围(这段现已授权出去,但您不能在 ineternet 上面查询 203.30.35.128.134 这样的五组数字的 IP 格式),当人们要查询所有以 10.0.1 开头的 IP 的时候,都会先向 1.0.10.in-addr.arpa. 的 NS 查询,也就是目前这台机器;然后再透过 CNAME 将查询转向其子网络 sub-128.1.0.10.in-addr.arpa. 进行查询,直至找到 128 至 159 之间的 PTR 记录为止。


Tips:在 A 和 B class 的子网授权设定中,只要不超过 24bit mask 且使用完整 otec 的话,应该无需使用 CNAME,直接为下一个 otec 进行 NS 授权就行了。

在上例中的最后一行,我将 sub-128 这个自己定义的子网记录项,以 NS 授权给 “lp64.dmz.domain.”来负责。而至于 lp64.dmz.domain 的 IP 在哪里呢?那就透过正解查询来获得了,我们无需担心这个,除非解那边没设定起来。

接下来,让我们转到 sub-128.1.0.10.in-addr.arpa. 的 NS ,也就是 lp64 这台机器上面。首先,需要修改 /etc/named.conf 档案,让 named 知道 sub-128 目前由它来负责:

zone "1.0.10.in-addr.arpa" {
type forward;
forwarders { 192.168.100.23; };
};

zone "sub-128.1.0.10.in-addr.arpa" {
type master;
file "10.0.1.128.rev";
};



这里的 forwarder 之作用与前面介绍的 sub-zone 授权时的设定一样:如果您不能查询到父网的 NS 的话,您就没办法查询其它子网络。

当我们完成 named.conf 的设定之后,还必须在 /var/named 目录下面建立相应的档案,也就是 10.0.1.128.rev 这个档:

$TTL 86400
$ORIGIN sub-128.1.0.10.in-addr.arpa.; 关于当前子网的设定
@ IN SOA lp64.dmz.domain. root.lp64.dmz.domain. (
2001111701 28800 14400 3600000 86400 )

@ IN NS lp64.dmz.domain.; 这应该和父网指定的一致

; 固定 IP 的反解:
129 IN PTR dialser.dmz.domain.
130 IN PTR lp64.dmz.domain.
131 IN PTR rh71.dmz.domain.

; 拨接主机的反解:
$GENERATE 132-155 $ PTR dialup-pc$.dmz.domain.



在当前的 Internet 环境来说,能顺利申请到完整的一组 class IP 的情况实在非常少见了。这时候您很可能要需要上游 ISP 帮您做反解,要惊动他们是在所难免的。如果他们肯受权下来,那么您自己的设计弹性就比较高,日后要修改也容易得多。但如果上游没有受权的话,您可千万不要 越俎代庖,设了也等于白设:因为您的 NS 并没有经过授权,别人是不能从 root zone 反查询得到的。而且,更严重的是:如果您自己将整个 C Class 的反解私自设定起来的话,由于没办法知道除了您这个 subent 之外的其它 subnet 的信息,也就没办法设定。这样结果将会是:如果您不设,或许可以透过 ISP 查询到它们;如果设了反而查不到!

但是,如果在上游没有授权的情况之下,您日后的每次修改,都必须要通知上游,才能保持数据的准确性,却是十分的不方便。下面的这个方法是是一个折衷的办法,您只需到上游注册一次(如果上游不同意,请努力说服他们),日后的变动则完全看您自己的意思了:

假设您是一个 ADSL 的用户,获得 5 个可用 IP,分别从 211.2.3.113 到 211.2.3.118;同时,您为您目前的 domain 注册为 my.domain。这样,您首先要到上游完成反解的注册,这样设就可以了:

$ORIGIN 3.2.211.in-addr.arpa.
......
114INCNAME114.my.domain.
115INCNAME115.my.domain.
116INCNAME116.my.domain.
117INCNAME117.my.domain.
118INCNAME118.my.domain.
......



然后您也无需另外设定反解,全部都在 my.domain 的记录文件上面设就可以了:

......
$ORIGIN my.domain.
114INPTRdns.my.domain.
dnsINA211.2.3.114
115INPTRwww.my.domain.
wwwINA211.2.3.115
116INPTRftp.my.domain.
ftpINA211.2.3.116
117INPTRpop.my.domain.
popINA211.2.3.117
118INPTRsmtp.my.domain.
smtpINA211.2.3.118
......



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

许多人都觉得:我没有设定反解、ISP 那边也不愿意帮忙设定,我的 DNS 还不是照常工作!那么究竟什么时候才会用到反解呢?如果不设定反解有什么后果呢?嗯~~ 如果有这个疑问的话,我建议您先读读如下的文章,相信您就知道反解的重要性在哪里了:


reverse domain 的使用时机

另外,如果 DNS 授权有误,则很容易做成 lame server 的问题。发生这问题的原因是:从 DNS 系统上查询某一个名称的时候,获得一个 NS 信息,然后向那个 NS 进行查询的时候却得不到结果。您可以参考下面这篇文章认识问题产生的理论,然后进行修正:


DNS/bind-4.9.x Lame Server 讯息所代表的意义 ( 理论篇 )

不过,如果 lame server 是由于别人乱设而引起的话,那您只能设法与对方的管理原取得联系,然后请对方修改了。



关于 DNS 的安全问题

DNS 系统在网络沟通上面提供了非常便利的途径,一个设定完整的 DNS 系统,无论在管理或除错方面都是非常有效的。然而,在许多网络入侵案例中,往往因为 DNS 提供的信息过多,而让入侵者省却了许多步骤和时间,这也增加了对入侵行为的侦察和预警的难度。

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

为了获得更好的安全效果,您可以在 /etc/named.conf 档案中设定一些限制,让 DNS 仅对那些信任的网络或主机提供服务,或是挡掉来自不信任主机的查询。下面,我提供一个安全设定的范例给大家参考一下:

//---file: /etc/named.conf
//

//---首先定义各安全群组---//
acl LOCALHOST {
127.0.0.0/8;
};
acl DMZ_net {
10.0.1.128/27;
};
acl TRUSTED_net {
192.168.100.0/24;
192.168.2.0/24;
};
acl TRUSTED_host {
192.168.100.26/32;
10.0.1.130/32;
10.0.1.161/32;
};
acl BAD_Guys {
38.38.38.38;
44.44.44.44;
119.119.119.119;
}; //-注:以上 ip 仅作例子 :-)!-//

//---然后在 options 中设定预设原则---//
options {
directory "/var/named";

forward first;
forwarders {
139.175.10.20;
168.95.1.1;
};

allow-update { none; };
allow-transfer { none; };
allow-query { any; };
blackhole { BAD_Guys; };
};


//---在各区域中另行设定区属安全原则---//
zone "." {
type hint;
file "named.ca";
};

zone "localhost" IN {
type master;
file "localhost.zone";
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";

//--- 注:上两个 zone 原本有 update 限制的,
//--- 但由于已经在 options 中限制过了,故不重复。


zone "100.168.192.in-addr.arpa" {
type master;
file "192.168.100.rev";
allow-query { LOCALHOST; DMZ_net; TRUSTED_net; };
allow-transfer { TRUSTED_host; };
notify yes;
also-notify { 10.0.1.130; 192.168.100.26; };
};

zone "1.0.10.in-addr.arpa" {
type master;
file "10.0.1.rev";
allow-query { LOCALHOST; DMZ_net; TRUSTED_net; };
allow-transfer { TRUSTED_host; };
notify yes;
also-notify { 10.0.1.130; 10.0.1.161; };
};

zone "128.1.0.10.in-addr.arpa" {
type slave;
file "slave.10.0.1.128";
allow-query { LOCALHOST; DMZ_net; TRUSTED_net; };
};

zone "siyongc.domain" {
type master;
file "siyongc.domain";
allow-query { LOCALHOST; DMZ_net; TRUSTED_net; };
allow-transfer { TRUSTED_host; };
notify yes;
also-notify {
192.168.100.26;
10.0.1.130;
};
//--- 如果您有设定 dynamic dns 或是 samba 更新,请开放 update 。
allow-update { LOCALHOST; TRUSTED_net; };
};

zone "home.siyongc.domain" in {
type slave;
masters { 192.168.100.26; };
file "slave.home.siyongc.domain";
allow-query { LOCALHOST; DMZ_net; TRUSTED_net; };
};



在设定 DNS 的安全原则的时候,有些问题您必须注意:

如果 client (包括 localhost ) 如果不在 allow-query 范围内的话,将不能查询该区域的任何信息。


当这一个区域作为 master 且有其它 slave 指向它的时候,slave 主机必须同时被包括在 allow-query 和 allow-transfer 设定中才可以完成区域转移。


那些不在 allow-query 设定当中的主机,虽然不能够直接将 server 指向这台 DNS 来查询所在区域。然而,如果对方先将 server 指向另一台 DNS 主机,且该主机是属于 allow-query 设定之中的话,也可以对该区域进行查询。

例如,如果在 zone "siyongc.domain" 当中允许 DMZ_net 的查询。虽然从外面的主机不能直接查询这个 zone ,但只要对方将 server 指向 DMZ_net 其中任一台 DNS 主机,而该主机的 allow-query 可以让其通过的话,那他们也就可以查询 siyongc.domain 了。


实质上,also-notify 并不能限制区域转移的进行,它只不过可以让 master 通知其中的 slave 主机罢了。任何一台 DNS,只要通过了 allow-transfer 和 allow-query 检查,就可以用进行区域转移了。


关于 allow-update 的限制,并非是说在 slave 上允许 master 将数据同步过来,而是针对动态 DNS 协议所进行的限制。



一些注意之处

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

如果您机器有多个名称的话,那么,在反解那里也容许一个 IP 有多个 PTR 记录的。不过,如果您用 nslookup 的正常模式查询的话,会以 roung robind 的形式一次显示一个记录,您要经过 set type=ptr 之后才可以看到全部记录。

每次当您修改了 master 机器上的的内容,请一定要更新 Serial 号码!同时,在 slave 上面设定的时候,也不要漏了 masters 的 s 字母;同样,设定 forwarder 的时候,最后也有一个 s 字母~~


如果您要修改 NS 或 MX 这些敏感性记录(例如移机或更换 IP ),事先请将 TTL 降低,然后等上一个 TTL 过期之后再修改,并且利用外面的 DNS 来查询修改结果。等稳定之后才将 TTL 提高到原来水平。如果记录数据都很稳定,不妨将 TTL 提高一点,这对于繁忙的系统有所帮助,但对于修改则非常不便。所以,如何拿捏 TTL 的水平,也是非常考究的。

老实说,我自己对 DNS 的设定也是一知半解而已。如果您想看一看正规的设定范例,可以到
http://dnsrd.nctu.edu.tw/Named-Conf/conf.html 看看;
DNS 的技术原理则可以参考:
http://turtle.ee.ncku.edu.tw/~tung/dns/。
另外,
http://www.tp.edu.tw/service/dns0.htm
这篇相当容易上手,也建议看看。最后,这个
http://www.acmebw.com/cats.htm
网站,也有许多 DNS 的问题与解答,有问题可以到那里找找,或许答案早在那里了!还有,到
http://www.isc.org/products/BIND/
这个网站,您可以了解到最新最全面的关于 BIND 这个软件的信息。

如果您非常正经的想学习一下 DNS ,有一本 O'reilly 出版的书是非看不可的,那本书叫 ‘ DNS & Bind ’。您最好找最新版的回来看,听说已经有第 4 版了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值