任何运作中的域名至少有两台DNS服务器,一台称为主域名服务器(比如叫做ns1),而另一台称为从域名服务器(比如叫做ns2)。这些服务器通常用于故障转移:如果一台宕机,另外一台就激活成为DNS服务器(译注:此处译者有不同意见,事实上两个或更多的DNS服务器是共同工作的,并不是第一台停止服务后,第二台才接替工作。解析器是随机选择一个DNS服务器进行询问,如果超时则会询问下一个,这是多个DNS的故障容错机制)。也可以实现包括负载均衡、防火墙和集群在内的更为复杂的故障转移机制。
一个域的所有DNS条目都会被添加到主域名服务器,从服务器只会根据主服务器上的SOA记录的序列号参数从主服务器同步所有信息。
此教程将会讲述如何创建一台在CentOS上运行的主DNS服务器。请注意,本教程中提到的DNS服务器将会是一台开放DNS服务器,这也就是说该服务器将会回应来自任何IP地址的查询。对于DNS服务器的访问控制将在此教程中讨论(译注:开放的DNS服务器是一个安全隐患)。
在开始之前,我想要提一下的是,DNS可以在chroot环境中配置,也可以在非chroot环境中配置。chroot环境将DNS服务器限制在系统中某个特定目录中,以避免让服务器具有系统级的访问权限。在此环境中,任何DNS服务器的安全漏洞不会导致整个系统的破坏。将DNS服务器置于chroot环境中,对于部署测试也很有用。
目标
我们将在基于域名example.tst的测试环境中配置一台DNS服务器,这个域名是虚假的(并不真实存在的)。这样,我们就不会意外干扰到其它真实的域名。
在该域中,有以下三台服务器。
服务器 | IP地址 | 托管的服务 | 完全限定域名(FQDN) |
Server A | 172.16.1.1 | mail.example.tst | |
Server B | 172.16.1.2 | Web, FTP | www.example.tstftp.example.tst |
Server C | 172.16.1.3 | Primary DNS server | ns1.example.tst |
我们将会配置一台主域名服务器,并添加上表中必要的域和DNS记录。
设置主机名
所有的主机名必须以完全限定域名的方式正确定义,可以通过以下方法完成设置。
# vim /etc/sysconfig/network
| |
| | 配置文件路径 | 区域文件路径 |
| 不带有 chroot | /etc/ | /var/named/ |
| 带有 chroot | /var/named/chroot/etc/ | /var/named/chroot/var/named/ |
可以使用默认提供的named.conf配置文件,但是为了更方便使用,我们将使用另外一个简单的配置文件模板。
非chroot环境:
# cp /usr/share/doc/bind-9.8.2/sample/etc/named.rfc1912.zones /etc/named.conf
chroot环境:
# cp /usr/share/doc/bind-9.8.2/sample/etc/named.rfc1912.zones /var/named/chroot/etc/named.conf
现在来备份并修改配置文件。
非chroot环境:
# vim /etc/named.conf
chroot环境:
# vim /var/named/chroot/etc/named.conf
添加/修改以下行:
options {
## 区域文件存放目录 ##
directory "/var/named";
## 对于非本地权威域的请求转发到 Google 的公开 DNS 服务器 ##
forwarders { 8.8.8.8; };
};
## 申明一个本地域 example.tst ##
zone "example.tst" IN {
type master;
file "example-fz"; ## 存储文件名,放在 /var/named ##
allow-update { none; };
};
## 为IP段 172.16.1.0 提供反向解析 ##
zone "1.16.172.in-addr.arpa" IN {
type master;
file "rz-172-16-1"; ## 存储文件名,放在 /var/named ##
allow-update { none; };
};
准备区域文件
那些默认的区域文件会自动创建到/var/named 或者/var/named/chroot/var/named (chroot环境)。如果在这些地方找不到这些文件,/usr/share/doc/bind目录中提供了模板文件,可以从这里拷贝。
假设默认区域文件没有提供,我们可以从/usr拷贝模板文件。
非chroot环境:
# cp /usr/share/doc/bind-9.8.2/sample/var/named/named.* /var/named/
chroot环境:
# cp /usr/share/doc/bind-9.8.2/sample/var/named/named.* /var/named/chroot/var/named
很好!由于现在默认的区域文件已经准备好,我们可以为example.tst和172.16.1.0网络创建区域文件了,以下要点必须时刻谨记。
- 区域文件中的特殊字符‘@’意味着空。(译注:意即代表本域。)
- 所有的完全限定域名必须以点‘.’结束。如:example.tst.如果没有这个点,你会发生问题。(译注:即会被当做当前@所代表的域的子域。)
1. 转发区域(本地权威域)
转发区域包含了名称到IP地址的映射。对于公开的域,域名托管提供商的DNS服务器存储了转发区域文件。(译注:转发区域即本地的权威域,由这个服务器自身提供权威的解析数据)
非chroot环境:
# vim /var/named/example-fz
chroot环境:
# vim /var/named/chroot/var/named/example-fz
$TTL 1D
@ IN SOA ns1.example.tst. sarmed.example.tst. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns1.example.tst.
1 IN PTR mail.example.tst.
2 IN PTR www.example.tst.
3 IN PTR ns1.example.tst.
说明:除了下面的参数外,反向区域文件中的大多数参数和转发区域文件中的相同。
- PTR: IP反向解析记录,指向一个反向限定域名。
结束工作
既然区域文件已经准备好,我们接下来调整它们的权限。
非chroot环境:
# chgrp named /var/named/*
chroot环境:
# chgrp named /var/named/chroot/var/named/*
现在,我们为DNS服务器设置IP地址。
# vim /etc/resolv.conf
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31184
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 86400 IN A 172.16.1.3
;; AUTHORITY SECTION:
example.com. 86400 IN NS ns1.example.com.
;; ADDITIONAL SECTION:
ns1.example.com. 86400 IN A 172.16.1.3
2. 使用dig测试PTR记录
使用dig来测试时,必须时刻关注状态信息:“NOERROR”,任何其它值都表明存在问题。(译注,也可用 dig 1.1.16.172.in-addr.arpa. ptr 来测试。)
# dig -x 172.16.1.1
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35405
;; QUESTION SECTION:
;example.tst. IN MX
;; ANSWER SECTION:
example.tst. 14366 IN MX 10 mail.example.tst.
排错提示
- 我已经把SELinux关闭。
- 保证防火墙没有阻挡UDP 53端口
- 万一出错,可在/var/log/messages中查看到有用的信息
- 确保区域文件的属主为‘named’
- 确保DNS服务器的IP地址是/etc/resolv.conf中的第一条目
- 如果你使用example.tst作为实验环境,确保将服务器从互联网断开,因为example.tst是一个不存在的域。
最后小结,该教程关注的是实验环境中配置example.tst域用作为演示。请注意,该教程中创建了一台公共DNS服务器,此服务器会回应来自任何源IP地址的查询。如果你是在配置DNS生产服务器,请确保检查与公共DNS相关的策略。其它教程涵盖了创建从DNS服务器, 限制对DNS服务器的访问以及部署DNSSEC。
希望此教程对您有所帮助。
via: http://xmodulo.com/2014/04/primary-dns-server-using-centos.html
发表回复