19.5 协同工作的 DNS: Slave DNS 及子域授权设定
我们在本章一开始就曾谈过,DNS 大概是未来最重要的网络服务之一,因为所有的主机名需求都得要 DNS 提供才行。 因此,ISP 在提供 domain name 注册时,就强调得要有两部以上的 DNS 服务器才行。而为了简化 DNS 管理人员的负担, 使用 Master/Slave DNS 架构的情况会比较好!为什么呢?让我们再回忆一下 Slave DNS 的特色:
- 为了不间断的提供 DNS 服务,你的领域至少需要有两部 DNS 服务器来提供查询的功能;
- 承上,这几部 DNS 服务器应该要分散在两个以上的不同 IP 网域才好;
- 为方便管理,通常除了一部主要 Master DNS 之外,其他的 DNS 会使用 slave 的模式;
- slave DNS 服务器本身并没有数据库,他的数据库是由 master DNS 所提供的;
- master/slave DNS 必需要可以相互传输 zone file 的相关信息才行,这部份需要 /etc/named.conf 之设定辅助。
除此之外,如果你有朋友或者是学生想要跟你要一个子域,那又该如何设定另一部 DNS 服务器呢?就让我们依序来谈谈啰~
19.5.1 master DNS 权限的开放
我们使用 19.4.3 的案例,继续来架设一部支持该案例的 slave DNS 吧!基本的假设为:
- 提供 slave DNS 服务器进行 zone transfer 的服务器为 master.centos.vbird
- centos.vbird 及 100.168.192.in-addr.arpa 两个 zone 都提供给 slave DNS 使用
- master.centos.vbird 的 named 仅提供给 slave.centos.vbird 这部主机进行 zone transfer
- Slave DNS server 架设在 192.168.100.10 这部服务器上面 (所以 zone file 要修订)
如上所示,我们的 master.centos.vbird 这部服务器除了 named.conf 需要调整之外,两个 zone file 也都需要调整! 在 named.conf 当中,需要设定哪个 IP 可以对我的 zone 进行传输 (allow-transfer),而在 zone file 当中,就是各加入一笔 NS 的记录即可!增加的部分如下所示:
# 1\. 修订 named.conf,主要修改 zone 参数内的 allow-transfer 项目
[root@www ~]# vim /etc/named.conf
....前面省略....
zone "centos.vbird" IN {
type master;
file "named.centos.vbird";
allow-transfer { 192.168.100.10; }; // 在这里新增 slave 的 IP
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "named.192.168.100";
allow-transfer { 192.168.100.10; }; // 在这里新增 slave 的 IP
};
在上头所列示的那两个数据库档案当中,你必须要新增所需要的 NS 标志才行!NS 对应的主机名为 slave.centos.vbird, IP 则是 192.168.100.10 呦!结果如下:
# 2\. 在 zone file 里面新增 NS 标志,要注意需要有 A(正解) 及 PTR(反解) 的设定
[root@www ~]# vim /var/named/named.centos.vbird
$TTL 600
@ IN SOA master.centos.vbird. vbird.www.centos.vbird. (
2011080402 3H 15M 1W 1D )
@ IN NS master.centos.vbird.
@ IN NS slave.centos.vbird.
master.centos.vbird. IN A 192.168.100.254
slave.centos.vbird. IN A 192.168.100.10
@ IN MX 10 www.centos.vbird.
....(底下省略)....
[root@www ~]# vim /var/named/named.192.168.100
$TTL 600
@ IN SOA master.centos.vbird. vbird.www.centos.vbird. (
2011080402 3H 15M 1W 1D )
@ IN NS master.centos.vbird.
@ IN NS slave.centos.vbird.
254 IN PTR master.centos.vbird.
10 IN PTR slave.centos.vbird.
....(底下省略)....
# 要特别注意一件事,那就是,你的 zone file 内的序号要增加!鸟哥测试日期是 8/4,
# 第 2 次进行,所以序号就以该天的日期为准来设计的!最后记得 restart 一下啦!
[root@www ~]# /etc/init.d/named restart
[root@www ~]# tail -n 30 /var/log/messages | grep named
starting BIND 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 -u named -t /var/named/chroot
....(中间省略)....
zone 100.168.192.in-addr.arpa/IN: loaded serial 2011080402
zone centos.vbird/IN: loaded serial 2011080402
zone 100.168.192.in-addr.arpa/IN: sending notifies (serial 2011080402)
zone centos.vbird/IN: sending notifies (serial 2011080402)
反正重新启动过 named 后,直觉记得就是要查阅 messages 登录信息就对了。从上表的输出来看,会多一个 sending notifies (传送注意事项) 关键词的数据,那就是提醒 slave DNS 来比对序号大小了!所以,你说,序号有没有很重要呢?当然很重要啊! 连登录讯息都会告知序号的大小哩!这样 master DNS 就设定妥当啰!接下来玩玩 Slave 的设定吧!
19.5.2 Slave DNS 的设定与数据库权限问题
既然 Slave DNS 也是 DNS 服务器嘛!所以,当然也是需要安装 bind, bind-chroot 等等的软件! 这部份回去 19.3.1 里面瞧瞧即可,反正记得使用 yum 安装就对了。 接下来得要设定 named.conf 吧?而既然 Master/Slave 的数据库是相同的,所以,理论上, named.conf 内容就是大同小异啰~ 唯一要注意的就是 zone type 类型的差异,以及宣告 master 在哪里就是了。 至于 zone filename 部分,由于 zone file 都是从 master 取得的,透过 named 这个程序来主动建立起需要的 zone file,因此这个 zone file 放置的目录权限就很重要!让我们直接来处理看看:
# 1\. 准备 named.conf 的内容:
[root@clientlinux ~]# vim /etc/named.conf
....(前面的部分完全与 master.centos.vbird 相同,故省略)....
zone "centos.vbird" IN {
type slave;
file "slaves/named.centos.vbird";
masters { 192.168.100.254; };
};
zone "100.168.192.in-addr.arpa" IN {
type slave;
file "slaves/named.192.168.100";
masters { 192.168.100.254; };
};
# 2\. 检查 zone file 预计建立的目录权限是否正确!底下目录为系统默认值:
[root@clientlinux ~]# ll -d /var/named/slaves
drwxrwx---. 2 named named 4096 2011-06-25 11:48 /var/named/slaves
# 注意权限、使用者以及群组三个字段的数据!需要与 named 这个用户及群组有关!
[root@clientlinux ~]# ll -dZ /var/named/slaves
drwxrwx---. named named system_u:object_r:named_cache_t:s0 /var/named/slaves
# 也不要忘记与 SELinux 有关的事情!
为了方便使用者设定,CentOS 预设在 /var/named/slaves/ 处理好了相关权限~所以你可以轻松的处理权限问题~ 我们就建议你的 slave zone file 放置在该目录下!所以上表当中的 file 参数才会这么写~此外,那个 masters 结尾有个 s 喔!这里最容易写错~那么要不要处理 zone file 呢?除了 named.ca 这个 . 需要主动存在之外, 另外两个 type slave 的数据库档案,当然不必存在啊!因为会从 master 处取得嘛!接下来,就让我们来启动 named 并进行观察吧!
[root@clientlinux ~]# /etc/init.d/named start
[root@clientlinux ~]# chkconfig named on
[root@clientlinux ~]# tail -n 30 /var/log/messages | grep named
starting BIND 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 -u named -t /var/named/chroot
loading configuration from '/etc/named.conf'
....(中间省略)....
running
zone 100.168.192.in-addr.arpa/IN: Transfer started.
zone 100.168.192.in-addr.arpa/IN: transferred serial 2011080402
zone centos.vbird/IN: Transfer started.
zone centos.vbird/IN: transferred serial 2011080402 <==注意序号正确否
# 你会看到如上的讯息,重点是还有告知序号喔!非常重要!
[root@clientlinux ~]# ll /var/named/slaves
-rw-r--r--. 1 named named 3707 2011-08-05 14:12 named.192.168.100
-rw-r--r--. 1 named named 605 2011-08-05 14:12 named.centos.vbird
# 这两个 zone file 会主动被建立起来呢!
[root@clientlinux ~]# dig master.centos.vbird @127.0.0.1
[root@clientlinux ~]# dig -x 192.168.100.254 @127.0.0.1
# 上述两个检测的指令如果是正确的显示出 A 与 PTR 的话,那就完成了!
你瞧!如此一来你的 zone file 就会主动的被建立起来喔!未来如果你的 master DNS 要更新数据库时, 只要修改过序号,并重新启动 named 后,这部 slave DNS 就会跟着更新啦!啊!真是『福气啦!』!! 不过,如果你发现到启动 slave DNS 时,你的登录信息竟然是这样:
zone centos.vbird/IN: Transfer started.
transfer of 'centos.vbird/IN' from 192.168.100.254#53: connected using
192.168.100.10#58187
dumping master file: tmp-a1bYfCd3i3: open: permission denied
transfer of 'centos.vbird/IN' from 192.168.100.254#53: failed while receiving
responses: permission denied
transfer of 'centos.vbird/IN' from 192.168.100.254#53: end of transfer
如果出现类似这样的讯息时,不必怀疑啦!肯定是权限错误啦!请再次检查你的数据库档案所放置的目录权限是否可以让 named 写入啊!处理处理就好了!现在,你的 DNS 会变的更加强壮啰!因为有类似的备援系统啰~不过仍然要注意的是, 网络查询 centos.vbird 时,master 与 slave 的地位是相同的,并不是 master 挂点才使用 slave 来查询喔!所以,这两部服务器的相同 domain 的数据库内容要完全一致才行!
19.5.3 建置子域 DNS 服务器:子域授权课题
除了 Master/Slave 需要协同 DNS 服务器共同提供服务之外,DNS 之间如果有上层、下属的关系时,该如何设定? 亦即,假设我的网域很大,我只想要负责上层的 DNS 而已,下层希望直接交给各单位的负责人来负责,要怎么设定呢? 举个例子来说,以成大为例,成大计中仅管理各个系所的 DNS 服务器 IP 而已,由于各个系所的主机数量可能很大, 如果每个人都要请计中来设定,那么管理员可能会疯掉,而且在实际设计上也不太人性化。
所以啰,计中就将各个 subdomain (子域) 的管理权交给各个系所的主机管理员去管理,如此一来, 各系所的设定上面会比较灵活,且上层 DNS 服务器管理员也不用太麻烦吶!
好了,那么如何开放子域授权呢?我们以刚刚在 master 上面建立的 centos.vbird 这个 zone 为例, 假设今天你是个 ISP ,有个人想要跟妳申请 domain name ,他要的 domain 是『 niki.centos.vbird 』, 那你该如何处理?
上层 DNS 服务器:亦即是 master.centos.vbird 这一部,只要在 centos.vbird 那个 zone file 内,增加指定 NS 并指向下层 DNS 的主机名与 IP (A) 即可,而 zone file 的序号也要增加才行;
下层 DNS 服务器:申请的领域名必须是上层 DNS 所可以提供的名称,并告知上层 DNS 管理员,我们这个 zone 所需指定的 DNS 主机名与对应的 IP 即可。然后就开始设定自己的 zone 与 zone file 相关数据。
假设我们管理 niki.centos.vbird 的服务器主机名为 dns.niki.centos.vbird ,而这部主机的 IP 为 192.168.100.200, 那接下来就让我们实际来设定吧!
- 上层 DNS 服务器:只需新增 zone file 的 NS 与 A 即可
上层 DNS 的处理真是简单到爆炸!我们只要修改 master DNS (www.centos.vbird 那一部) 里面的 named.centos.vbird 这个正解档案即可。slave DNS 不用修改,是因为他会自动更新嘛!新增如下的数据即可:
[root@www ~]# vim /var/named/named.centos.vbird
@ IN SOA master.centos.vbird. vbird.www.centos.vbird. (
2011080501 3H 15M 1W 1D )
# 上面的 SOA 部分序号加大,底下新增这两行即可 (原本的数据都保留不动)!
niki.centos.vbird. IN NS dns.niki.centos.vbird.
dns.niki.centos.vbird. IN A 192.168.100.200
[root@www ~]# /etc/init.d/named restart
[root@www ~]# tail -n 30 /var/log/messages | grep named
Aug 5 14:22:36 www named[9564]: zone centos.vbird/IN: loaded serial 2011080501
# 登录档的关键是上面的序号部分~必须是我们填写的新的序号才对!
[root@www ~]# dig dns.niki.centos.vbird @127.0.0.1
# 你会发现是错误的!找不到 A 喔!
上层 DNS 的设定非常简单!只要修改 zone file 即可~不过,由于 zone file 指定的是 NS 的查询权功能, 因此,最后那个指令在 dig dns.niki.centos.vbird 时,却会找不到 A 喔!那是正常的~因为 192.168.100.200 尚未设定好 niki.centos.vbird 这个领域嘛!所以追踪的结果并没有发现在 192.168.100.200 有 niki.centos.vbird 的 zone 啊! 所以当然找不到。此时数据库的管理权在 192.168.100.200 上啦!这样可以理解吗?再来处理下层 DNS 吧!
- 下层 DNS 服务器:需要有完整的 zone 相关设定
下层的 DNS 设定就与 19.4 的详细内容一样了!所以在这里我们仅列出重要的项目:
# 1\. 修改 named.conf ,增加 zone 的参数,假设档名为 named.niki.centos.vbird
[root@niki ~]# vim /etc/named.conf
....(前面省略)....
zone "niki.centos.vbird" IN {
type master;
file "named.niki.centos.vbird";
};
# 2\. 建立 named.niki.centos.vbird
[root@niki ~]# vim /var/named/named.niki.centos.vbird
$TTL 600
@ IN SOA dns.niki.centos.vbird. root.niki.centos.vbird. (
2011080501 3H 15M 1W 1D )
@ IN NS dns.niki.centos.vbird.
dns IN A 192.168.100.200
www IN A 192.168.100.200
@ IN MX 10 www.niki.centos.vbird.
@ IN A 192.168.100.200
# 为了简化整个版面,所以鸟哥都使用 hostname 而非 FQDN!请见谅!
# 3\. 启动并观察相关登录信息
[root@niki ~]# /etc/init.d/named restart
[root@niki ~]# tail -n 30 /var/log/messages | grep named
....(前面省略)....
zone niki.centos.vbird/IN: loaded serial 2011080501
....(底下省略)....
# 同时,<u>记得处理一下防火墙的放行问题</u>!否则测试会失败!!
[root@niki ~]# dig www.niki.centos.vbird @192.168.100.254
# 上述的动作必须要有响应才行!否则就会出问题~
19.5.4 依不同接口给予不同的 DNS 主机名: view 功能的应用
想象一个环境,以我们目前的局域网络服务器来说,我的 master.centos.vbird 有两个界面,分别是 192.168.100.254/24 (对内) 及 192.168.1.100/24 (对外),那当我外边的用户想要了解到 master.centos.vbird 这部服务器的 IP 时,取得的竟然是 192.168.100.254,因此还得要透过 NAT 才能联机到该接口,但明明 192.168.100.254 与外部的 192.168.1.100 是同一台服务器主机嘛!干嘛还得要经过 NAT 转到内部接口呢?有没有办法让外部的查询找到 master.centos.vbird 是 192.168.1.100 而内部的找到则回应 192.168.100.254 呢?可以的!那就透过 view 的功能!
那么 view 要怎么处理呢?其实就是让不同来源的用户,能够取得他们自己的 zone 响应就是了。举例来说,当用户来自 10.0.0.1 时,这个来源不可能是内部 (192.168.100.0/24) ,因此这个来源就会使用外部的 zone file 内容来响应。 因此,我们就得要准备同一个 zone 需要两个不同的设定,再将个别的设定带入自己的客户端查询当中。
现在我们针对这个概念,对于鸟哥的区网设定 view 的原则是这样的:
- 建立一个名为 intranet 的名字,这个名字代表客户端为 192.168.100.0/24 的来源;
- 建立一个名为 internet 的名字,这个名字代表客户端为非 192.168.100.0/24 的其他来源
- intranet 使用的 zone file 为本章前面各小节所建立的 zone filename,internet 使用的 zone filename 则在原本的档名后面累加 inter 的扩展名,并修订各标志的结果。
再次强调,最终的结果当中,从内网查到的 www.centos.vbird IP 应该是 192.168.100.254,而只要不是鸟哥内网来源的客户端, 查到的 www.centos.vbird IP 应该是 192.168.1.100 才对!那就让我们来实际设定此一项目吧!
[root@www ~]# vim /etc/named.conf
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
allow-transfer { none; };
};
acl intranet { 192.168.100.0/24; }; <==针对 intranet 给予的来源 IP 指定
acl internet { ! 192.168.100.0/24; any; }; <==加上惊叹号 (!) 代表反向选择的意思
view "lan" { <==只是一个名字,代表的是内网
match-clients { "intranet"; }; <==吻合这个来源的才使用底下的 zone
zone "." IN {
type hint;
file "named.ca";
};
zone "centos.vbird" IN {
type master;
file "named.centos.vbird";
allow-transfer { 192.168.100.10; };
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "named.192.168.100";
allow-transfer { 192.168.100.10; };
};
};
view "wan" { <==同样,只是个名字而已!
match-clients { "internet"; }; <==代表的则是外网的 internet 来源
zone "." IN {
type hint;
file "named.ca";
};
zone "centos.vbird" IN {
type master;
file "named.centos.vbird.inter"; <==档名必须与原有的不同!
};
// 外网因为没有使用到内网的 IP,所以 IP 反解部分可以不写于此
};
上表中,有些数据是重复的,有些则需要经过修改。现在,让我们来改改 named.centos.vbird.inter 吧!
[root@www ~]# cd /var/named
[root@www named]# cp -a named.centos.vbird named.centos.vbird.inter
[root@www named]# vim named.centos.vbird.inter
$TTL 600
@ IN SOA master.centos.vbird. vbird.www.centos.vbird. (
2011080503 3H 15M 1W 1D )
@ IN NS master.centos.vbird.
master.centos.vbird. IN A 192.168.1.100
@ IN MX 10 www.centos.vbird.
www.centos.vbird. IN A 192.168.1.100
linux.centos.vbird. IN CNAME www.centos.vbird.
ftp.centos.vbird. IN CNAME www.centos.vbird.
forum.centos.vbird. IN CNAME www.centos.vbird.
workstation.centos.vbird. IN A 192.168.1.101
[root@www named]# /etc/init.d/named restart
[root@www named]# tail -n 30 /var/log/messages
[root@www named]# dig www.centos.vbird @192.168.100.254
www.centos.vbird. 600 IN A 192.168.100.254
# 要得到上面的 IP 才是对的喔!因为接口来自于 192.168.100.0/24 网段
[root@wwww named]# dig www.centos.vbird @192.168.1.100
www.centos.vbird. 600 IN A 192.168.1.100
# 要得到上面的 IP 才是对的喔!因为接口来自非 192.168.100.0/24 网段
有没有很简单!这样就能让你的 DNS 依据不同的用户来源,分别给予同一个主机名的不同解析呢!
例题:你的网站读者非常的多,但是分布在世界各地。你想让亚洲区的读者联机到台湾的站台,而其他国家的联机则连到美国的站台, 但又不想要让使用者自己挑选不同的主机名,想使用同一组主机名,此时该如何是好?答:鸟哥可以想到的最简单的方案,就是透过 DNS 来设定相同主机名的不同 IP 目标,亦即是透过 view 来规范即可。 不过,与上述鸟哥的区网简单范例不同,我们得要收集亚洲区的 IP 才行,这些区段可能可以透过底下的网站来取得:
- 五大洲的 IP 管理所属人:http://www.iana.org/numbers/
- 每个单位的 IP 分布: http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml
- 台湾地区 IP 分布: http://rms.twnic.net.tw/twnic/User/Member/Search/main7.jsp?Order=inet_aton%28Startip%29
然后再透过 acl 以及 view 来规范即可。鸟哥的收集资料如下,如果有误,还请告知!
acl asia { 1.0.0.0/8; 14.0.0.0/8; 27.0.0.0/8; 36.0.0.0/8; 39.0.0.0/8;
42.0.0.0/0; 49.0.0.0/8; 58.0.0.0/8; 59.0.0.0/8; 60.0.0.0/8;
61.0.0.0/8; 101.0.0.0/8; 103.0.0.0/8; 106.0.0.0/8; 110.0.0.0/8;
111.0.0.0/8; 112.0.0.0/8; 113.0.0.0/8; 114.0.0.0/8; 115.0.0.0/8;
116.0.0.0/8; 117.0.0.0/8; 118.0.0.0/8; 119.0.0.0/8; 120.0.0.0/8;
121.0.0.0/8; 122.0.0.0/8; 123.0.0.0/8; 124.0.0.0/8; 125.0.0.0/8;
126.0.0.0/8; 175.0.0.0/8; 180.0.0.0/8; 182.0.0.0/8; 183.0.0.0/8;
202.0.0.0/8; 203.0.0.0/8; 210.0.0.0/8; 211.0.0.0/8; 218.0.0.0/8;
219.0.0.0/8; 220.0.0.0/8; 221.0.0.0/8; 222.0.0.0/8; 223.0.0.0/8;
139.175.0.0/16; 140.0.0.0/8;150.116.0.0/16;150.117.0.0/16;
163.0.0.0/8; 168.95.0.0/16;192.0.0.0/8;
};
acl nonasia { ! "asia"; any; };
如上所示,加入 asia 与 nonasia 的相关设定,再使用 view 来处理相关的 zone ,并修改 zone file 内容, 就能够处理好这个案例的需求啰!