文档说明:

本文档以一个案例来介绍如何在CentOS 7系统上部署DNS服务。该案例仅是我对如何部署DNS服务的知识总结,并非是生产环境中存在的案例。并且,该案例中用到的CentOS系统均是安装在VMware虚拟机内的,虽然一般情况下这不会有什么不妥,但还是特别说明一下。

 

 

案例说明:

本案例使用了两台VMware虚拟机。两台虚拟机上均安装CentOS 7(详细版本号为7.0.1406,核心版本号为3.10.0-123.el7.x86_64),其中一台虚拟机用于模拟Master DNS服务器(假设IP为172.31.2.2),另一台虚拟机用于模拟Slave DNS服务器(假设IP为172.31.2.3)。

并且,假设DNS服务器所在园区网有自己的合法域名,为speedsnail.com,允许所有来源的主机对该域名进行解析。而当园区网内的主机要访问外网域名时,DNS服务器会先查本地缓存,查不到则将该解析请求转发给ISP的DNS服务器(假设IP为202.96.128.86和202.96.128.166),而不是转发给.(root)服务器。并且,只会对内网主机的解析请求进行转发(假设内网网段范围为172.31.0.0/16),而不会对外网主机的解析请求进行转发。

 

 

DNS服务简要介绍:

DNS服务由BIND软件提供,启动后服务名为named,管理工具为rndc,debug工具为dig。主要配置文件为/etc/named.conf

 

 

要架设本案例中DNS服务,可按照如下步骤进行:

1.      在chroot环境下安装BIND软件

要安装BIND软件,并让它运行在chroot环境下。那么只需安装bind-chroot软件,其它软件(包括BIND软件本身)也会自动进行安装,也即只需执行命令:

[root@localhost~]# yum install bind-chroot

执行上述命令后,yum程序就提示安装/升级下述软件了:

wKiom1Uc9QzSxJBnAAEReYlRSZQ499.jpg

安装完成后,就需要启动named-chroot服务,并将它设置为开机启动:

[root@localhost ~]# systemctl start named-chroot

[root@localhost ~]# systemctl enablenamed-chroot

上述命令执行完后,如果没什么问题,可使用下述命令来验证named-chroot服务的状态:

[root@localhost ~]# systemctl status named-chroot

 

2.      设定主DNS服务器上的配置文件/etc/named.conf

在修改主DNS服务器上的配置文件/etc/named.conf之前,先对其备份:

[root@localhost~]# cp –a /etc/named.conf/etc/named.conf.raw

然后将其内容修改成如下所示:

-------------------------------------------------------------------------------------------------------------------------------------

options {

       listen-on port 53 { any; };           //侦听来自任意源IP对端口53的访问

       listen-on-v6 port 53 { ::1; };          //设定IPv6侦听端口的,因为没有用到,所以保持默认

       directory    "/var/named";         //该项设定工作目录

       dump-file   "/var/named/data/cache_dump.db";   //执行命令rndcdumpdb后会把database保存到该指定档案

       statistics-file "/var/named/data/named_stats.txt";   //执行命令rndcstats后会把统计数据保存到该指定档案

       memstatistics-file "/var/named/data/named_mem_stats.txt";  //记录内存使用数据的文档路径

       

       allow-query  { 172.31.0.0/16; };     //指定只有内网网段主机才能进行DNS查询(authoritative data)

       recursion yes;                     //这个选项控制是否开启服务器的递归查询功能

       allow-recursion { 172.31.0.0/16; };  //指定只有内网网段主机才能进行递归查询

       forward first;                     //接收到查询请求时,会先转发到forwarders指定的DNS,查不到再执行递归

       forwarders {                      //(接上面)当然,在转发之前,还会先查本地缓存

                202.96.128.86;

                202.96.128.166;

       };

       

     dnssec-enable no;               //这部分是设置DNSSEC的。把它关掉,默认为yes。

     dnssec-validationno;             //关掉,默认为yes。

     dnssec-lookaside no;             //关掉,默认为auto

        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

       

        pid-file"/run/named/named.pid";               //named服务的PID文件存放位置,保持默认。

        session-keyfile "/run/named/session.key";       //TSIG会话密钥存放文件路径,保持默认。

};

logging {                                             //设置日志的语句

       channel default_debug {

                file"data/named.run";

                severity dynamic;

       };

};

zone "." IN {                                           //设定root zone的语句

       type hint;                                     //hint类型专门用于root域

       file "named.ca";                               //root域的配置文件为/var/named/named.ca

};

zone "speedsnail.com" IN {                            //设定域speedsnail.com的语句

       type master;                                  //指明本服务器是这个域的主DNS服务器

       file "speedsnail.com.zone";                    //指定这个域的配置文件为/var/named/speedsnail.com.zone

       allow-transfer { 172.31.2.3; };                   //指定这个域的从DNS服务器的IP

       allow-query { any; };                           //允许来自任意IP对这个域的解析请求

};

include"/etc/named.rfc1912.zones";                   //zone语句也可以写在这个文件里面

include "/etc/named.root.key";                         //root域的key文件,与DNSSEC有关

-------------------------------------------------------------------------------------------------------------------------------------

 

3.      设定主DNS服务器上的zone配置文件

在上面的配置文件named.conf中,因为有定义一个正向解析的域speedsnail.com,所以也要设定这个域的配置文件speedsnail.com.zone。在工作目录/var/named下创建这个配置文件,并将它的内容修改成如下所示:

-------------------------------------------------------------------------------------------------------------------------------------

$ORIGIN speedsnail.com.

$TTL 86400

;

;在zone的配置文件中,它是以分号来作为批注语句标识符的。

;修改这个配置文件时,要注意,名称最后面没有加句点的是主机名,最后面加了句点的是FQDN(除了$ORIGIN那里)。

;$ORIGIN那里填域名。下面的@符号会引用这里填写的值。如果不填,则会引用主配置文件中zone语句后面的值。

;$TTL表示timeto live值,表示当其它DNS查询到本zone的DNS记录时,这个记录能在它的DNS缓存中存在多久,单位为秒。

;

@      IN  SOA         dns1.speedsnail.com.  xie.speedsnail.com.  (

                          2015040101

                          21600

                          3600

                          604800

                          86400 )

;

;SOA后面的两个参数分别是主DNS服务器主机名和管理者邮箱(xie@speedsnail.com)。因为@符号有特殊含义,所以写成这样。

;括号内的第一个参数是序号,代表本配置文档的新旧,序号越大,表示越新。每次修改本文档后,都要将这个值改大。

;第二个参数是刷新频率,表示slave隔多久会跟master比对一次配置档案,单位为秒。

;第三个参数是失败重新尝试时间,单位为秒

;第四个参数是失效时间,单位为秒。

;在BIND9中,第五个参数表示其它DNS服务器能缓存negative answers的时间,单位为秒。

;

@      IN  NS          dns1.speedsnail.com.

         IN  NS          dns2.speedsnail.com.

dns1   IN  A            172.31.2.2

dns2   IN  A            172.31.2.3

;

;类型NS定义指定域的DNS服务器主机名(如dns1.speedsnail.com),不管是主DNS还是从DNS。

;类型A定义指定主机(如dns1)的IP地址。如果是使用的IPv6地址,则需使用类型AAAA。

;

@         IN  MX  10     mail1.speedsnail.com.

            IN  MX  20     mail2.speedsnail.com.

mail1    IN  A              172.31.2.4

mail2    IN  A              172.31.2.5

;

;类型MX定义指定域的邮件服务器主机名(如mail1.speedsnail.com)。

;MX后面的数字为优先级,越小越优先。同样的优先级值则可以在多台邮件服务器之间进行负载分担。

;

www     IN  CNAME      servs.speedsnail.com.

ftp        IN  CNAME     servs.speedsnail.com.

servs    IN   A              172.31.2.6

;

;类型CNAME用于定义别名。通常用于同一台主机提供多个服务的情况。

;以这里的设定为例,当要解析ftp.speedsnail.com的IP时,它会解析成主机servs.speedsnail.com的IP。

;

forum   IN A              172.31.2.7

travel    IN A              172.31.2.8

            IN A              172.31.2.9

;

;如上面所示,也可以直接设定某一台主机(如forum.speedsnail.com)的IP。

;同一台主机(如travel.speedsnail.com)也可以设定多个IP。

-------------------------------------------------------------------------------------------------------------------------------------

 

4.      设置从DNS服务器

重复第1个步骤,给从DNS服务器安装bind-chroot软件,然后设置开机启动并将它开启。做好后,就修改从DNS服务器的主配置文件/etc/named.conf。从DNS的主配置文件与主DNS的基本相同,因此直接把配置复制过去就行,但zone语句需要进行修改。如下所示,从DNS的named.conf配置文件中的zone语句:

-------------------------------------------------------------------------------------------------------------------------------------

zone "speedsnail.com" IN {

       type slave;                                    //指明本服务器是这个域的从DNS服务器

       file "slaves/speedsnail.com.zone";              //从DNS的zone配置文件一定要放置在工作目录下的slaves目录中

       masters { 172.31.2.2; };                         //指定这个域的主DNS服务器的IP

       allow-query { any; };                           //允许来自任意IP对这个域的解析请求

};

-------------------------------------------------------------------------------------------------------------------------------------

与主DNS不同的是,从DNS上的zone配置文件不需要手动建立,它会通过同步自动建立。因此,从DNS上的配置文件这样就设置好了。

 

5.      放通端口

在主DNS和从DNS服务器上放通tcp和udp端口53:

[root@localhost~]# firewall-cmd --zone=public--add-port=53/tcp --permanent

[root@localhost~]# firewall-cmd --zone=public--add-port=53/udp --permanent

重启防火墙以让更改立刻生效:

[root@localhost~]# firewall-cmd –reload

可使用以下命令检查配置是否成功:

[root@localhost~]# firewall-cmd --list-all

 

6.      设置named服务

在主DNS和从DNS服务器上,启动named服务,并将它设置为开机启动:

[root@localhost~]# systemctl start named

[root@localhost~]# systemctl enable named

上述命令执行完后,如果没什么问题,可使用下述命令来验证named服务的状态:

[root@localhost~]# systemctl status named

 

7.      测试与验证

默认情况下,DNS服务的日志信息会放置到/var/log/messages文档中。如果有修改配置文件,并启动或重启named服务的话,建议第一时间先查看这个日志文档,看有没有报错:

wKioL1Uc9tawSiEnAAVR4tRKgBQ612.jpg

从DNS服务器中关于zone配置文件更新的日志:

wKioL1Uc9yyQJyq2AAHCHAP0ekE523.jpg

检查DNS服务的端口(端口53)是否有开启:

wKiom1Uc9inTtTXxAAJ4yF0YecE862.jpg

使用dig命令在从DNS上测试主DNS能否正常解析外网网址:

wKioL1Uc96fD0i8xAAFow55DsGQ910.jpg

使用dig命令在从DNS上测试主DNS能否正常解析自己定义的网址:

wKiom1Uc9qjBHqJ5AAFwBbjD0ec441.jpg

验证DNS Forwarders是否有正常工作:

wKioL1Uc-D7iQ_e1AAQXZ692zfM716.jpg

从上面的截图可以看出,当我在主DNS服务器(172.31.2.2)上指定DNS为自己去解析jilupian.youku.com时,抓包结果显示,服务器确实将DNS查询转发给了我所配置的ISP的DNS中的一个(202.96.128.166),这表明Forwarders有配置成功。

在本文档最前面的案例说明部分,有提到允许内网主机的解析请求而不允许外网主机的解析请求,并且允许所有主机对域speedsnail.com的解析请求。为了验证这种限制机制是否能生效,先将主DNS服务器上的named.conf配置文件修改成如下所示:

wKioL1Uc-ICDuH4BAAD6XI38iDM248.jpg

这样修改的话,仍然是所有主机能对域speedsnail.com进行解析,但只有主DNS服务器(172.31.2.2)自身能解析其它的域。重启主DNS上的named服务以让修改生效。然后,在从DNS服务器(172.31.2.3)上进行测试:

wKioL1Uc-MWQYYatAAEACkxiyvU084.jpg

可以看到,以172.31.2.2为DNS,外网网址(www.baidu.com)无法解析,而内网网址(www.speedsnail.com)仍然可以解析,这说明,限制解析请求来源IP的设定是正确的。主DNS服务器上的日志也验证了这一点:

wKioL1Uc-QDhuX0FAAIZdK8HRVk053.jpg

 

 

总结:

从DNS软件自身的设定方面来说,在CentOS 7上部署DNS与在更早的系统上部署DNS并没有太大差别,不过底层机制可能有所改变。从系统方面来说,CentOS 7的应用程序服务管理和防火墙管理有所改变,如这篇文章里面使用了systemctl和firewall-cmd,而没有使用chkconfig和iptables。

 

 

可用资料:

named.conf(5):说明/etc/named.conf中各语句格式的man文档

 

/usr/share/doc/bind*/sample/etc/named.conf:/etc/named.conf的配置范例

/usr/share/doc/bind*/sample/etc/named.rfc1912.zones:与文档/etc/named.rfc1912.zones的默认内容是一样的

 

/usr/share/doc/bind*/Bv9ARM.pdfBv9ARM.html:BIND 9管理参考手册

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux:Networking Guide手册中有关于DNS服务器架设和配置的介绍。


附件是我这篇文章里使用到的几个配置文件,有需要可下载。