1. 概述
在网络环境中一般用户只需要在浏览器中输入url如www.sunny.com就可以到对应服务器获取相应的信息。事实上服务器是不能根据www.sunny.com这样的地址找到对应的服务需要需要根据ip来找到对应的服务。那么网络上ip是怎么得到的呢这就要得益于dns服务器的工作。本文将对dns的工作原理dns常见的服务设置进行介绍最后本文将附上一篇dns自动化脚本方便用户快速搭建dns服务器。
2 原理介绍
DNS( Domain Name System)是“域名系统”的英文缩写是一种组织成域层次结构的计算机和网络服务命名系统它用于TCP/IP网络它所提供的服务是用来将主机名和域名转换为IP地址的工作。
DNS的域名结构如下
根域: 全世界只有13台这13台根域名服务器应该是理解为13组有13个根域ip地址名字分别为“A”至“M”1个为主根服务器在美国。其余12个均为辅根服务器其中9个在美国欧洲2个位于英国和瑞典亚洲1个位于日本。
顶级域即一级域名Top Level Domain: tld
com, edu, mil, gov, net, org, int,arpa
三类组织域、国家域(.cn, .ca, .hk, .tw)、反向域
最多是允许127级域名。
ICANNThe Internet Corporation for Assigned Names and Numbers互联网名称与数字地址分配机构负责在全球范围内对互联网通用顶级域名gTLD以及国家和地区顶级域名ccTLD系统的管理、以及根服务器系统的管理
这里涉及正向解析和反向解析两个概念
FQDN: Fully Qualified Domain Name 完全合格的域名如www.sunny.com
正向解析将FQDN 解析为 IP
反向解析将IP 解析为 FQDN
解析过程如下
Client -->hosts文件-->DNS Service Local Cache--> DNS Server (recursion递归查看本地配置的解析文件) --> Server Cache --> iteration(迭代) --> 根--> 顶级域名DNS-->二级域名DNS…最终本地dns查看结果后返回给客户端
详细过程解释如下
1、在浏览器中输入www.sunny.com域名操作系统会先检查自己本地的/etc/hosts文件是否有这个网址映射关系如果有就先调用这个IP地址映射完成域名解析。
2、如果/etc/hosts里没有这个域名的映射则查找本地DNS解析器缓存是否有这个网址映射关系如果有直接返回完成域名解析。
3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系首先会找TCP/ip参数中设置的首选DNS服务器在此我们叫它本地DNS服务器此服务器收到查询时如果要查询的域名包含在本地配置区域资源中则返回解析结果给客户机完成域名解析此解析具有权威性。
4、如果要查询的域名不由本地DNS服务器区域解析但该服务器已缓存了此网址映射关系则调用这个IP地址映射完成域名解析此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效则根据本地DNS服务器的设置是否设置转发器进行查询如果未用转发模式本地DNS就把请求发至13台根DNS根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后如果自己无法解析它就会找一个管理.com域的下一级DNS服务器地址(sunny.com)给本地DNS服务器。当本地DNS服务器收到这个地址后就会找sunny.com域服务器重复上面的动作进行查询直至找到www.sunny.com主机。
6、如果用的是转发模式此DNS服务器就会把请求转发至上一级DNS服务器由上一级服务器进行解析上一级服务器如果不能解析或找根DNS或把转请求转至上上级以此循环。不管是本地DNS服务器用是是转发还是根提示最后都是把结果返回给本地DNS服务器由此DNS服务器再返回给客户机。
以上的解析中涉及到dns的两种查询类型即 递归查询和迭代查询
递归查询客户端向服务器查询叫递归查询
迭代查询DNS之间的查询叫迭代查询如查询www.sunny.com本地dns先询问根根返回结果让本地dns去询问com.这台dns然后本地查询com.这台dnscom.这台返回给本地dns让其去查询sunny.com.这台dns本地dns再次查询sunny.com.这台dns最终sunny.com.这台dns告诉本地dnswww.sunny.com的地址。迭代查询结束
3 dns常见服务搭建
dns启用的是C/S结构同时用到TCP和UDP的53端口还有TCP953端口。
UDP的53端口用于供用户查询同时也是用于主从服务器的同步
TCP的53端口用来提供同步主从服务器的zone文件
tcp的953端口是用来管理dns服务器的端口通过rndc(remote name domain controller)这个工具进行管理rndc--> rndc(953/tcp)
rndcCOMMAND
.COMMAND:
reload: 重载主配置文件和区域解析库文件
reload zonename: 重载区域解析库文件
retransfer zonename: 手动启动区域传送,而不管序列号是否增加
notify zonename: 重新对区域传送发通知
reconfig: 重载主配置文件
querylog: 开启或关闭查询日志文件/var/log/message
trace: 递增debug一个级别
trace LEVEL: 指定使用的级别
notrace:将调试级别设置为0
flush:清空DNS服务器的所有缓存记录
需要安装的包如下
bind服务器
bind-libs相关库
bind-utils:客户端
bind-chroot:启用bind-chroot相当于是通过目录挂载目录的操作实现了文件搬家的效果dns服务相关的配置会被重新挂载到/var/named/chroot/目录下把dns相关的文件的目录和文件都进行了搬家原来的路径和文件还是可以正常访问如果dns被攻击了那么受到的危害只会存在/chroot这个目录下
3.1 配置文件介绍
.服务脚本和名称
CentOS6上/etc/rc.d/init.d/named
CentOS7上/usr/lib/systemd/system/named.service
这里介绍dns服务中涉及到的四类配置文件etc/named.conf,/etc/named.rfc1912.zones/var/named/named.ca/var/named/下的正反向资源记录文件
named.conf
这个文件总共就记录三部分内容
option配置各种全局的选项
loggin配置和log相关的文件
zone配置区域数据库即服务器的资源记录本机能够为哪些zone进行解析就要定义哪些zone配置区域数据库即服务器的资源记录
include在配置文件里关键字include表示包含别的配置文件
配置文件每一行都是以分号结束
任何服务程序如果期望其能够通过网络被其它主机访问至少应该监听在一个能与外部主机通信的IP地址上
option中有以下五个选项,介绍如下
allow-query {}:允许查询的主机;白名单 allow-transfer {}:允许区域传送的主机;白名单 allow-transfer {192.168.32.63;192.168.32.71},允许指定的ip来复制配置文件 allow-recursion {}: 允许递归的主机,建议全局使用 allow-update {}: 允许更新区域数据库中的内容
named.rfc1912.zones
这个是区域配置文件这些zone配置也可以直接配置在named.conf这个配置文件里但是一般不建议配置文件太大所n以把对zone的配置单独分离出来放在named.rfc1912.zones这个配置文件里。
named.rfc1912.zones这个文件里的一段配置为例子说明
zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; };
zone后面的双引号内localhost是域名表示要解析哪个域的内容
其中urlwww.sunny.comwww是服务器的主机名sunny.com是域名
IN表示internet记录
type类型
file区域数据库文件如sunny.com.zone这个文件在目录/var/named下面其中/var/named/named.localhost是zone模板可以直接拷贝这个文件进行修改拷贝注意要加-p要不然组为named会被更改掉
allow-update是指运行从客户端直接运行语句对数据库解析文件进行修改这个配置只在主服务器上配置
/var/named/named.ca
named.ca这个文件是根的资源解析文件默认是记录13台根服务器的NS和A记录
/var/named/下的正反向资源记录文件
注意
(1) 一台物理服务器可同时为多个区域提供解析
(2) 必须要有根区域文件named.ca
(3) 应该有两个如果包括ipv6的应该更多实现localhost和本地回环地址的解析库
记录了dns服务器中的正向和方向解析的资源。这个文件是由多个资源记录RR:Resource Record组成的。每个资源记录都有各自的记录类型A, AAAA, PTR, SOA, NS, CNAME, MX。
.SOAStart Of Authority起始授权记录一个区域解析库有且仅能有一个SOA记录必须位于解析库的第一条记录
.Ainternet Address作用FQDN --> IP
.AAAA: FQDN --> IPv6
.PTR: PoinTeRIP --> FQDN反向解析记录
.NS: Name Server专用于标明当前区域的DNS服务器
@符号在dns中代表本域
A记录和NS记录是配对出现的要一起配置NS一般配置在A记录之前
.CNAMECanonical Name别名记录
.MX:Mail eXchanger邮件交换器发邮件的时候是先查dns然后在把这个邮件发到dns对应的邮箱服务器的ip的邮箱里比如MX后面的10和20值越小优先级越高优先使用
接下来分别针对每个记录类型进行详细介绍
资源记录定义的格式
语法name [TTL] IN rr_type value
.注意
.(1) TTL可从全局继承,这里是以时间为单位生命期表示客户机用户缓存的有效期默认是1天可以修改如果不写就是默认的1天
.(2) @可用于引用当前区域的名字也可以用当前的域名来表示如sunny.com.注意com后面的点号要加上
.(3) 同一个名字可以通过多条记录定义多个不同的值即ip此时
DNS服务器会以轮询方式响应
.(4) 同一个值也可能有多个不同的定义名字通过多个不同的名字指向同一个值进行定义此仅表示通过多个不同的名字可以找到同一个主机
.(5)$ORIGIN 功能是告知这个域的域名。假设有一个域名是test.net.,服务器名称定义为linux,这里定义$ORIGIN . ($ORIGIN后面有一个点号)而不是定义为$ORIGIN test.net.如果手工在前面加$ORIGIN .的话,默认域就不是test.net了,所以在test.net这个文件中就要用FQDN了,不能用IN NS linux的形式,要写成test.net. IN NS linux.test.net.
SOA记录
soa是授权服务器回复给查询者SOA记录表明了谁是这个区域的所有者即表明自己管理此zone并告知序列号、刷新时间、过期时间等
.name: 当前区域的名字例如“sunny.com.”
.value: 有多部分组成
.(1) 当前区域的主DNS服务器的FQDN也可以使用当前区域的名字
.(2) 当前区域管理员的邮箱地址但地址中不能使用@符号一般用.替换
例如linuxedu.sunny.com
.(3) 主从服务区域传输相关定义以及否定的答案的统一的TTL
SOA的格式如下
域名可以用@代替TTL IN SOA dns的server名称邮箱
例子
sunny.com. 86400 IN SOA ns.sunny.com. nsadmin.sunny.com. ( 2017092201 ;序列号 2H ;刷新时间 10M;重试时间 1W;过期时间 1D;否定答案的TTL值 )
dns数据库的内容如下。这个文件要自己在/var/named下创建后缀为.zone
dns的server名称可以理解为是注释用的没有实际作用可以自己指定只要这个名称和下面配置的A记录要解析的服务器一致就可以
邮箱邮箱地址@在dns里有特殊含义表示本域所以要把@符号换成点号。如[email protected]要改成admin.sunny.com.注意这里以.号结束
named.localhost里SOA这条记录中列号、刷新时间、过期时间字段解释如下
序列号serial解析库版本号主服务器解析库变化时其序列要手动将其递增版本号决定该数据库内容是否更新这个数字很关键如果dns数据库有更新这个数值要手动更新.版本号最长10位可以用日期来作为版本的信息如2017091901
刷新时间间隔 refresh从服务器从主服务器请求同步解析的时间间隔
重试时间间隔retry从服务器请求同步失败时再次尝试时间间隔这里相当于是pull操作
过期时长expire从服务器联系不到主服务器时多久后停止服务如果超过这个时间还没刷新就表示这个从dns异常该从服务器将不提供查询
最短时间minimum是指否定结果的缓存期当失败的时候也会缓存缓存时间就是这个时间如当用户输入输入的地址如wwwwww.baidu.com,这个url是错误的得到了否定的答案即dns服务器经过解析后发现这个是错误的地址会把这个信息缓存下来请求的条目不存在等原因导致无法返回结果在这个minimum时间段内用户再次访问这个错误的urldns会直接返回错误而不再次进行查询
主从服务器在同步时即更新数据库文件有两种机制
push: 推机制主服务器push给从服务器主服务器有变则主动推送给从服务器瞬间完成。
pull: 拉机制从服务器pull主服务器从服务器定期地同步主服务器即刷新时间间隔。如果刷新时间失败则在重试时间间隔再次同步。源文档<http://www.178linux.com/49999>
NS记录
.name: 当前区域的名字
.value: 当前区域的某DNS服务器的名字例如 ns.sunny.com.
.注意一个区域可以有多个NS记录
例如
sunny.com. IN NS ns1.sunny.com. sunny.com. IN NS ns2.sunny.com.
.注意
(1) 相邻的两个资源记录的name相同时后续的可省略
(2) 对NS记录而言任何一个ns记录后面的服务器名字都应该在后续有一个A记录
MX记录
.name: 当前区域的名字
.value: 当前区域的某邮件服务器(smtp服务器)的主机名
.一个区域内MX记录可有多个但每个记录的value之前应该有一个数字(0-99)表示此服务器的优先级数字越小优先级越高
.例如
sunny.com. IN MX 10 mx1.sunny.com. IN MX 20 mx2.sunny.com.
.注意
对MX记录而言任何一个MX记录后面的服务器名字都应该在后续有一个A记录
A记录
.name: 某主机的FQDN例如www.sunny.com.
.value: 主机名对应主机的IP地址
.例如
www.sunny.com. IN A 1.1.1.1 www.sunny.com. IN A 2.2.2.2 mx1.sunny.com. IN A 3.3.3.3 mx2.sunny.com. IN A 4.4.4.4 $GENERATE 1-254 HOST$ A 1.2.3.$ $GENERATE 1-254 HOST$ A 1.2.3.$ # 表示HOST1 对应的ip是1.2.3.1HOST100 对应的解析ip是1.2.3.100 *.sunny.com. IN A 5.5.5.5 sunny.com. IN A 6.6.6.6 @ IN A 192.168.25.123
.避免用户写错名称时给错误答案可通过泛域名解析进行解析至某特定地址
以下两个写法
*.sunny.com表示服务器端这边没有定义的都是指向规定的ip表示当用户输入sunny前面的任何东西都是可以被解析为192.168.25.106这个ip如输入aaaa.sunny.com结果会被指向192.168.25.106这个ip对应的网页
@ IN A 192.168.25.123表示当用户输入sunny.com的时候(sunny前不输入任何内容)就会解析成192.168.25.123这个ip
AAAA记录
指向IPV6地址
name: FQDN
value: IPv6
PTR记录
反向解析地址到域名
PTR是pointer的简写用于将一个IP地址映射到对应的域名也可以看成是A记录的反向IP地址的反向解析。PTR主要用于邮件服务器比如邮箱[email protected]给邮箱[email protected]发了一封邮件yahoo邮件服务器接到邮件时会查看这封邮件的头文件并分析是由哪个IP地址发出来的然后根据这个IP地址进行反向解析如果解析结果对应XXX.com的IP地址就接受这封邮件反之则拒绝接收这封邮件。
源文档<http://www.cnblogs.com/zcy_soft/archive/2013/09/23/3335235.html>
name: IP有特定格式把IP地址反过来写1.2.3.4要写
作4.3.2.1而有特定后缀in-addr.arpa.所以完整写法为
4.3.2.1.in-addr.arpa.
value: FQDN
.例如
4.3.2.1.in-addr.arpa. IN PTRwww.sunny.com.
如1.2.3为网络地址可简写成
4 IN PTRwww.sunny.com.
.注意网络地址及后缀可省略主机地址依然需要反着写
CNAME记录
CNAMECanonical Name别名记录允许您将多个名字映射到同一台计算机。通常用于同时提供WWW和MAIL服务的计算机。例如有一台计算机名为“host.mydomain.com”A记录它同时提供WWW和MAIL服务为了便于用户访问服务。可以为该计算机设置两个别名CNAMEWWW和MAIL这两个别名的全称就“www.mydomain.com”和“mail.mydomain.com”实际上他们都指向“host.mydomain.com”。
源文档<http://www.cnblogs.com/zcy_soft/archive/2013/09/23/3335235.html>
name: 别名的FQDN
value: 真正名字的FQDN
.例如
www.sunny.com. IN CNAME websrv.sunny.com.
3.2 服务器配置
一般服务器类型可以分成五种:主服务器 从服务器 转发服务器 子域服务器 根服务器
3.2.1 主DNS服务器
管理和维护所负责解析的域内解析库的服务器
主服务器需要编辑的文件有/etc/named.conf, /etc/named.rfc1912.zones还有在/var/named这个目录下创建一个解析库这个文件可以复制/var/named/named.localhost作为副本并且更改名称为在主服务器上写的file的名称即可一般改名为域名.zone,如域名sunny.com那么file就写sunny.com.zone
配置主DNS服务器
.主DNS名称服务器
IP 192.168.32.63
(1) 在主配置文件/etc/named.conf中定义区域和配置option设置。当然,这里如果zone很多,建议将定义区域写入单独的文件/etc/named.rfc1912.zones里面
options { listen-on port 53 { localhost; }; //这里的监听端口里,要把对应的ip加进去,但是每次改动本地ip可能都要改这里的p 所以如果要监听本地的ip,可以直接把127.0.0.1这一行直接改成localhost; listen-on-v6 port 53 { ::1; }; 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; }; //允许哪些机器来查这台服务器进行dns的解析查询 allow-transfer { 192.168.32.63; }; //允许哪台从dns来拷贝区域解析文件 recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; #正向解析区域文件 zone "sunny.com" IN { type master; file "sunny.com.zone"; allow-update { none; }; };
#反向解析区域文件 zone "50.18.172.in-addr.arpa" IN { type master; file "50.18.172.zone"; allow-update { none; }; };
其中,zone的配置模板如下
zone "ZONE_NAME" IN { type {master|slave|hint|forward}; file "ZONE_NAME.zone"; };
zone "ZONE_NAME" IN { type {master|slave|forward}; file "网络地址.zone" //这里自己定义,网络地址位网络按反写,如32.168.192,要和后面数据库的文件要和这个同名 };
allow-update是指运行从客户端直接运行语句对数据库解析文件进行修改,只在主服务器上配置
(2) 定义区域解析库文件 /var/named/sunny.com.zone
出现的内容
宏定义
资源记录
例子如下
正向解析资源文件
$TTL 1D $ORIGIN sunny.com. @ IN SOA masterdns admin.sunny.com. ( 2017092113 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS masterdns NS slave1 MX 10 mailsrv1 MX 20 mailsrv2 masterdns A 192.168.32.61 slave1 A 192.168.32.63 www CNAME webser ftp CNAME webser webser A 172.18.50.88 http A 172.18.50.66 https A 172.18.50.29 tftp A 172.18.50.96 mailsrv1 A 172.18.50.72 mailsrv2 A 172.18.50.73 反向解析文件如下 $TTL 1D @ IN SOA masterdns.sunny.com. admin.sunny.com. ( 2017092122 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS masterdns.sunny.com. IN NS slave1.sunny.com. $ORIGIN 50.18.172.in-addr.arpa. 88 IN PTR www.sunny.com. 66 IN PTR http.sunny.com. 88 IN PTR ftp.sunny.com. 29 IN PTR https.sunny.com. 72 IN PTR mailsrv1.sunny.com. 73 IN PTR mailsrv2.sunny.com.
.主配置文件语法检查
named-checkconf
.解析库文件语法检查
named-checkzone "sunny.com"/var/named/sunny.com.zone
重新加载配置两个方法如果不能生效建议直接重启服务
rndc status|reload; service named reload
3.2.2 从DNS服务器
IP 192.168.32.63
从主服务器或从服务器“复制”区域传输解析库副本通过通知机制主服务器解析库发生变化时会主动通知从服务器从服务器会将主服务器的区域解析文件拷贝到本地进行更新解析库副本。这里涉及到两种传输
完全传输传送整个解析库第一次启动从服务器的时候把主服务器的区域解析文件全部拷贝下来
增量传输传递解析库变化的那部分内容后续主服务器区域解析文件部分更新时可以增量传输
配置好从服务器后默认会在/var/named/slaves这个路径下生成文件该文件是从主服务器上拷贝下来的解析库的副本而文件的名称是在配置主文件的时候写的file的名称一般是命名为域名.slaves.zone,如域名sunny.com那么file就写sunny.com.slaves.zone
配置文件例子如下
option中,和主的区别就是没有了allow-transfer{ip;};的配置,其他和主一样即可
options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; 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; dnssec-enable no; dnssec-validation no; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; zone "sunny.com" IN { type slave; #定义为从服务器 masters { 192.168.32.61; }; file "slaves/sunny.com.slave.zone"; }; zone "50.18.172.in-addr.arpa" IN { type slave; masters { 192.168.32.61; }; file "slaves/50.18.172.slave.zone"; };
从服务器不需要定义区域解析文件,重启dns服务器,会将主服务器上的区域解析文件复制到/var/named/slaves/下面,文件名字会更改为zone里的file定义的名字
3.2.3 转发DNS服务器
IP 192.168.32.73
转发DNS服务器,也叫缓存服务器,只需启用dns服务不需要做配置一般就开启了转发的功能该dns会将请求直接抛给根dns服务器去然后再一步步解析下去。开启dns服务后把dns配置文件里关于安全检查dnssec-enable和dnssec-validation配置设为no,关闭安全检查。
例子如下
options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; 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; forward first; //这里有first和only两个选项 forwarders { 192.168.32.72;}; dnssec-enable no; //充当转发服务器这两个配置要关闭 dnssec-validation no; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; };
重启dns服务即可。
forward first|only;
first用户请求发到本地,如果没有就发到指定的转发服务器上,如果指定的服务器上没有,就自己到互联网的根上查找
only只将请求发到转的dns上,如果没有,自己也不会去找根dns了
3.2.4 子域服务器
父域dns服务器IP:192.168.32.75,父域为com.
子域dns服务器IP:192.168.32.61 和192.168.32.63, 子域为 sunny.com.
子域授权每个域的名称服务器都是通过其上级名称服务器在解析库进行授权
严格来说子域服务器可以不算做是一类dns服务器,因为子域服务器可以充当主dns服务器。
当域中的dns解析的地址较少的时候不需要授权其他子dns机器进行管理有两种解决办法
a.只需要在其中的一台dns服务器的资源解析文件里把解析记录写可以如在主dns的解析域里添加以下的解析记录类似根域授权tld
sunny.com. IN NS ns1.sunny.com.
ns1.sunny.com. IN A 2.2.2.1
b.可以新建一个子域的zone放在同一台服务器上将对应子域的解析资源配置写入新的zone
但是如果下级域有很多那么建议授权另一台子域服务器来管理下级域的dns解析减少主dns的负荷也便于管理。
例子
在父域dns 192.168.32.75上增加4条记录NS 和A记录如com这个域授权子域dns 192.168.32.61和63 管理sunny.com这个子域,其中61和63又是主从的关系,这样一来,当其中有一台宕机,也不会影响子域的查询
正向解析文件如下
$TTL 1D @ IN SOA masterdns admin.sunny.com. ( 2017092112 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS masterdns sunny.com. NS dns1.sunny.com. sunny.com. NS dns2.sunny.com. masterdns A 192.168.32.75 dns1.sunny.com. A 192.168.32.61 dns2.sunny.com. A 192.168.32.63
反向解析文件如下
$TTL 1D @ IN SOA masterdns.com. admin.sunny.com. ( 2017092110 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS masterdns.com. sunny.com. IN NS sunny1.sunny.com. sunny.com. IN NS sunny2.sunny.com. 75.50.18.172.in-addr.arpa. IN PTR masterdns.com. 61.50.18.172.in-addr.arpa. IN PTR sunny1.sunny.com. 63.50.18.172.in-addr.arpa. IN PTR sunny2.sunny.com.
在子域dns 192.168.32.61上资源解析文件上/var/named/sunny.com.zone写入如下的配置这样一来父域服务器就可以解析子域上的配置,从服务器上的63不需要做变更,会同步主服务器61上的区域解析文件的配置,正反解析文件,参考主服务器的解析文件。不需要有任何变更
重启服务后,75就完成了对61和63两台机器的子域授权。
3.2.5 根dns服务器
到这里我们已经完成了主从服务器,转发服务器,子域服务器的结束。接下来,增加根服务器的介绍。完成一套完整的dns环境
根服务器IP:192.168.32.72
com域IP:192.168.32.75
sunny.com.域IP:192.168.32.61和63
转发服务器IP:IP:192.168.32.73
注意,由于这里模拟将192.168.32.72根服务器,所以其他4台dns的/var/named.ca这个文件要修改,不能用默认的13台dns服务器的解析文件,将named.ca文件的内容修改如下
. 518400 IN NS root root 3600000 IN A 192.168.32.72
named.ca只需要这两句配置即可
将转发服务器的 forwarder {ip;};这句配置的ip改为是192.168.32.72,即根dns的ip.
根服务器上要把配置文件里的这段关于指定根区间解析文件的配置的file改成自定义的区域解析文件,授权com域。
根服务器配置文件如下
options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; 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; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; zone "." IN { type master; file "root.zone"; }; zone "32.168.192.in-addr.arpa" IN { type master; file "32.168.192.zone"; };
根服务器委派com域,即在72这台的/var/named下添加区域解析文件,授权com这个子域
正向解析文件
$TTL 1D @ IN SOA root admin.sunny.com. ( 2017092201 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS root com. NS dns2.com. root A 192.168.32.72 dns2.com. A 192.168.32.75
反向解析文件
$TTL 1D @ IN SOA root admin.sunny.com. ( 2017092201 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS root. com. IN NS dns2.com. 72.32.168.192.in-addr.arpa. IN PTR root. 75.32.168.192.in-addr.arpa. IN PTR dns2.com.
重启根dns服务器后,就完成了完整的dns系统的解析
4 dns 其他相关功能和服务介绍
4.1 基于key的主从验证
在dns主从的配置里,除了设置允许ip来拷贝区域解析文件外,还可以通过key的验证来允许,只有和主服务器配置相同key的从服务器才能复制主服务器的区域解析文件,进一步达到了安全设置
4.2 ACL
.bind中基础的安全相关的配置:
acl: 把一个或多个地址归并为一个集合,并通过一个统一的名称调用
.格式:
acl acl_name{ ip; net/prelen; …… };
.示例:
acl mynet{ 172.16.0.0/16; 10.10.10.10; };
.bind有四个内置的acl:
none: 没有一个主机
any: 任意主机
localhost: 本机
localnet: 本机的IP同掩码运算后得到的网络地址
.注意:只能先定义,后使用;因此一般定义在配置文件中,处于options的前面
4.3 view 功能
view可以理解成多个区域的集合
不同的ip访问同一dns得到不一样的结果,这是根据根据view来实现
.view:视图,一个bind服务器可定义多个view,每个view中可定义一个或多个zone
.每个view用来匹配一组客户端
.多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件
步骤
1.定义acl
2.定义view,把所有的zone都放到对应的view里,不同view里的zone不一样,使得的到的dns解析结果不一样
3.如果没有匹配,就指定match any,然后给定一个区域
.格式:
view VIEW_NAME { match-clients { testacl; }; zone “sunny.com” { type master; file “sunny.com.zone”;}; include “/etc/named.rfc1912.zones”; };
.注意:
(1) 一旦启用了view,所有的zone都只能定义在view中
(2) 仅在允许递归请求的客户端所在view中定义根区域
(3) 客户端请求到达时,是自上而下检查每个view所服务的客户端列表
智能DNS就是根据VIEW来实现
一些CDN( Content Delivery Network)加速的功能,客户可以在自己的dns上设定别名,如www别名为host1.aliyun.com.这里的host1.aliyun.com.是指CDN公司的dns,当用户访问公司的www网址时,发到host1.aliyun.com.这个dns去做解析。这个是智能dns的一个使用。
关于以上的这三个介绍,将在半自动化脚本中举例介绍。
5 dns测试和排错
5.1 测试
测试命令:dig,host,nslookup
5.1.1 dig
.dig [-t type] name [@SERVER] [query options]
dig只用于测试dns系统,不会查询hosts文件进行解析
-t选项将查询类型设置为类型。 它可以是BIND 9支持的任何有效查询类型。默认查询类型为“A”,除非提供-x选项以指示反向查找。 可以通过指定一种AXFR来请求区域传输。 当需要增量区域传输(IXFR)时,类型设置为ixfr = N。 增量区域传输将包含对区域所做的更改,因为区域的SOA记录中的序列号为N.
.查询选项:
+[no]trace:跟踪解析过程: dig +tracesunny.com
+[no]recurse:进行递归解析
测试反向解析:
dig -x IP = dig –t ptrreverseip.in-addr.arpa
模拟区域传送:
dig -t axfr ZONE_NAME @SERVER
dig -t axfr sunny.com @10.10.10.11
dig -t axfr100.1.10.in-addr.arpa @172.16.1.1
dig -t NS . @114.114.114.114
dig -t NS . @a.root-servers.net
关于axfr的相关解释
DNS中有两种域维护手段,一种是全量传输AXFR(full zone transfer),另一种是增量传输IXFR(incremental zone transfer)。
5.1.2 host
.host [-t type] name [SERVER]
注意,host和dig的语法区别是server前,dig加@符号,同时,dig可以跟查询选项,如trace,recurse
host -t NS sunny.com 172.16.0.1 host -t soa sunny.com host -t mx sunny.com host -t axfr sunny.com
host 1.2.3.4
5.1.3 nslookup
.nslookup命令:nslookup[-option] [name | -] [server]
.交互式模式:
nslookup>
server IP: 指明使用哪个DNS server进行查询
set q=RR_TYPE: 指明查询的资源记录类型
NAME: 要查询的名称
5.1.4 压力测试
.压力测试
准备一个大文件test.txt(这个文件里的域名要存在,且有大量的域名,如20000个,可以重复域名,而且可以被当前的dns解析),测试dns的性能,实现压力测试,一般在上线前做的测试,全负荷工作。启用日志功能,性能也会降低
test.txt
准备文件,如下
vim test.txt www.sunny.com A sunny.com NS sunny.com MX pop3.sunny.com A web.sunny.com A
.打开日志功能
rndc querylog
查看rndc的相关状态
rndc status
运行如下的命令进行压力测试
queryperf -d test.txt -s 127.0.0.1
5.2 排错
.查看是否为权威记录,flags:aa标记判断
.被删除的记录仍能返回结果,可能是因为*记录存在
.如:*.example.com.INA172.25.254.254
.注意“.”的使用
.避免CNAME指向CNAME记录,可能产生回环
test.example.com. IN CNAME lab.example.com.
lab.example.com. IN CNAME test.example.com.
.正确配置PTR记录,许多服务依赖PTR,如sshd,MTA
.正确配置轮询round-robin记录.
可使用dig +trace排错,可能是网络和防火墙导致。
#dig A example.com ; <<>>DiG9.9.4-RedHat-9.9.4-14.el7 <<>> A example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<-opcode: QUERY, status: NOERROR, id: 30523 .... SERVFAIL:Thenameserverencountered a problem whileprocessing the query.
根据status里的不同返回结果来定位问题
.NXDOMAIN:The queried name does not exist in the zone.
NXDOMAIN查询的域名不存在资源记录器里。可能是CNAME对应的A记录不存在导致
.REFUSED:The nameserverrefused the client‘s DNS
request due to policy restrictions.可能是DNS策略导致
.NOERROR不代表没有问题,也可以是过时的记录
6 半自动化脚本
#!/bin/bash # #****************************************************************************** #Author: Sunny #Date: 2017-09-20 #FileName: install_dns.sh #version: 1.0 #Your change info: #Description: For auto install dns server #DOC URL: #Copyright(C): 2017 All rihts reserved #***************************************************************************** min_time () { time=`date +%Y%m%d%H%M` } os_version=$(cat /etc/system-release | grep -o " [0-9]"| cut -d " " -f2) echo "Enter 1 : install master dns" echo "Enter 2 : install slave dns" echo "Enter 3 : install transmit dns" echo "Enter 4 : install sub zone dns" echo "Enter 5 : See how to config key authentication for slaves dns to copy master dns zone resource file with key" echo "Enter 6 : See how to config acl function" echo "Enter 7 : See how to config view function" min_time; rpm -q bind &>/dev/null || yum -y install bind &>/dev/null; rpm -q bind-chroot&>/dev/null || yum -y install bind-chroot &>/dev/null rpm -q bind-utils &>/dev/null || yum -y install bind-utils &>/dev/null [ -e /etc/named.conf ] && cp /etc/named.conf /etc/named.conf."$time".bak || { echo "/etc/named.conf is not exist,please check";exit 2; } [ -e /etc/named.rfc1912.zones ] && cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones."$time".bak || { echo "/etc/named.rfc1912.zones is not exist,please";exit 6; } mastercheck(){ named-checkconf || echo "Something wrong in /etc/named.conf,Please check" named-checkzone $domain /var/named/"$domain".zone || echo "something was wrong in /var/named/"$domain".zone,please check" named-checkzone "$arpaip".in-addr.arpa /var/named/"$arpaip".zone || echo "something was wrong in /var/named/"$arpaip".zone,please check" } masterconfzone(){ #config /etc/named.conf echo "Attention: It will install a master dns,which can provide FQDN-->IP and IP-->FQDN query,and sub-zone" echo "The master dns will allow any host to query" sed -i ‘s/listen-on port.*/listen-on port 53 { localhost; };/g‘ /etc/named.conf sed -i ‘s/allow-query.*/allow-query { any; };/g‘ /etc/named.conf read -p "How many hosts you will allow slaves to copy mastar‘s zone resource analysis file(eg:1): " slavenu [[ "$slavenu" =~ ^[0-9]+$ ]] || { echo your input is no num,no slaves will allow to copy resource analysis file,please check;$slavenu=0; } if [ -z ${slavenu:-} ];then slavenu=0 fi if [ "$slavenu" -gt 0 ];then read -p "Input which hosts ip was allow to copy(eg:172.18.50.75;172.18.50.63): " ip sed -i ‘s/allow-transfer.*//g‘ /etc/named.conf sed -i "/allow-query/ a allow-transfer { $ip; }; " /etc/named.conf fi #config /etc/named.rfc1912.zones read -p "Please input your domain name in order to make a resource analysis file name,such as sunny.com.zone,sunny.com is domain name(default:sunny.com)": domain if [ -z ${domain:-} ];then domain=sunny.com fi if grep "zone \"$domain\" IN" /etc/named.rfc1912.zones&>/dev/null;then echo "$domain" already config in /etc/named.rfc1912.zones,it will not be config one more time,please check. else cat >>/etc/named.rfc1912.zones< zone "$domain" IN { type master; file "$domain.zone"; allow-update { none; }; }; eof fi read -p "Please input your inverse network in order to make a inverse resource analysis file name,such as 50.18.172.in-addr.arpa,50.18.172 is inverse network(default:50.18.172)": arpaip if [ -z ${arpaip:-} ];then arpaip=50.18.172 fi if grep "zone \"$arpaip.in-addr.apra\" IN" /etc/named.rfc1912.zones&>/dev/null;then echo "$arpaip.in-addr.arpa" already config in /etc/named.rfc1912.zones,it will not be config one more time,please check. else cat >>/etc/named.rfc1912.zones< zone "$arpaip.in-addr.arpa" IN { type master; file "$arpaip.zone"; allow-update { none; }; }; eof fi } read -p "Please input your choice(eg:1): " choice case $choice in 1) masterconfzone; #config zone resource analysis file read -p "Please input the dns server ip(defaults:172.18.50.61): " dnsip if [ -z ${dnsip:-} ];then dnsip=172.18.50.61 fi if ls /var/named/"$domain".zone &>/dev/null ;then echo /var/named/"$domain".zone already exist,it will not be config one more time,please check. else cat >>/var/named/"$domain".zone< \$TTL 1D @ IN SOA masterdns admin.sunny.com. ( $(date +%Y%m%d)01 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS masterdns NS slave1 NS slave2 masterdns A $dnsip slave1 A 172.18.50.63 slave2 A 172.18.50.75 www CNAME webser ftp CNAME webser webser A 172.18.50.88 http A 172.18.50.66 MX 10 mailsrv1 MX 20 mailsrv2 mailsrv1 A 172.18.50.72 mailsrv2 A 172.18.50.73 tracy.sunny.com. IN NS subzone1.tracy.sunny.com. subzone1.tracy.sunny.com. A 172.18.50.62 eof fi #you should define" $ORIGIN 50.18.172.in-addr.arpa. " before you define PTR type,or you should write the full arpa address when you define slaves,others it will no tranfer zone file from master dns server auto when master arpa resource file change if ls /var/named/$arpaip.zone &>/dev/null ;then echo /var/named/$arpaip.zone already exist,it will not be config one more time,please check. else cat >>/var/named/"$arpaip".zone< \$TTL 1D @ IN SOA masterdns.$domain. admin.sunny.com. ( $(date +%Y%m%d)01 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS masterdns.$domain. IN NS slave1.sunny.com. IN NS slave2.sunny.com. tracy.sunny.com. IN NS subzone1.tracy.sunny.com. 63.50.18.172.in-addr.arpa. IN PTR slave1.sunny.com. 75.50.18.172.in-addr.arpa. IN PTR slave2.sunny.com. 62.50.18.172.in-addr.arpa. IN PTR subzone1.tracy.sunny.com. 61 IN PTR masterdns.$domain. 88 IN PTR www.sunny.com. 66 IN PTR http.sunny.com. 88 IN PTR ftp.sunny.com. 72 IN PTR mailsrv1.sunny.com. 73 IN PTR mailsrv2.sunny.com. eof fi echo "You can run "vim /var/named/"$domain".zone" to add more source analysis" mastercheck; ;; 2) #config /etc/named.conf echo "Attention: It will install a slave dns,which can provide FQDN-->IP and IP-->FQDN query" echo "The slave dns will allow any host to query" sed -i ‘s/listen-on port.*/listen-on port 53 { localhost; };/g‘ /etc/named.conf sed -i ‘s/allow-query.*/allow-query { any; };/g‘ /etc/named.conf #config /etc/named.rfc1912.zones read -p "Please input master ip(default: 172.18.50.61 )" masterip if [ -z ${masterip:-} ];then masterip=172.18.50.61 fi read -p "Please input your domain name in order to make a resource analysis file name,such as sunny.com.zone,sunny.com is domain name(default:sunny.com)": domain if [ -z ${domain:-} ];then domain=sunny.com fi if grep "zone \"$domain\" IN" /etc/named.rfc1912.zones&>/dev/null;then echo "$domain" already config in /etc/named.rfc1912.zones,it will not be config one more time,please check. else cat >>/etc/named.rfc1912.zones< zone "$domain" IN { type slave; masters { $masterip; }; file "slaves/$domain.zone"; }; eof fi read -p "Please input your inverse network in order to make a inverse resource analysis file name,such as 50.18.172.in-addr.arpa,50.18.172 is inverse network(default:50.18.172)": arpaip if [ -z ${arpaip:-} ];then arpaip=50.18.172 fi if grep "zone \"$arpaip.in-addr.apra\" IN" /etc/named.rfc1912.zones&>/dev/null;then echo "$arpaip.in-addr.arpa" already config in /etc/named.rfc1912.zones,it will not be config one more time,please check. else cat >>/etc/named.rfc1912.zones< zone "$arpaip.in-addr.arpa" IN { type slave; masters { $masterip; }; file "slaves/$arpaip.zone"; }; eof fi ;; 3) echo "Your will install a forward dns hosts" echo echo sed -i ‘s/listen-on port.*/listen-on port 53 { localhost; };/g‘ /etc/named.conf sed -i ‘s/allow-query.*/allow-query { any; };/g‘ /etc/named.conf read -p "Input which server you forward as dns server(defaults:172.18.50.61):" forwardip if [ -z ${forwardip:-} ];then forwardip=172.18.50.61 fi echo "Enter all : to forward all request to assign dns server" echo "Enter part : only forward some zone request to assign dns server" sed -i ‘s/dnssec-enable yes;/dnssec-enable no;/g‘ /etc/named.conf sed -i ‘s/dnssec-validation yes;/dnssec-validation no;/g‘ /etc/named.conf read -p "Please input your choice (all or part): " aorp case $aorp in all) sed -i ‘s/forward.*//g‘ /etc/named.conf sed -i ‘/dnssec-validation/ a forward first;‘ /etc/named.conf sed -i "/forward/ a forwarders { $forwardip; };" /etc/named.conf ;; part) read -p "Please which domain zone you want to forward,such as sunny.com.zone,sunny.com is domain name(default:sunny.com)": forwardzone if [ -z ${forwardzone:-} ];then forwardzone=sunny.com fi read -p "Please input your inverse network in order to make a inverse resource analysis file name,such as 50.18.172.in-addr.arpa,50.18.172 is inverse network(default:50.18.172)": arpaip if [ -z ${arpaip:-} ];then arpaip=50.18.172 fi read -p "Input which server you forward as dns server(defaults:172.18.50.61):" forwardip if [ -z ${forwardip:-} ];then forwardip=172.18.50.61 fi if grep "forwarders { $forwardip; };" /etc/named.rfc1912.zones&>/dev/null;then echo forwarders "$forwardip" already config in /etc/named.rfc1912.zones,it will not be config one more time,please check. else # "If your server is centos6,but your forward is centos7,and you set forward first,it can be successful if you test forward direction,but it would be fail if you test inverse arpa.you should set forward only to test inverse arpa,it is the same promble is it is both centos7.However it is ok if dns and forward host are all centos6" cat >>/etc/named.rfc1912.zones< zone "$forwardzone" IN { type forward; forward first; forwarders { $forwardip; }; }; zone "$arpaip.in-addr.arpa" IN { type forward; forward first; forwarders { $forwardip; }; }; eof fi ;; *) echo "Your input is wrong ,nothing has been config,please check" ;; esac ;; 4) masterconfzone; read -p "Please input the main dns ip to forward (defaults:172.18.50.61): " forwardip2 if [ -z ${forwardip2:-} ];then forwardip2=172.18.50.61 fi if grep "forwarders { $forwardip2; };" /etc/named.conf&>/dev/null;then echo forwarders "$forwardip2" already config in /etc/named.rfc1912.zones,it will not be config one more time,please check. else sed -i "/allow-query/ a forwarders { $forwardip2; };" /etc/named.conf fi #config zone resource analysis file read -p "Please input the subzone dns server ip(defaults:172.18.50.62): " dnsip if [ -z ${dnsip:-} ];then dnsip=172.18.50.62 fi if ls /var/named/"$domain".zone &>/dev/null ;then echo /var/named/"$domain".zone already exist,it will not be config one more time,please check. else cat >>/var/named/"$domain".zone< \$TTL 1D @ IN SOA subzone admin.sunny.com. ( $(date +%Y%m%d)01 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS subzone MX 10 mailsrv1 MX 20 mailsrv2 subzone A $dnsip mailsrv1 A 192.168.32.72 mailsrv2 A 192.168.32.73 nginx A 192.168.32.77 eof fi #you should define" $ORIGIN 50.18.172.in-addr.arpa. " before you define PTR type,or you should write the full arpa address when you define slaves,others it will no tranfer zone file from master dns server auto when master arpa resource file change if ls /var/named/$arpaip.zone &>/dev/null ;then echo /var/named/$arpaip.zone already exist,it will not be config one more time,please check. else cat >>/var/named/"$arpaip".zone< \$TTL 1D @ IN SOA subzone.$domain. admin.sunny.com. ( $(date +%Y%m%d)01 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS subzone.$domain. 62 IN PTR subzone.tracy.sunny.com. 72 IN PTR mailsrv1.tracy.sunny.com. 73 IN PTR mailsrv2.tracy.sunny.com. 77 IN PTR nginx.tracy.sunny.com. eof fi echo "You can run "vim /var/named/"$domain".zone" to add more source analysis" mastercheck; ;; 5) echo "eg: master dns server ip 172.18.50.61 ; slave nds ip: 172.18.50.63" echo "step 1: run at server "dnssec-keygen -a HMAC-MD5 -b 128 -n HOST 6akey" to generate a key chain,--> get result two keys: K6akey.+157+49816.key and K6akey.+157+49816.private " echo "step 2: run at server "cat K6akey.+157+49816.private" to get key,there is one line begin with "Key:" --> get result: "Key: +rnJ7Yl6iU9be4Uxj/x04A==", the character string "+rnJ7Yl6iU9be4Uxj/x04A==" is the key " echo "step 3: config at master dns,run "vim /etc/named.conf" ,inside option ,add conf ‘allow-transfer { key 6akey; }‘ 6akey is the key name server 172.18.50.63 { keys { 6akey; }; }; key 6akey { algorithm hmac-md5; secret "+rnJ7Yl6iU9be4Uxj/x04A=="; }; ####attention 172.18.50.63 is the slave which you allow to copy resoure file from master,"+rnJ7Yl6iU9be4Uxj/x04A==" is the key ##### " echo "step 4: config at slave dns, outside option,config below : server 172.18.50.61 { keys { 6akey; }; }; key 6akey { algorithm hmac-md5; secret "+rnJ7Yl6iU9be4Uxj/x04A=="; }; ####attention 172.18.50.61 is the master ip which the slave want to copy resoure file ,"+rnJ7Yl6iU9be4Uxj/x04A==" is the key ##### " echo "step 5: run "service named restart" to restart dns service" ;; 6) echo "ACL function is to Merge one or more addresses into a collection and call it through a uniform name" echo "You can define acl and config at any dns server" echo "run at dns server,define one acl name mynet,and apply it to allow-qurey,below is example,run "vim /etc/named.conf" ####define acl acl mynet { 172.18.50.62; 172.18.50.63; 172.18.50.75; }; ####apply acl allow-query { mynet; }; " echo "then run "service named restart" to restart dns service,only the three hosts can qurey the dns server " echo "Attention,there are four default acl in dns, none,no one ip any,any ip localhost,only the host ip localnet,eg localhost 192.168.32.66 and subnet 255.255.255.0,so localnet is 192.168.32.0/24 " echo "no all parameter can use acl,for one eg, forwarders { 172.18.50.61; },172.18.50.61; should be ip,and can not be replaced with acl" ;; 7) echo "All all config in /etc/named.conf" echo "when using ‘view‘ statements, all zones must be in views, so as "include "/etc/named.rfc1912.zones"; " should be config in view " echo "you can define acl to do soome ip match" echo "step 1:Prepare six files in /var/named/, 32.168.192.zone chao.32.168.192.zone chao.tracy.sunny.com.zone,external.32.168.192.zone external.tracy.sunny.com.zone,tracy.sunny.com.zone " echo "step 2: run " vim /etc/named.conf " #########define two acl as below##### acl internal { 172.18.50.61; 172.18.50.63; }; acl external { 172.18.50.72; 172.18.50.73; }; #########config three views as below##### view inter { match-clients { internal; }; zone "." IN { type hint; file "named.ca"; }; zone "tracy.sunny.com" IN { type master; file "tracy.sunny.com.zone"; allow-update { none; }; }; zone "32.168.192.in-addr.arpa" IN { type master; file "32.168.192.zone"; allow-update { none; }; }; include "/etc/named.rfc1912.zones"; }; view exter { match-clients { external; }; zone "." IN { type hint; file "named.ca"; }; zone "tracy.sunny.com" IN { type master; file "external.tracy.sunny.com.zone"; allow-update { none; }; }; zone "1.1.1.in-addr.arpa" IN { type master; file "external.32.168.192.zone"; allow-update { none; }; }; include "/etc/named.rfc1912.zones"; }; view other { match-clients { any; }; zone "." IN { type hint; file "named.ca"; }; zone "tracy.sunny.com" IN { type master; file "chao.tracy.sunny.com.zone"; allow-update { none; }; }; zone "2.2.2.in-addr.arpa" IN { type master; file "chao.32.168.192.zone"; allow-update { none; }; }; include "/etc/named.rfc1912.zones"; }; ##################################### " echo "step 3: run "service named restart" to restart dns service " ;; *) echo "Your input is wrong ,please check" ;; esac service named restart if [ $os_version -eq 6 ];then service named status | grep " is running" &>/dev/null && echo "dns is running..." || echo "dns is not running,please check" else service named status | grep "active (running)" >&/dev/null && echo "dns is running..." || echo "dns is not running,please check" fi