在搭建DNS服务器之前,可以了解一下在什么情况才需要搭建DNS服务器,以及在什么情况下不需要搭建DNS服务器。在此之前,需要了解DNS中域(domain)和区域(zone)的基本概念,以及DNS资源记录的类型,如果对此不熟悉,可以参考我写的上一篇文章《Caching only DNS的设置与forwarding功能》


一、为什么需要自己搭建DNS服务器?


搭建DNS服务器的原因大致有三点:

(1)一般公司都有多台Server需要接入互联网上并提供服务,此时公司需要向ISP申请一个域(domain),而这多台Server则由公司所在的这个域下。

(2)一般来说,用户访问服务器时通常是根据FQDN查询到IP地址的,而如果FQDN或者IP地址经常有可能要变动时,最好能够自己搭建DNS服务器管理,这样修改起来方便。

(3)当你的Server的数量需要经常变动时,如果搭建了DNS服务器,而Server的FQDN与主机名的对应关系数据存放在这台DNS服务器上,那么只需要自己手动添加新的对应关系即可。


当然了,如果只有一台Server需要接入互联网并向其他主机提供网络服务时,这时只需要申请并让上层DNS服务器管理员帮你设置好hostname与IP地址的对应关系即可,不需要自己搭建DNS服务器。



二、正向解析库文件、反向解析库文件


在上一篇博客中有提到,对于一个域(domain)来说,受其管理的有其下层的子域和主机。一个域(domain)可以包含一个或多个正向解析区域、反向解析区域,但域是一种逻辑概念,而区域(zone)是针对每个要解析的域来定义的。区域的这种定义主要体现在解析库文件上,也就是说,一个区域代表一个解析库文件。但一个解析库文件只能是正向解析和反向解析中的一种。总结来说,对于向互联网提供DNS服务的DNS服务器来说,通常只负责解析某一个域。每一台DNS服务器可以管理一个或多个区域,每个区域可以是正解或反解的。


既然对于每个要解析的域需要用解析库文件来定义,而每个解析库文件就代表一个区域,那么就有必要知道要解析的域是哪些。基本上,根据主机名查询到IP地址的流程称为正向解析,其对应一个正向解析库文件;根据IP地址查询到主机名的流程称为反向解析,其对应一个反向解析库文件。


接下来介绍正向、反向解析库文件中必要的资源记录。


2.1 如何申请DNS正解、反解的设置权?


申请DNS正解的设置权:

任何人都可以向服务商(ISP)注册申请一个域名,只要这个域名还没有被注册。只要注册了域名,就可以使用了。需要注意的是,因为INTERNIC已经定义了TLD,所以自己定义的域名必须是在上层DNS所在域范围内才行,例如你可以申请itab.com、itab.org、itab.cn等域名,但不能随便自定义并申请一个叫做itab.hello这样的域名。总的来说,自定义并且要申请的域名必须符合INTERNIC和ISP规范。


申请DNS反解的设置权:

上面申请DNS正解设置权是向ISP申请在某一上层DNS服务器所管理的域中添加我们的DNS服务器的NS记录和A记录,比如要申请itab.com这个域名,则需要申请在.com这个域的DNS服务器上添加itab.com这个域的NS记录和NS记录对应的A记录。那反解呢?同样地,如果有反解的需求,就需要向你的直属上层ISP申请。比如要申请10.168.192.in-addr.arpa这个域,则需要向管理168.192.in-addr.arpa这个域的DNS服务器的ISP申请。而IP地址是由INTERNIC发放给各家ISP的,而且IP地址是不能够随便设置的(路由问题)。


2.2 DNS的正向解析库文件中必要的资源记录


因为是正向解析,所以重点是根据FQDN查询到IP地址。而一个区域解析库文件是针对某一个域(domain)来定义的,因此在这个域内DNS服务器的FQDN与IP地址的映射也要定义清楚(不然别人没办法查询到这个域所管理的子域和主机信息)。总的来说,正向解析库文件至少应该有以下几种资源记录类型:

①SOA记录

起始授权记录定义了当前区域的区域名称(也可以是当前区域名的主DNS服务器FQDN)、当前区域管理员的邮箱地址、主从服务协调属性的定义以及否定答案的缓存时间TTL。

②NS记录

NS记录定义了当前区域内一个或多个DNS服务器FQDN。

③A记录或AAAA记录

A记录定义了当前区域内各台主机的FQDN到IPv4地址的对应关系,AAAA记录定义了当前区域内各台主机的FQDN到IPv6地址的对应。在正向解析库文件中,对于MX、NS等各类型记录的value为FQDN,此FQDN都需要有对应的一个A记录或AAAA记录。


2.3 DNS反向解析库文件中必要的资源记录


反向解析的重点是由FQDN查询到IP地址,所以反向解析库文件中必要的资源记录类型至少应该有SOA,NS,PTR。SOA和NS记录在上面正向解析已经介绍,这里简单说明一下PTR记录。

PTR记录

就是指向(PoinTeR)的缩写,后面记录的是根据IP地址反解到的FQDN.



三、搭建一个DNS服务器


现在以itab.com这个域为例搭建局域网内的DNS服务器,这个DNS服务会监听在port 53。如果要想让互联网上的其他主机能够访问到本地DNS服务器所管理的主机,需要向ISP注册,并且让DNS服务监听在能够与外部主机进行通信的IP地址的port 53之上。但这里只是作为实验,所以搭建的DNS服务器仅可由本地局域网范围之内使用。


接下来以我的主机(192.168.10.140)搭建DNS服务器。

配置解析一个正向区域的步骤:

(1)定义区域

(2)建立区域数据库文件(主要记录为A记录或AAAA记录)

(3)让服务器重载配置文件和区域数据库文件


配置解析一个反向区域的步骤:

(1)定义区域

(2)建立区域数据库文件(主要记录为PTR记录)

(3)让服务器重载配置和区域数据库文件



3.1 配置解析一个正向区域


(1)定义区域

在主配置文件中(/etc/named.conf)或主配置文件中包含进来的辅助配置文件中(/etc/named.rfc1912.zones)实现,其格式为:

zone "ZONE_NAME" IN {
    type {master|slave|hint|forward};    //四选一。
    file "ZONE_NAME.zone";               //区域数据库文件名可自定义。
}

区域类型:

master:主DNS服务器,可作为DNS主从服务中的主DNS服务器。

slave:从DNS服务器,是DNS主从服务中的从DNS服务器。

hint:根域服务器,是DNS服务器内置的区域,一般安装bind之后在配置文件中就有根域的定义了,这是由bind的rpm包制作者提供的。

forward:转发DNS服务器,详解请见上一篇博客《Caching only DNS的设置与forwarding功能》


查看根域的定义:

[root@www ~]# vim /etc/named.conf

zone "." IN {
    type hint;    //记录.这个域(domain)的区域(zone)的类型。
    file "named.ca";    //根域的正解区域数据库文件为/var/named/named.ca。
};

# 其它信息省略。

基本上,每台DNS服务器都至少需要定义两个区域(zone),一个是hint,一个是关于自己域的正解zone,而hint这个区域是DNS服务器内置的。当DNS在自己的数据库中找不到所需的信息时,一定会从根域开始迭代查询,所以根域的区域定义不能少。


需要注意的是,为了让主配置文件/etc/named.conf保持整洁,一般自定义区域可在/etc/named.rfc1912.zones文件中定义。


这里以itab.com这个域为例,在主配置文件的辅助配置文件/etc/named.rfc1912.zones中添加定义如下区域:

zone "itab.com" IN {
    type master;
    file "itab.com.zone";
};

注意:区域名字即为域名。


(2)建立区域数据库文件(主要记录为A记录或AAAA记录)

因为在主配置文件中的全局配置段(options段)里定义了一项:

directory   "/var/named";

所以,在定义zone时的file参数时,后面跟的文件名默认应该存放于/var/named/目录下。


因此,这一步中需在/var/named/目录下创建区域解析库文件itab.com.zone:

[root@www ~]# vim /var/named/itab.com.zone 
$TTL 3600    //在开头全局声明TTL值,之后在每一条记录中TTL值都继承这个值,无须再写。
$ORIGIN itab.com.    //定义域名,这里的定义会覆盖默认的ORIGIN变量值。
@       IN      SOA     ns1.itab.com.       dnsadmin.itab.com.  ( 
                2017032901
                1H
                10M
                2H
                1W )
        IN      NS      ns1
        IN      MX  10  mx1
        IN      MX  20  mx2
ns1     IN      A       192.168.10.140
mx1     IN      A       192.168.10.3
mx2     IN      A       192.168.10.4
www     IN      A       192.168.10.140
web     IN      CNAME   www
bbs     IN      A       192.168.10.140
bbs     IN      A       192.168.10.141

需要注意的是,同一个IP地址可以对应多个FQDN(同一台主机可以提供多种服务),而同一个FQDN可以对应多个IP地址(负载均衡)。


为了让其他用户不能访问区域数据库文件,需要把其他用户设置为无任何权限,而且同时还需要把属组设置为named。所以,配置好区域数据库文件之后,还需要修改属组和权限。

[root@www ~]# chgrp named /var/named/itab.com.zone    //修改属组为named。
[root@www ~]# chmod o= /var/named/itab.com.zone    //设置其他用户没有任何权限。
[root@www ~]# ll /var/named/itab.com.zone        //查看区域数据库文件属性。
-rw-r-----. 1 root named 384 3月  29 23:19 /var/named/itab.com.zone

修改属组的还可以用chgrp,如下:

[root@www ~]# chown :named /var/named/itab.com.zone
[root@www ~]# ll /var/named/itab.com.zone

这样即使named进程被劫持也不能修改区域数据库文件中的内容了。


接下来还需要检查语法错误。

检查主配置文件/etc/named.conf以及主配置文件include进来的辅助配置文件(包括/etc/named.rfc1912.zones)是否有语法错误的命令是named-checkconf,而检查区域数据库文件是否有语法错误的命令是named-checkzone,其使用格式如下:

# named-checkzone ZONE_NAME ZONE_FILE
                  区域名    区域数据库文件路径

示例:

[root@www ~]# named-checkconf
//检查主配置文件是否有语法错误,若无任何显示则表示没有语法错误。

[root@www ~]# named-checkzone itab.com /var/named/itab.com.zone   //检查区域数据库文件
zone itab.com/IN: loaded serial 2017032901
OK    //显示OK即无错误。


(3)让服务器重载配置文件和区域数据库文件


如果没有任何语法错误,就可以直接重载了。

[root@www ~]# rndc reload
server reload successful

# 或者:
[root@www ~]# systemctl reload named.service


可用rndc查看DNS服务状态:

[root@www ~]# rndc status
version: 9.9.4-RedHat-9.9.4-37.el7 <id:8f9657aa>
CPUs found: 2
worker threads: 2    //DNS服务线程数。
UDP listeners per interface: 2    //表示在每个网络接口上启动的udp监听个数。
number of zones: 7    //当前加载的zone的个数。
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000    //当前为多少个DNS客户端做递归查询,包括能够接受请求并做
                               //递归查询的DNS客户端数量。
tcp clients: 0/100    //当前已建立tcp连接的客户端的数量。
server is up and running    //表示服务已经启动并正常运行了。


这样一个正向解析库文件就配置好,这里进行测试

测试之前确保/etc/resolv.conf文件中配置的DNS指向为192.168.10.140,如下:

[root@www ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.10.140


itab.com这个域的区域数据库文件中各资源记录如下:

wKioL1jgbtyjPpKYAABMYEFwMhY270.png


使用dig工具测试NS记录:

[root@www ~]#  dig -t NS itab.com

;; ANSWER SECTION:
itab.com.		3600	IN	NS	ns1.itab.com.


测试A记录:

[root@www ~]#  dig -t A web.itab.com

;; ANSWER SECTION:
web.itab.com.		3600	IN	CNAME	www.itab.com.
www.itab.com.		3600	IN	A	192.168.10.140


[root@www ~]#  dig -t A bbs.itab.com

;; ANSWER SECTION:
bbs.itab.com.		3600	IN	A	192.168.10.140
bbs.itab.com.		3600	IN	A	192.168.10.141


测试MX记录:

[root@www ~]#  dig -t MX itab.com

;; ANSWER SECTION:
itab.com.		3600	IN	MX	20 mx2.itab.com.
itab.com.		3600	IN	MX	10 mx1.itab.com.


测试SOA记录:

[root@www ~]#  dig -t SOA itab.com

;; ANSWER SECTION:
itab.com.		3600	IN	SOA	ns1.itab.com. dnsadmin.itab.com. 2017032901 3600 600 7200 604800

经测试,正向解析没有问题。


3.2 配置解析一个反向区域


(1)定义区域

这一步骤跟之前类似,需要注意的一点是反解区域的区域名称遵循特定格式(反写网段地址、加特定后缀)。反解区域的区域名称格式如下:

反写网段地址.in-addr.arpa

举个例子,要反解的IP所在网段为192.168.10.0/24,所以反解区域名称就需要写成10.168.192.in-addr.arpa


这里就以192.168.10.0/24这个网段作为示例定义区域:

[root@www ~]# vim /etc/named.rfc1912.zones
//在文件中添加如下内容。
zone "10.168.192.in-addr.arpa" IN {
    type master;
    file "10.168.192.zone";
};


检查主配置文件的语法错误:

[root@www ~]# named-checkconf 
[root@www ~]#

没有任何提示,说明没有语法错误。


(2)建立区域数据库文件(主要记录为PTR记录)


[root@www ~]# vim /var/named/10.168.192.zone    //文件名需要与配置文件中定义的一致。
$TTL 3600
$ORIGIN 10.168.192.in-addr.arpa.
@       IN      SOA     ns1.itab.com.       nsadmin.itab.com.   (
                2017040101
                1H
                10M
                10H
                12H )
        IN      NS      ns1.itab.com.
140     IN      PTR     ns1.itab.com.
32      IN      PTR     mx1.itab.com.
33      IN      PTR     mx2.itab.com.
34      IN      PTR     www.itab.com.
35      IN      PTR     bbs.itab.com.
34      IN      PTR     bbs.itab.com.

注意,在反向区域数据库中不需要定义MX记录。另外,和正向区域数据库一样,同一个IP地址可以对应多个FQDN,一个FQDN也可以对应一个IP地址。


检查反向解析数据库文件是否有语法错误:

[root@www ~]# named-checkzone 10.168.192.in-addr.arpa /var/named/10.168.192.zone
zone 10.168.192.in-addr.arpa/IN: loaded serial 2017040101
OK    //语法正确。


修改属组及权限:

[root@www ~]# chgrp named /var/named/10.168.192.zone 
[root@www ~]# chmod o= /var/named/10.168.192.zone
[root@www ~]# ll /var/named/10.168.192.zone
-rw-r-----. 1 root named 327 4月   1 22:00 /var/named/10.168.192.zone


(3)让服务器重载配置和区域数据库文件

[root@www ~]# rndc reload
server reload successful


使用rndc查看DNS服务状态:

[root@www ~]# rndc status
version: 9.9.4-RedHat-9.9.4-37.el7 <id:8f9657aa>
CPUs found: 2
worker threads: 2
UDP listeners per interface: 2
number of zones: 8    //zone的数量+1.
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running


反向区域数据库文件内容如下:

wKioL1jgfD3xKTECAAA_m_KBgnU385.png


测试

由IP反向解析得到FQDN:

[root@www ~]# dig -x 192.168.10.32

;; ANSWER SECTION:
32.10.168.192.in-addr.arpa. 3600 IN	PTR	mx1.itab.com.

经测试,反向解析没有问题。



四、主-从DNS服务器


在生产环境中,为了实现高可用,通常使用两台或多台服务器提供服务,而DNS服务也不例外。但DNS服务器有多台时,系统管理员就不得不手动为多台服务器配置DNS服务,而且还有可能导致配置出错问题,因此就需要使用主-从同步(或者主-辅同步)的机制了。有了主从同步,系统管理员只需要在主DNS服务器上配置修改,而其他从DNS服务器可以自动地、动态地从主DNS服务器那里“复制”一份同样的数据进行同步操作,极为方便。

主-从DNS服务器的职责:

主DNS服务器:维护所负责解析的域数据库的那台DNS服务器,读写操作均可进行。
从DNS服务器:从主DNS服务器那里或其他从DNS服务器那里“复制”一份数据库,但只能进行读操作。


那么从服务器是如何与主DNS服务器进行同步操作的?在上一篇文章中有提到,SOA记录中的信息包括了主从服务协调属性的定义,所以SOA也是同步机制的一种。但这还不够,根据SOA记录,假如设置为从DNS服务器每10分钟到主DNS服务器同步一次数据库的数据,那么如果刚完成某次同步操作时,主DNS服务器马上发生了变化,这样就会导致从DNS服务器有将近10分钟的时间没有更新数据库,而不管是主DNS服务器还是从DNS服务器都是同时向外提供解析服务的,DNS客户端就可能无法查询到结果或查询到错误的结果。为了解决这一问题,除了SOA记录的参数作为同步的参考,还需要引入另外的机制:主DNS服务器只要有更新数据就立即通知从DNS服务器。总结一下,主从同步的实施方式为:

(a)依据SOA记录

序列号:serial,即数据库的版本号,主DNS服务器数据库内容发生变化时,其版本号要递增。

刷新时间间隔:refresh,从DNS服务器每隔多久到主DNS服务器检查序列号更新状况。

重试时间间隔:retry,从DNS服务器从主DNS服务器同步数据库失败时,定义多久之后再次发起尝试请求。

过期时长:expire,从DNS服务器始终联系不上主DNS服务器时,定义多久之后放弃从主DNS服务器同步数据库,并停止提供服务。

否定答案的缓存时长。

(b)一旦更新数据,主DNS服务器立即“通知”从DNS服务器更新数据


接下来介绍主-从DNS服务器的配置。因为在上面已经配置好了一台DNS服务器,且类型为master,因此直接将之作为主DNS服务器即可,这里只需要再配置一台从DNS服务器。主-从DNS服务器用到的主机如下:

主DNS服务器:192.168.10.140    # CentOS 7系统,主机名修改为master.
从DNS服务器:192.168.10.128    # CentOS 6系统,主机名为slave.

需要注意的是,从DNS服务器是区域级别的概念,一个从DNS服务器是一个或多个区域的“从”(slave)(这一个或多个区域在主DNS服务器上定义),而不是一开始就作为整台DNS服务器上所有区域的“从”。


因此,配置一个从区域的步骤如下(首先确保从DNS服务器上安装了bind):

On Slave:

(1)定义一个从区域

zone "ZONE_NAME" IN {
    type slave;
    file "slaves/ZONE_NAME.zone";    //数据库文件应该同步到/var/named/slaves目录下。
    masters { MASTER_IP; };    //说明主DNS服务器是哪台。
};

配置好之后对配置文件的语法进行检查:

[root@slave ~]# named-checkconf


这里把从区域的数据库文件存放在/var/named/slaves目录下,是因为从DNS服务器向主DNS服务器同步数据库时,这个同步操作是由named进程进行的,而named进程是守护进程,由named用户发起,因此对/var/named/目录不具有写权限,如下:

[root@slave ~]# ps aux | grep named | grep -v 'grep'
named     22451  1.5  2.6 236376 12724 ?       Ssl  15:11   0:00 /usr/sbin/named -u named
# 可见,named进程由named用户发起。

[root@slave ~]# ll -d /var/named/
drwxr-x--- 5 root named 4096 Mar 28 08:16 /var/named/
# 属主为root,属组为named,named用户不具有写权限。


但bind专门为named同步内置了一个/var/named/slaves目录,对named来说有写权限:

[root@slave ~]# ll -d /var/named/slaves/
drwxrwx--- 2 named named 4096 Jan 17 21:04 /var/named/slaves/
# named用户具有写权限。

因此,/var/named/slaves目录专用于从DNS服务器从主DNS服务器那里同步数据文件时,需要动态地、自动地创建数据文件。

这里需要注意的是,如果直接把/var/named/的属主改为named,虽然也可以让从DNS服务器自动地创建数据文件,但会引入风险,一旦named进程被劫持,则named所有数据文件会被清空。


(2)重载配置

[root@slave ~]# rndc reload

如果是首次启动,则:
[root@slave ~]# service named start    //CentOS 6.
[root@slave ~]# systemctl reload named.service    //CentOS 7.


On Master:

确保区域数据库文件中为每个从服务器配置NS记录,而且,如果是正向区域文件,还需要为每个从服务器的NS记录配置一个A记录;如果是反向区域文件,则需要为每个从服务器的NS记录配置一个PTR记录。



现在分别为上面配置的主DNS服务器上的正、反向区域做从区域:

On Slave:

修改全局配置段,使其监听在任何地址的53端口上,并设置允许任何人查询:

options {
    ... ...
    listen-on port 53 { any; };
    allow-query     { any; };
    dnssec-enable no;
    dnssec-validation no;
    ... ...
};


定义从区域:

[root@slave ~]# vim /etc/named.rfc1912.zones
# 在文件中添加如下内容。
zone "itab.com" IN {        //为itab.com这个域做从区域。
    type slave;
    file "slaves/itab.com.zone";
    masters { 192.168.10.140; };
};

zone "10.168.192.in-addr.arpa" IN {        //为10.168.192.in-addr.arpa这个域做从区域。
    type slave;
    file "slaves/10.168.192.zone";
    masters { 192.168.10.140; };
};


检查语法错误:

[root@slave ~]# named-checkconf 
[root@slave ~]#     //语法正确。


On Master:

在/var/named/itab.com.zone中添加从DNS服务器的NS记录以及与之对应的A记录:

[root@master ~]# vim /var/named/itab.com.zone

$TTL 3600
$ORIGIN itab.com.
@       IN      SOA     ns1.itab.com.       dnsadmin.itab.com.  (
                2017032901
                1H
                10M
                2H
                1W )
        IN      NS      ns1
        IN      NS      ns2        //从DNS服务器的NS记录
        IN      MX  10  mx1
        IN      MX  20  mx2
ns1     IN      A       192.168.10.140
ns2     IN      A       192.168.10.128    //与从DNS服务器的NS记录对应的A记录
mx1     IN      A       192.168.10.3
mx2     IN      A       192.168.10.4
www     IN      A       192.168.10.140
web     IN      CNAME   www
bbs     IN      A       192.168.10.140
bbs     IN      A       192.168.10.141


在/var/named/10.168.192.zone中添加从DNS服务器的NS记录以及与之对应的A记录:

[root@master ~]# vim /var/named/10.168.192.zone

$TTL 3600
$ORIGIN 10.168.192.in-addr.arpa.
@       IN      SOA     ns1.itab.com.       nsadmin.itab.com.   (
                2017040101
                1H
                10M
                10H
                12H )
        IN      NS      ns1.itab.com.
        IN      NS      ns2.itab.com.    //从DNS服务器的NS记录
140     IN      PTR     ns1.itab.com.
128     IN      PTR     ns2.itab.com.    //与从DNS服务器的NS记录对应的PTR记录    
32      IN      PTR     mx1.itab.com.
33      IN      PTR     mx2.itab.com.
34      IN      PTR     www.itab.com.
35      IN      PTR     bbs.itab.com.
34      IN      PTR     bbs.itab.com.


将/etc/named.conf文件全局配置段中的不允许转发注释掉:

[root@master ~]# vim /etc/named.conf
options {
    ... ...
//  allow-transfer  { none; };
    ... ...
};


为itab.com和10.168.192.in-addr.arpa这两个区域设置允许192.168.10.128这个主机(从DNS服务器)进行区域转发:

[root@master ~]# vim /etc/named.rfc1912.zones
# 其他内容省略。
zone "itab.com" IN {
    type master;
    file "itab.com.zone";
    allow-transfer { 192.168.10.128; };    //仅允许192.168.10.128主机进行区域转发。
};

zone "10.168.192.in-addr.arpa" IN {
    type master;
    file "10.168.192.zone";
    allow-transfer { 192.168.10.128; };    //仅允许192.168.10.128主机进行区域转发。
};


检查语法错误:

[root@master ~]# named-checkconf 
[root@master ~]#


分别重载主从DNS服务器

On Master:

[root@master ~]# rndc reload
server reload successful


On Slave:

[root@slave ~]# rndc reload
server reload successful

如果之前没有启动过named服务,则直接启动即可。

[root@slave ~]# service named start
Starting named: named: already running                     [  OK  ]


查看状态信息:

wKioL1jgbNGQ8Pw0AAEmlR-m5-4261.png


wKiom1jgbNKjsxvVAACNs0JHTPM628.png


wKioL1jgbNKiORnUAACuxpaYwOk593.png


在从服务器上能看到传送过来的区域文件,并且能够通过本地解析才行:

[root@slave ~]# ll /var/named/slaves/
total 8
-rw-r--r-- 1 named named 454 Mar 28 16:37 10.168.192.zone
-rw-r--r-- 1 named named 521 Mar 28 16:37 itab.com.zone


测试:

[root@slave ~]# dig -t A web.itab.com @192.168.10.128

;; ANSWER SECTION:
web.itab.com.		3600	IN	CNAME	www.itab.com.
www.itab.com.		3600	IN	A	192.168.10.140


[root@slave ~]# dig -x 192.168.10.34 @192.168.10.128

;; ANSWER SECTION:
34.10.168.192.in-addr.arpa. 3600 IN	PTR	bbs.itab.com.
34.10.168.192.in-addr.arpa. 3600 IN	PTR	www.itab.com.

经测试,没有问题。


现在在主DNS服务器上的正向和反向区域数据库文件中分别添加一条A记录与PTR记录,测试从DNS服务器是否能够同步。

On Master:

[root@master ~]# vim /var/named/itab.com.zone
# 为该正向区域数据库添加一条A记录。
$TTL 3600
$ORIGIN itab.com.
@       IN      SOA     ns1.itab.com.       dnsadmin.itab.com.  (
                2017032902        //修改之后记得增加版本号
                1H
                10M
                2H
                1W )
        IN      NS      ns1
        IN      NS      ns2
        IN      MX  10  mx1
        IN      MX  20  mx2
ns1     IN      A       192.168.10.140
ns2     IN      A       192.168.10.128
mx1     IN      A       192.168.10.3
mx2     IN      A       192.168.10.4
www     IN      A       192.168.10.140
web     IN      CNAME   www
bbs     IN      A       192.168.10.140
bbs     IN      A       192.168.10.141
pop3    IN      A       192.168.10.103    //添加该A记录


[root@master ~]# vim /var/named/10.168.192.zone
# 为该反向区域数据库添加一条PTR记录。
$TTL 3600
$ORIGIN 10.168.192.in-addr.arpa.
@       IN      SOA     ns1.itab.com.       nsadmin.itab.com.   (
                2017040102        //修改之后记得增加版本号
                1H
                10M
                10H
                12H )
        IN      NS      ns1.itab.com.
        IN      NS      ns2.itab.com.
140     IN      PTR     ns1.itab.com.
128     IN      PTR     ns2.itab.com.
32      IN      PTR     mx1.itab.com.
33      IN      PTR     mx2.itab.com.
34      IN      PTR     www.itab.com.
35      IN      PTR     bbs.itab.com.
34      IN      PTR     bbs.itab.com.
123     IN      PTR     pop3.itab.com.    //添加该PTR记录


检查区域数据库文件语法错误:

[root@master ~]# named-checkzone itab.com /var/named/itab.com.zone
zone itab.com/IN: loaded serial 2017032902
OK
[root@master ~]# named-checkzone 10.168.192.in-addr.arpa /var/named/10.168.192.zone 
zone 10.168.192.in-addr.arpa/IN: loaded serial 2017040102
OK


重载服务:

[root@master ~]# rndc reload
server reload successful


查看日志:

wKiom1jggXKCWJl8AACl_dkBrYI238.png


On Slave:

用dig工具(或host、nslookup等)测试:

[root@slave ~]# dig -t A pop3.itab.com @192.168.10.128

;; ANSWER SECTION:
pop3.itab.com.		3600	IN	A	192.168.10.103


[root@slave ~]# dig -x 192.168.10.123 @192.168.10.128

;; ANSWER SECTION:
123.10.168.192.in-addr.arpa. 3600 IN	PTR	pop3.itab.com.

同步成功!



五、时间同步


任何在分布式环境中让多台服务器彼此之间基于某种特定应用进行协调的服务都应该配置时间同步。对于DNS服务来说,如果不配置时间同步,有可能会导致从服务器无法同步主服务器的数据库。但即便同步了时间,再过一段时间后仍然有可能导致误差,因此可以利用周期性计划,让其每隔一段时间同步一次。而在Linux上进行时间同步需要用到utpdate命令,这里使用互联网上的一个时间服务器:cn.pool.ntp.org.


查看ntpdate命令的程序文件路径:

[root@master ~]# which ntpdate 
/usr/sbin/ntpdate


配置周期性任务计划:

[root@master ~]# crontab -e

0 0 * * * /usr/sbin/ntpdate cn.pool.ntp.org


这里需要注意的是,要想与cn.pool.ntp.org进行同步,首先必须解析cn.pool.ntp.org这个FQDN,而解析是需要一定的时间的,所以如果想省去解析FQDN占用的时间,或者担心因为某种原因导致解析不成功,从而无法同步时,可以先获取cn.pool.ntp.org的IP地址:

[root@master ~]# dig -t A cn.pool.ntp.org

;; ANSWER SECTION:
cn.pool.ntp.org.	16	IN	A	51.15.41.135
cn.pool.ntp.org.	16	IN	A	163.172.177.158
cn.pool.ntp.org.	16	IN	A	79.98.105.18
cn.pool.ntp.org.	16	IN	A	213.239.204.119

这里随意选取一个IP地址即可,这里就选取51.15.41.135这个地址吧!


用IP地址来配置周期性任务计划:

[root@master ~]# crontab -e

0 0 * * * /usr/sbin/ntpdate 51.15.41.135

这样进行时间同步时就不需要解析FQDN了。同样地,从服务器也需要配置时间同步,方法和上述一样。



六、区域传送


上面在做主从DNS同步的时候,可以注意到在主DNS服务器的区域中定义了一个条目:

allow-transfer { IP; };

表示该区域的区域数据库文件内容允许谁传送,一般建议主服务器的allow-transfer后的IP地址是从DNS服务器的IP地址(保证安全性)。


区域传送有两种:

①全量传送:axfr,传送整个数据库。
②增量传送:ixfr,仅传送变化的数据。


可以在从DNS服务器上模拟全量传送:

[root@slave ~]# dig -t axfr itab.com @192.168.10.140   //模拟传送itab.com这个区域的传送

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.4 <<>> axfr itab.com @192.168.10.140
;; global options: +cmd
itab.com.		3600	IN	SOA	ns1.itab.com. dnsadmin.itab.com. 2017032902 3600 600 7200 604800
itab.com.		3600	IN	NS	ns1.itab.com.
itab.com.		3600	IN	NS	ns2.itab.com.
itab.com.		3600	IN	MX	10 mx1.itab.com.
itab.com.		3600	IN	MX	20 mx2.itab.com.
bbs.itab.com.		3600	IN	A	192.168.10.140
bbs.itab.com.		3600	IN	A	192.168.10.141
mx1.itab.com.		3600	IN	A	192.168.10.3
mx2.itab.com.		3600	IN	A	192.168.10.4
ns1.itab.com.		3600	IN	A	192.168.10.140
ns2.itab.com.		3600	IN	A	192.168.10.128
pop3.itab.com.		3600	IN	A	192.168.10.103
web.itab.com.		3600	IN	CNAME	www.itab.com.
www.itab.com.		3600	IN	A	192.168.10.140
itab.com.		3600	IN	SOA	ns1.itab.com. dnsadmin.itab.com. 2017032902 3600 600 7200 604800
;; Query time: 8 msec
;; SERVER: 192.168.10.140#53(192.168.10.140)
;; WHEN: Sun Apr  2 13:45:28 2017
;; XFR size: 15 records (messages 1, bytes 342)

模拟传送成功,说明可以正常传送数据,即可以正常同步。


[root@slave ~]# dig -t axfr 10.168.192.in-addr.arpa    //模拟传送itab.com这个区域的传送

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.4 <<>> axfr 10.168.192.in-addr.arpa
;; global options: +cmd
; Transfer failed.
[root@slave ~]# dig axfr 10.168.192.in-addr.arpa @192.168.10.140

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.4 <<>> axfr 10.168.192.in-addr.arpa @192.168.10.140
;; global options: +cmd
10.168.192.in-addr.arpa. 3600	IN	SOA	ns1.itab.com. nsadmin.itab.com. 2017040102 3600 600 36000 43200
10.168.192.in-addr.arpa. 3600	IN	NS	ns1.itab.com.
10.168.192.in-addr.arpa. 3600	IN	NS	ns2.itab.com.
123.10.168.192.in-addr.arpa. 3600 IN	PTR	pop3.itab.com.
128.10.168.192.in-addr.arpa. 3600 IN	PTR	ns2.itab.com.
140.10.168.192.in-addr.arpa. 3600 IN	PTR	ns1.itab.com.
32.10.168.192.in-addr.arpa. 3600 IN	PTR	mx1.itab.com.
33.10.168.192.in-addr.arpa. 3600 IN	PTR	mx2.itab.com.
34.10.168.192.in-addr.arpa. 3600 IN	PTR	www.itab.com.
34.10.168.192.in-addr.arpa. 3600 IN	PTR	bbs.itab.com.
35.10.168.192.in-addr.arpa. 3600 IN	PTR	bbs.itab.com.
10.168.192.in-addr.arpa. 3600	IN	SOA	ns1.itab.com. nsadmin.itab.com. 2017040102 3600 600 36000 43200
;; Query time: 1 msec
;; SERVER: 192.168.10.140#53(192.168.10.140)
;; WHEN: Sun Apr  2 13:47:01 2017
;; XFR size: 12 records (messages 1, bytes 322)


但其他主机无法获取主DNS服务器上区域的数据库:

[root@www ~]# ip a
# 其它信息省略。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.10.110/24 brd 192.168.10.255 scope global eth0
# 这台主机的IP的地址192.168.10.110.
[root@www ~]# 
[root@www ~]# 
[root@www ~]# dig -t axfr itab.com @192.168.10.140

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.4 <<>> axfr itab.com @192.168.10.140
;; global options: +cmd
; Transfer failed.    //获取数据库失败。