文档说明:
本文档以一个案例来介绍如何在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程序就提示安装/升级下述软件了:
安装完成后,就需要启动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服务的话,建议第一时间先查看这个日志文档,看有没有报错:
从DNS服务器中关于zone配置文件更新的日志:
检查DNS服务的端口(端口53)是否有开启:
使用dig命令在从DNS上测试主DNS能否正常解析外网网址:
使用dig命令在从DNS上测试主DNS能否正常解析自己定义的网址:
验证DNS Forwarders是否有正常工作:
从上面的截图可以看出,当我在主DNS服务器(172.31.2.2)上指定DNS为自己去解析jilupian.youku.com时,抓包结果显示,服务器确实将DNS查询转发给了我所配置的ISP的DNS中的一个(202.96.128.166),这表明Forwarders有配置成功。
在本文档最前面的案例说明部分,有提到允许内网主机的解析请求而不允许外网主机的解析请求,并且允许所有主机对域speedsnail.com的解析请求。为了验证这种限制机制是否能生效,先将主DNS服务器上的named.conf配置文件修改成如下所示:
这样修改的话,仍然是所有主机能对域speedsnail.com进行解析,但只有主DNS服务器(172.31.2.2)自身能解析其它的域。重启主DNS上的named服务以让修改生效。然后,在从DNS服务器(172.31.2.3)上进行测试:
可以看到,以172.31.2.2为DNS,外网网址(www.baidu.com)无法解析,而内网网址(www.speedsnail.com)仍然可以解析,这说明,限制解析请求来源IP的设定是正确的。主DNS服务器上的日志也验证了这一点:
总结:
从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.pdf或Bv9ARM.html:BIND 9管理参考手册
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux:Networking Guide手册中有关于DNS服务器架设和配置的介绍。
附件是我这篇文章里使用到的几个配置文件,有需要可下载。
本文出自 “技术永不止步” 博客,请务必保留此出处http://techsnail.blog.51cto.com/9807313/1627731
原文地址:http://techsnail.blog.51cto.com/9807313/1627731