Centos下内网DNS主从环境部署记录

 

一、DNS是什么?
DNS(Domain Name System),即域名系统。它使用层次结构的命名系统,将域名和IP地址相互映射,形成一个分布式数据库系统。

DNS采用C-S架构,服务器端工作在UDP协议端口53和TCP协议端口53上。FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的树状层级结构的完全路径域名来表示一个准确位置对应的主机。DNS提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。

全球有13组DNS根服务器、11台在美国、一组在挪威、一组在日本、DNS服务重兵把守、他的安全性有多重要、一旦被攻击全球都互联网中断、可想而知。

 查看全球13个根节点的服务:
  # dig -t NS .
DNS正反向解析
DNS(Domain Name Service)域名服务、就是域名解析服务器、所谓名称解析的过程就是某个应用程序基于某个搜索键在指定的数据库中查询、而后查询到某些对应的键以后与之对应的键导出来的过程。
NDS是互联网的基础设施类的服务、这是一种协议、协议最后是要实现的、协议实现的软件很多。可以用BIND来实现DNS的、它运行时监听在UDP的53号端口上、同时监听TCP的53号端口、两种协议的53号端口都被监听了。

域名:如 http://www.wangshibo.com/ --> IP地址

一级域分为三类
组织域:.com、.org、.mil、.gov、.edu、.net、
国家域:.cn、.hk、.tw、.us、.jp、.ir、.uk
反向域:.in-addr.arpa

二、互联网DNS访问模型

DNS服务器采用分布式数据结构保存着海量的名称,那么用户如何快速的在互联网上访问哪台服务器或者哪些服务器就能找到待解析的数据呢?

客户机发起对www.kernel.org的解析请求
1)客户机首先查看查找本地hosts文件,如果有则返回,否则进行下一步
2)客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,不再向外发出请求,否则进行下一步,转发。
3)将请求转发本地DNS服务器。
4)查看域名是否本地解析,是则本地解析返回,否则进行下一步。
5)本地DNS服务器首先在缓存中查找,有则返回,无则进行下一步。
6)向全球某一个根域服务器发起DNS请求,根域返回org域的地址列表。
7)使用某一个org域的IP地址,发起DNS请求,org域返回kernel域服务器地址列表。
8)使用某一个kernel域IP地址,发起DNS请求,kernel域返回www.kernel.org主机的IP地址,本地DNS服务收到后,返回给客户机。
以上客户机和本地DNS服务器直接的查询方式,称为递归查询。
本地DNS服务器多次重复查询的方式,称为迭代查询。

1.1 DNS的分类:
主DNS服务器:就是一台存储着原始资料的DNS服务器。
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也成辅助DNS服务器。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。
转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。

1.2 RR(Resource Record)资源记录
DNS层级结构中,不管是节点还是叶子节点都是资源,对这些资源中的某一个的标识使用一定格式的多字段的一条记录来表示,这条记录就是资源记录RR。RR的标准记录在RFC 1034中。

1.3 RR的组成

1.4 RR中IN类(class)常见类型(type)

1.5 常用指令
1)$TTL
TTL 可以在SOA之前使用该指令,给出TTL秒数的32位整数值。
2)$ORIGIN
设定域名,它必须出现在任何一行省略书写的RR记录前。当一个区域文件第一次被读取时,隐含这个命令的值为<zone_name>.(必须是跟着一个半角句号),如果不设置它,就必须在区域文件中书写FQDN。
例如
$ORIGIN kernel.org.
www CNAME web-server
就等同于
www.kernel.org. CNAME web-server.kernel.org.
3)@符号
@符号等价于$ORIGIN。

1.6 SOA的RDATA格式

 

百度的SOA

a.shifen.com.        579    IN    SOA    dns.baidu.com. sa.baidu.com.  (     
                      1408010001 ; serial number     
                      5 ; refresh 5s     
                      5 ; retry 5s     
                      86400 ; expire 1d     
                      3600 ;min TTL 1h     
)

1.7 NS的RDATA格式
NSDName:DNS的FQDN
baidu.com. 64899 IN NS ns2.baidu.com.
baidu.com. 64899 IN NS ns4.baidu.com.
baidu.com. 64899 IN NS dns.baidu.com.
baidu.com. 64899 IN NS ns7.baidu.com.
baidu.com. 64899 IN NS ns3.baidu.com.
1.8 MX的RDATA格式
PREFERENCE:优先级,越小越高
EXCHANGE:邮件服务器FQDN
baidu.com. 7200 IN MX 20 jpmx.baidu.com.
baidu.com. 7200 IN MX 20 mx50.baidu.com.
baidu.com. 7200 IN MX 10 mx.n.shifen.com.
baidu.com. 7200 IN MX 20 mx1.baidu.com.
1.9 CNAME的RDATA格式
CNAME:权威名称,FQDN
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com是正式名称,而www.baidu.com是别名
2.0 A的RDATA格式
ADDRESS:IP V4地址
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com. 36 IN A 111.13.100.92
www.a.shifen.com. 36 IN A 111.13.100.91
2.1 PTR的RDATA格式
7.100.in-addr.arpa. IN PTR www.example.com.

三、BIND实现DNS服务

BIND是什么
1984年,加州大学伯克利分校的几个学生完成了Unix名称服务的实现,起名叫做Berkeley Internet Name Domain(BIND)。目前,它是互联网上使用最为广泛的DNS服务软件。
bind的发行版一般包含三个部分:域名服务器、域名解析器库、软件测试工具。

因为内网换了路由器,这个路由器不支持静态域名解析服务。所以考虑自己建立一个内网DNS,也方便了开发同学在代码中使用域名,避免直接使用ip地址所带来的不便和安全隐患。下面就记录下使用BIND部署内网NDS环境(主从)操作流程:

一般来说,可以使用rpm包来安装bind,但是rpm安装可能不符合我们的要求、比如说想用named的线程模式、想禁用IPv6、想启用某种特性,而rpm在编译时没有提供、那这时只能去手动编译安装了。
编译安装named有一个麻烦之处、所有的配置文件都得自己去建立,像/var/named/这个目录、编译安装时连这个目录都不会存在、得自己去创建这个目录、里面的各种配置文件、区域文件、像根的、甚至连
service启动脚本都没、所以不到万不得以最好别去编译它。最好的办法就是yum自动安装,这样配置文件就会自动创建的。下面我选择bind-9.10.5版本进行编译安装:

192.168.1.27          主DNS服务器
192.168.1.28          从DNS服务器
bind版本:             bind-9.10.5-P3.tar.gz                            http://www.isc.org/downloads/bind/

一、主DNS服务器的操作

首先同步下时间
[root@DNS-Master ~]# ntpdate ntp1.aliyun.com
 
检查一下安装环境所需要的开发包组、确保所依赖的开发包组都装有了
[root@DNS-Master ~]# yum -y groupinstall "Development Tools"
[root@DNS-Master ~]# yum -y groupinstall "Server Platform Development"
[root@DNS-Master ~]# yum grouplist
装好后查看一下、最主要两项:Development tools和Server Platform Development
 
这里注意一下,我们要去编译安装一个服务、首先要去看他的README、然后看他的INSTALL、大体了解一下有没有我们所需要的信息、当然我们这里就不多说了、直接往下走:
[root@DNS-Master ~]# tar -zvxf bind-9.10.5-P3.tar.gz
[root@DNS-Master ~]# cd bind-9.10.5-P3
[root@DNS-Master bind-9.10.5-P3]# ./configure --prefix=/data/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot
[root@DNS-Master bind-9.10.5-P3]# make && make install
 
--prefix=/data/bind9:指定编译存放的路径
--sysconfdir=/etc/named:指定配置文件存放路径
--enable-threads:启用了多线程的功能
 
前面说过、编译安装named什么都得自己创建、用户也没有的、所以我们得给他创建一个用户先、而且用户是系统用户、要加-r、系统用户不会给他创建家目录的:
先创建用户组:
[root@DNS-Master ~]# groupadd -g 53 -r named
[root@DNS-Master ~]# useradd -g named -r named
 
先去创建named的工作目录、然后创建named.ca这个文件:
[root@DNS-Master ~]# mkdir /var/named
 
这里@后面的IP是能访问互联网的服务器、生成的数据存在到/var/named/named.ca中去(使用"yum -y install bind-utils"命令安装dig命令)
[root@DNS-Master ~]# dig -t NS . @8.8.8.8 > /var/named/named.ca       //这一步很关键,一定要保证能解析,否则无法forward转发那些NS(223.5.5.5或者8.8.8.8等)的解析,比如最后无法ping通www.baidu.com
[root@DNS-Master ~]# cat /var/named/named.ca                          //确保named.ca文件里有"...IN  NS"解析记录
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2 <<>> -t NS . @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36220
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;.              IN  NS
.......
.......
 
然后再去编辑/etc/named/named.conf的配置文件、这个文件也没有、需要自己去编写的:
[root@DNS-Master ~]# vim /etc/named/named.conf
options {
        listen-on port 53 { any; };        //默认是any,表示允许所有网段的主机。可以改成自己所在的内网网段
        listen-on-v6 port 53 { ::1; };
        directory "/var/named";               //定义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;                   //下面这两行配置很重要,这个配置后,当客户端采用我们自己配置的内网DNS的NS服务器后,当访问别的网站,内网NS解析不了的就转发给8.8.8.8的DS服务器解析,保证能正常上网。
        forwarders {
            223.5.5.5;             //阿里云的DNS服务器
            223.6.6.6;
            8.8.8.8;
            8.8.4.4;
          };
        };
 
logging {                            
        channel default_debug {
        file "data/named.run";
        severity dynamic;
        };
};
 
zone "."  {
        type hint;       
        file "named.ca"; 
        };
 
zone "wangshibo.cn"  {                              //定义一个统一的域名后缀。正向解析的区域。此处可以加后面IN,也可以不加IN         
        type master;                           //类型属于master、属于自己的       
        file "wangshibo.cn_zone";                    //指定正向解析的文件   
        allow-transfer {192.168.1.28;};         //允许192.168.1.28(从DNS服务器)传送  
};
zone "1.168.192.in-addr.arpa"  {              //定义反向解析的区域,注意写法。此处可以在后面加IN,也可以不加IN
        type master;                         
        file "192.168.1.zone";                //指定正向解析的文件
        allow-transfer {192.168.1.28;};    

zone "33.168.192.in-addr.arpa"  {        
        type master;
        file "192.168.33.zone";              
        allow-transfer {192.168.1.28;};
};
zone "34.168.192.in-addr.arpa"  {        
        type master;
        file "192.168.34.zone";              
        allow-transfer {192.168.1.28;};
};
zone "64.168.192.in-addr.arpa"  {        
        type master;
        file "192.168.64.zone";              
        allow-transfer {192.168.1.28;};
};

 
这里注意一下:
如果是多个网段的反向解析,这里就定义多个反向解析区域。
 
----------------------------------------------------------------------------------------------------------
温馨提示:
DNS BIND之forwarder转发:就是说,当自己内网NS服务器解析不了的域名,转发到别的NS如8.8.8.8的域名服务器上进行解析。
转发功能可以用来在一些服务器上产生一个大的缓存,从而减少到外部服务器链路上的流量。它可以使用在和internet没有直接连接的内部域名服务器上,用来提供对外部域名的查询。
只有当服务器是非授权的,并且缓存中没有相关记录时,才会进行转发。
1)转发机制
当你设置了转发器后,所有非本域的和在缓存中无法找到的域名查询都将转发到设置的DNS转发器上,由这台DNS来完成解析工作并做缓存,因此这台转发器的缓存中记录了丰富的域名信息。
因而对非本域的查询,很可能转发器就可以在缓存中找到答案,避免了再次向外部发送查询,减少了流量。
 
2)配置参数
1.forward
此选项只有当forwarders列表中有内容的时候才有意义。当值是First,默认情况下,使服务器先查询设置的forwarders,如果它没有得到回答,服务器就会自己寻找答案。如果设定的是only,
服务器就只会把请求转发到其它服务器上去。
2.forwarders
设定转发使用的ip地址。默认的列表是空的(不转发)。转发也可以设置在每个域上,这样全局选项中的转发设置就不会起作用了。用户可以将不同的域转发到服务器上,或者对不同的域可以实现
forward only或first的不同方式,也可以根本就不转发。
注:转发服务器的查询模式必须允许递归查询(即,recursion yes;),默认递归查询是开启的。
 
3)转发器的配置格式
options {
forward first;
forwarders{
8.8.8.8;
1.8.8.8;
};
};
注意:转发器本身不用做任何设置,而是对需要转发器的其他DNS server做以上配置。还有,如果该 DNS Server 无法联系到转发器,那么BIND会自己尝试解析。
如果要禁止BIND在无法联系到转发器时不做任何操作,那么你还可以使用 forward only 命令,这样BIND只能使用区的权威数据和缓存来响应查询了( 在连接不到转发器的情况下 )。
options {
forward only;
forwarders{
8.8.8.8;
1.8.8.8;
};
};
在 BIND 8.2 以后引入了一个新的特性:转发区( forward zone ),它允许你把 DNS 配置成只有查找特定域名的时候才使用转发器。( BIND 9 从9.1.0 才开始有转发区功能)
例如,你可以使你的服务器将所有对test.com结尾的域名查询都转发给test.com的两台名字服务器:
zone "test.com" {
type forward;
forwarders{
8.8.8.8;
1.8.8.8;
};
};
还有一种转发区设置和刚才的设置刚好相反,它允许你设置什么样的查询将不被转发,当然这只适用于在options语句中指定了转发器的 DNS 。配置如下:
options {
forwarders{
8.8.8.8;
1.8.8.8;
};
};
zone "test.com" {
type master;
file "zone.test.com";
forwarders {};
};
在test.com这个区中,你授权了几个子域,例如:zx.test.com、lab.test.com等,那么在test.com的权威服务器上设置转发后,因为对 zx.test.com、lab.test.com这几个子域不是权威,
那么如果有对 www.zx.test.com这样的子域的域名查询,服务器也将转发。这完全是没有必要的,因为服务器上就有zx.test.org 子域的 NS 记录,何须再转发。
---------------------------------------------------------------------------------------------------------------
如果想用rndc远程登录可以生成一个/etc/named/rndc.conf的配置文件:
[root@DNS-Master ~]# /data/bind9/sbin/rndc-confgen -r /dev/urandom > /etc/named/rndc.conf
到这里别忘了给named.conf和rndc.conf修改属主属组和权限:
[root@DNS-Master ~]# chown -R root.named /data/bind9
[root@DNS-Master ~]# chown -R root.named /etc/named
[root@DNS-Master ~]# chown -R root.named /var/named            #另外注意:一定要保证/var/named/data的权限是named.named,这个目录下存放的是named.run,即named解析日志
[root@DNS-Master ~]# chmod 640 /etc/named/named.conf
[root@DNS-Master ~]# chmod 640 /etc/named/rndc.conf
[root@DNS-Master ~]# chmod 640 /var/named/*
 
为了方便、我们在PATH下加个的路径、/etc/profile.d/named.sh:
[root@DNS-Master ~]# cat /etc/profile.d/named.sh
export PATH=/data/bind9/bin:/data/bind9/sbin:$PATH
[root@DNS-Master ~]# source /etc/profile.d/named.sh
 
因为是一个服务、所以我们要为他提供一个服务脚本、以后可以利用脚本启动、编辑/etc/rc.d/init.d/named:
[root@DNS-Master ~]# vim /etc/rc.d/init.d/named
#!/bin/bash
    #
    # description: named daemon 
    # chkconfig: - 25 88   
 
    pidFile=/data/bind9/var/run/named.pid
    lockFile=/var/lock/subsys/named
    confFile=/etc/named/named.conf
 
        [ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
    start() {
            if [ -e $lockFile ]; then
                    echo "named is already running..."
                    exit 0
            fi
            echo -n "Starting named:"
            daemon --pidfile "$pidFile" /data/bind9/sbin/named -u named -c "$confFile"
            RETVAL=$?
            echo
 
            if [ $RETVAL -eq 0 ]; then
                    touch $lockFile
                    return $RETVAL
            else
                    rm -f $lockFile $pidFile
                    return 1
            fi
    }
 
    stop() {
            if [ ! -e $lockFile ]; then
                    echo "named is stopped."
            fi
            echo -n "Stopping named:"
            killproc named
            RETVAL=$?
            echo
 
            if [ $RETVAL -eq 0 ];then
                    rm -f $lockFile $pidFile
                    return 0
            else
                    echo "Cannot stop named."
                    failure
                    return 1
            fi
    }
 
    restart() {
            stop
            sleep 2
            start
    }
 
    reload() {
            echo -n "Reloading named: "
            killproc named -HUP
            RETVAL=$?
            echo
            return $RETVAL
    }
 
    status() {
            if pidof named &> /dev/null; then
                    echo -n "named is running..."
                    success
                    echo
            else
                    echo -n "named is stopped..."
                    success
                    echo
            fi
    }
 
    usage() {
            echo "Usage: named {start|stop|restart|status|reload}"
    }
    case $1 in
    start)
            start ;;
    stop)
            stop ;;
    restart)
            restart ;;
    status)
            status ;;
    reload)
            reload ;;
    *)
            usage
            exit 4 ;;
    esac
 
[root@DNS-Master ~]# chmod 755 /etc/rc.d/init.d/named
[root@DNS-Master ~]# chkconfig named on
[root@DNS-Master ~]# chkconfig --list named
 
下面开始配置正向解析配置:
[root@DNS-Master ~]# vim /var/named/wangshibo.cn_zone     //这个文件是在上面named.conf里面定义的
$TTL 1D                                            //定义宏,通用变量,单位为秒(S)、小时(H),天数(D)
@       IN SOA  ns1.wangshibo.cn. root. (               //此处一般是写NS域名,邮件域名,或root.
                        2017071111           //序列号。这个参数很重要,要特别注意!!当主DNS修改解析文件时,必须要修改这个序列号,然后重启named服务后,从DNS才能正常同步过去!!
                         2H                           //刷新时间
                         10M                           //失败重试时间
                         7D                           //过期时间
                         1D )                          //否定答案时间
@                           IN      NS      ns1.wangshibo.cn.           
@                           IN      NS      ns2.wangshibo.cn.              //注意域名后面的.不能忘掉!     
ns1                         IN      A       192.168.1.27           
ns2                         IN      A       192.168.1.28             
www                         IN      A       192.168.4.21              //由于已经定义了根域名是wangshibo.cn,所以这里可以直接写域名前面的名称,也可以全部写出来。比如www或者写成www.wangshibo.cn.
nginx-web01                 IN      A       192.168.4.21              //如果写域名前的名称,就不需要带.符号,但如果是写域名全称,则需要带.符号,如nginx-web01.wangshibo.cn.
nginx-web02                 IN      A       192.168.4.22
athena-web02                IN      A       192.168.33.31
www-web01                   IN      A       192.168.34.29
www-web02                   IN      A       192.168.34.30
zabbix                      IN      A       192.168.1.21
zrx-web01                   IN      A       192.168.34.33
zrx-web02                   IN      A       192.168.34.32
athena-matrix02             IN      A       192.168.33.36
lx-db126                    IN      A       192.168.8.126
lx-db127                    IN      A       192.168.8.127
 
 
反向解析的配置(这里只列举一个):
[root@DNS-Master ~]# cat 192.168.1.zone
$TTL 600
@       IN SOA  ns1.wangshibo.cn. root. (
                        2017071101
                         2H           
                         10M           
                         7D           
                         1D )
@               IN      NS      ns1.wangshibo.cn.
@               IN      NS      ns2.wangshibo.cn.
27              IN      PTR     ns1.wangshibo.cn.
28              IN      PTR     ns2.wangshibo.cn.
21              IN      PTR     www.wangshibo.cn.
21              IN      PTR     zp.wangshibo.cn.
29              IN      PTR    puppet01.wangshibo.cn.
30              IN      PTR    puppet02.wangshibo.cn.
-------------------------------------------------------------------------------------------------------
温馨提示1:
对于主DNS的正反向解析文件中的序列号,每当做一次修改后,必须要同时修改这个序列号,这样才能触发主从同步机制!然后重启named服务,从DNS服务器那边才能同步过去,否则不能完成主从同步!
-------------------------------------------------------------------------------------------------------
 
然后修改一下权限和属主属组:
[root@DNS-Master ~]# chown root:named /var/named/wangshibo.cn_zone
[root@DNS-Master ~]# chmod 640 /var/named/wangshibo.cn_zone
 
检查主配置文件和区域数据文件有没有语法错误:
[root@DNS-Master ~]# named-checkconf     //这个是检查主配置文件语法的
[root@DNS-Master ~]#
 
这个是检查区域数据文件语法的、指定区域和指定文件
[root@DNS-Master ~]# named-checkzone "wangshibo.cn" /var/named/wangshibo.cn_zone
zone wangshibo.cn/IN: loaded serial 2017071111
OK
 
启动服务后、解析域名
[root@DNS-Master ~]# /etc/init.d/named start
[root@DNS-Master ~]# /etc/init.d/named status
[root@DNS-Master ~]# /etc/init.d/named restart
 
然后修改自己的DNS,进行正反向解析
[root@DNS-Master ~]# cat /etc/resolv.conf
domain wangshibo.cn      //域名和查询都要写成内网DNS的主域名
search wangshibo.cn
nameserver 192.168.1.27
 
[root@DNS-Master ~]# ping zrx-web02
PING zrx-web02.wangshibo.cn (192.168.34.32) 56(84) bytes of data.
64 bytes from 192.168.34.32: icmp_seq=1 ttl=62 time=1.11 ms
64 bytes from 192.168.34.32: icmp_seq=2 ttl=62 time=0.542 ms
 
 
[root@BJLX_16_27_V named]# dig -t A www.wangshibo.cn @192.168.1.27
 
; <<>> DiG 9.10.5-P3 <<>> -t A www.wangshibo.cn @192.168.1.27
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32976
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.wangshibo.cn.           IN  A
 
;; ANSWER SECTION:
www.wangshibo.cn.        86400   IN  A   192.168.4.21
 
;; AUTHORITY SECTION:
wangshibo.cn.        86400   IN  NS  ns2.wangshibo.cn.
wangshibo.cn.        86400   IN  NS  ns1.wangshibo.cn.
 
;; ADDITIONAL SECTION:
ns1.wangshibo.cn.        86400   IN  A   192.168.1.27
ns2.wangshibo.cn.        86400   IN  A   192.168.1.28
 
;; Query time: 0 msec
;; SERVER: 192.168.1.27#53(192.168.1.27)
;; WHEN: Thu Jul 20 10:45:15 CST 2017
;; MSG SIZE  rcvd: 124
 
 
[root@BJLX_16_27_V named]# nslookup
> set q=A
> www
Server:     192.168.1.27
Address:    192.168.1.27#53
 
Name:   www.wangshibo.cn
Address: 192.168.4.21
> zabbix
Server:     192.168.1.27
Address:    192.168.1.27#53
 
Name:   zabbix.wangshibo.cn
Address: 192.168.1.21
> lx-db126
Server:     192.168.1.27
Address:    192.168.1.27#53
 
Name:   lx-db126.wangshibo.cn
Address: 192.168.8.126
> 192.168.1.27
Server:     192.168.1.27
Address:    192.168.1.27#53
 
27.16.192.168.in-addr.arpa   name = ns1.wangshibo.cn.
> 192.168.1.21
Server:     192.168.1.27
Address:    192.168.1.27#53
 
21.16.192.168.in-addr.arpa   name = www.wangshibo.cn.
21.16.192.168.in-addr.arpa   name = zp.wangshibo.cn.
>
 
 
最后,客户机就可以修改自己的/etc/resolv.conf文件,然后使用这个内网DNS了
[root@Nginx-web1 ~]# cat /etc/resolv.conf
domain wangshibo.cn      //域名和查询都要写成内网DNS的主域名
search wangshibo.cn
nameserver 192.168.1.27
 
[root@Nginx-web1 ~]# ping zabbix
PING zabbix.wangshibo.cn (192.168.1.21) 56(84) bytes of data.
64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=2 ttl=64 time=0.223 ms
64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=3 ttl=64 time=0.177 ms

named服务启动可能会出现下面两个错误

1)报错:
open: /etc/named/rndc.key: file not found

解决办法:
[root@DNS-Master ~]# rndc-confgen -r /dev/urandom -a
wrote key file "/etc/named/rndc.key"
[root@DNS-Master ~]# chown named.named /etc/named/rndc.key

2)报错
isc_stdio_open 'data/named.run' failed: file not found

解决办法:
[root@DNS-Master ~]# cd /var/named/
[root@DNS-Master named]# mkdir data
[root@DNS-Master named]# chown -R named.named data

二、从DNS服务器的操作

[root@DNS-Slave ~]# hwclock -s
[root@DNS-Slave ~]# yum -y groupinstall "Development Tools"
[root@DNS-Slave ~]# yum -y groupinstall "Server Platform Development"
[root@DNS-Slave ~]# yum grouplist
[root@DNS-Slave ~]# tar -zvxf bind-9.10.5-P3.tar.gz
[root@DNS-Slave ~]# cd bind-9.10.5-P3
[root@DNS-Slave bind-9.10.5-P3]# ./configure --prefix=/data/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot
[root@DNS-Slave bind-9.10.5-P3]# make && make install
 
[root@DNS-Slave ~]# groupadd -g 53 -r named
[root@DNS-Slave ~]# useradd -g named -r named
 
[root@DNS-Slave ~]# mkdir /var/named
[root@DNS-Slave ~]# dig -t NS . @8.8.8.8 > /var/named/named.ca
[root@DNS-Slave ~]# vim /etc/named/named.conf
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;
        forwarders {
            8.8.8.8;
            8.8.4.4;
          };
        };
 
logging {                            
        channel default_debug {
        file "data/named.run";
        severity dynamic;
        };
};
 
zone "." IN {
        type hint;       
        file "named.ca"; 
        };
 
zone "wangshibo.cn" IN {                     
        type slave;                           
        file "wangshibo.cn_zone";            
        masters {172.168.1.27;};        
};
zone "16.29.172.in-addr.arpa" IN {       
        type slave;
        file "172.168.1.zone";             
        masters {172.168.1.27;};
};
 
 
将主DNS的/etc/init.d/named启动脚本拷贝到从DNS服务器上。
[root@DNS-Slave ~]# cat /etc/init.d/named
#!/bin/bash
    #
    # description: named daemon 
    # chkconfig: - 25 88   
 
    pidFile=/data/bind9/var/run/named.pid
    lockFile=/var/lock/subsys/named
    confFile=/etc/named/named.conf
 
        [ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
    start() {
            if [ -e $lockFile ]; then
                    echo "named is already running..."
                    exit 0
            fi
            echo -n "Starting named:"
            daemon --pidfile "$pidFile" /data/bind9/sbin/named -u named -c "$confFile"
            RETVAL=$?
            echo
 
            if [ $RETVAL -eq 0 ]; then
                    touch $lockFile
                    return $RETVAL
            else
                    rm -f $lockFile $pidFile
                    return 1
            fi
    }
 
    stop() {
            if [ ! -e $lockFile ]; then
                    echo "named is stopped."
            fi
            echo -n "Stopping named:"
            killproc named
            RETVAL=$?
            echo
 
            if [ $RETVAL -eq 0 ];then
                    rm -f $lockFile $pidFile
                    return 0
            else
                    echo "Cannot stop named."
                    failure
                    return 1
            fi
    }
 
    restart() {
            stop
            sleep 2
            start
    }
 
    reload() {
            echo -n "Reloading named: "
            killproc named -HUP
            RETVAL=$?
            echo
            return $RETVAL
    }
 
    status() {
            if pidof named &> /dev/null; then
                    echo -n "named is running..."
                    success
                    echo
            else
                    echo -n "named is stopped..."
                    success
                    echo
            fi
    }
 
    usage() {
            echo "Usage: named {start|stop|restart|status|reload}"
    }
    case $1 in
    start)
            start ;;
    stop)
            stop ;;
    restart)
            restart ;;
    status)
            status ;;
    reload)
            reload ;;
    *)
            usage
            exit 4 ;;
    esac
 
启动named服务
[root@DNS-Slave ~]# /etc/init.d/named start/status/restart
 
启动后,就会发现在从DNS的/var/named目录下自动产生了wangshibo.cn_zone和192.168.1.zone的正反向解析文件
注意:当主DNS修改解析配置时,只需要将解析配置文件中的序列号改动下,就会自动触发主从同步机制!
 
[root@DNS-Slave ~]# ls
192.168.1.zone  wangshibo.cn_zone  data  db-9TWfGmpO  db-kHbKJg9L  named.ca
 
然后修改从的自己的DNS
[root@DNS-Slave ~]# cat /etc/resolv.conf
search wangshibo.cn
nameserver 192.168.1.28
 
然后测试正反向解析:
[root@DNS-Slave ~]# ping athena-web02
PING athena-web02.wangshibo.cn (192.168.33.31) 56(84) bytes of data.
64 bytes from 192.168.33.31: icmp_seq=1 ttl=62 time=0.712 ms
64 bytes from 192.168.33.31: icmp_seq=2 ttl=62 time=0.442 ms
 
[root@DNS-Slave ~]# nslookup
> lx-db127
Server:     192.168.1.28
Address:    192.168.1.28#53
 
Name:   lx-db127.wangshibo.cn
Address: 172.29.8.127
> 192.168.1.28
Server:     192.168.1.28
Address:    192.168.1.28#53
 
28.16.29.172.in-addr.arpa   name = ns2.wangshibo.cn.
 
这样,客户机可以将自己的DNS修改为上面配置的内网主从DNS地址
[root@test ~]# cat /etc/resolv.conf
#domain wangshibo.cn
search wangshibo.cn
nameserver 172.168.1.27
nameserver 172.168.1.28

也可以同时在两台主机上部署一样的配置(不需要如上配置主从同步),然后通过脚本进行正反向解析配置的同步!
=====如下是曾经管理过的一个内网DNS配置(两台DNS)实例=====

两台DNS服务器的信息如下
dns01.kevin.cn    10.0.11.21
dns02.kevin.cn    10.0.11.22


一、第一台DNS服务器(10.0.11.21)==========================================
[root@dns01 ~]# hostname 
dns01.kevin.cn
[root@dns01 ~]# cd /etc/named/
[root@dns01 named]# ls
bind.keys  named.conf  rndc.conf  rndc.key
[root@dns01 named]# cat named.conf
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;
        forwarders {
            223.5.5.5;
            223.6.6.6;
            8.8.8.8;
            8.8.4.4;
          };
        };

logging {                             
        channel default_debug {
        file "data/named.run";
        severity dynamic;
        };
};

zone "." {
        type hint;        
        file "named.ca";  
        };

zone "kevin.cn" {                      
        type master;                            
        file "kevin.cn_zone";             
};
zone "11.0.10.in-addr.arpa" {        
        type master;
        file "10.0.11.zone";              
};
zone "52.0.10.in-addr.arpa" {
        type master;
        file "10.0.52.zone";
};
zone "40.0.10.in-addr.arpa" {
        type master;
        file "10.0.40.zone";
};


[root@dns01 named]# cd /var/named/
[root@dns01 named]# ls
10.0.11.zone 10.0.40.zone  named.ca  10.0.52.zone  data kevin.cn_zone
[root@dns01 named]# cat kevin.cn_zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.            
ns1                         IN      A       10.0.11.21    
ns2                         IN      A       10.0.11.22
dns01                       IN      A       10.0.11.21
dns02                       IN      A       10.0.11.22 
inner-lb01                  IN      A       10.0.11.23
inner-lb02                  IN      A       10.0.11.24 
bl-db01                     IN      A       10.0.40.80
bl-db02                     IN      A       10.0.40.81
bl-db82                     IN      A       10.0.40.82
nc-ftp01                    IN      A       10.0.52.23
nc-ftp02                    IN      A       10.0.52.24
nc-ftp                      IN      A       10.0.52.25
nc-db20                     IN      A       10.0.40.20
nc-db121                    IN      A       10.0.40.121
nc-db122                    IN      A       10.0.40.122
lvs01                       IN      A       10.0.52.200
lvs02                       IN      A       10.0.52.201
........
........


[root@dns01 named]# cat 10.0.40.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.
80    IN  PTR   bl-db01.kevin.cn.
81    IN  PTR   bl-db02.kevin.cn.
82    IN  PTR   bl-db82.kevin.cn.
20    IN  PTR   nc-db20.kevin.cn.
121   IN  PTR   nc-db121.kevin.cn.
122   IN  PTR   nc-db122.kevin.cn.

[root@dns01 named]# cat 10.0.11.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.
21    IN  PTR   ns1.kevin.cn.
22    IN  PTR   ns2.kevin.cn.
21    IN  PTR   dns01.kevin.cn.
22    IN  PTR   dns02.kevin.cn.
23    IN  PTR   inner-lb01.kevin.cn.
24    IN  PTR   inner-lb02.kevin.cn.

[root@dns01 named]# cat 10.0.52.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.
21    IN  PTR   nc-app01.kevin.cn.
22    IN  PTR   nc-app02.kevin.cn.
23    IN  PTR   nc-ftp01.kevin.cn.
24    IN  PTR   nc-ftp02.kevin.cn.
25    IN  PTR   nc-ftp.kevin.cn.
200   IN  PTR   lvs01.kevin.cn.
201   IN  PTR   lvs02.kevin.cn.

---------------------------------------------------------------------------------------------
在10.0.11.21服务器上编写脚本,实现:
1)正向解析的A记录添加后,自动生成反向解析的PTR记录
2)10.0.11.21服务器上的DNS正反向解析配置同步到10.0.11.22服务器的DNS配置中
3)做10.0.11.21到10.0.11.22的ssh无密码信任关系

[root@dns01 ~]# cd /data/dns_rsync/
[root@dns01 dns_rsync]# ls
build_ptr.sh  dns_rsync.sh  ptr.zone
[root@dns01 dns_rsync]# cat ptr.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.

[root@dns01 dns_rsync]# cat dns_rsync.sh 
#!/bin/bash
rsync -e "ssh -p6666" -avpgolr /var/named/kevin.cn_zone root@10.0.11.22:/var/named
rsync -e "ssh -p6666" -avpgolr /var/named/10.0.* root@10.0.11.22:/var/named
rsync -e "ssh -p6666" -avpgolr /etc/named/named.conf root@10.0.11.22:/etc/named/

/usr/bin/ssh -p6666 root@10.0.11.22 "/etc/init.d/named restart"
[root@dns01 dns_rsync]# cat build_ptr.sh 
#!/bin/bash

cd /var/named

for ipp in 11 40 52;
do
echo $ippp
cat /data/dns_rsync/ptr.zone > 10.0.$ipp.zone
cat /var/named/kevin.cn_zone |grep "10.0.$ipp"|awk '{print $4,"\t\tIN","\tPTR","\t"$1".kevin.cn."}'|sed "s#10.0.$ipp.##" >> 10.0.$ipp.zone
done

/etc/init.d/named restart

/bin/bash -x /data/dns_rsync/dns_rsync.sh


当10.0.11.21服务器上的DNS正向解析配置后,执行"sh -x /data/dns_rsync/build_ptr.sh"命令后,就会自动生成DNS反向解析配置,并自动同步到10.0.11.22机器上。
---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------
另外,对于新增的服务器,管理方式如下:
1)在10.0.11.21的DNS正向解析里添加域名配置,作为其主机域名。
2) 在10.0.11.21服务器上通过expect方式跟新服务器做批量信任。expect的部署参考:http://www.cnblogs.com/kevingrace/p/5900303.html
3)在10.0.11.21服务器上通过脚本批量配置新服务器的DNS和主机名。将新服务的DNS地址设置为10.0.11.21和10.0.11.22后,主机域名就可以直接解析了。
4)信任服务器的密码默认为123456

[root@dns01 mnt]# ls
hostname.sh  ip.list  noscp.exp  set_dns.sh  sshkey.exp  sshkey.sh 

[root@dns01 mnt]# cat sshkey.sh 
#!/bin/bash
for ip in `cat /mnt/ip.list`
do
/mnt/sshkey.exp $ip root 123456 |grep ssh-rsa >> ~/.ssh/authorized_keys
/mnt/noscp.exp ~/.ssh/authorized_keys $ip:~/.ssh root 123456
done

[root@dns01 mnt]# cat sshkey.exp 
#!/usr/bin/expect
 
#sshkey.exp
 
if {$argc<3} {
puts stderr "Usage: $argv0 host user passwd "
exit 1
}
 
set host [ lindex $argv 0 ]
set user [ lindex $argv 1 ]
set pwd [ lindex $argv 2 ]
 
set timeout 30
 
#spawn ssh ${user}@${host} "rm -rf ~/.ssh/id_rsa*"
#
#expect {
# "*yes/no" { send "yes\r"; exp_continue }
# "*password:" { send "$pwd\r"; exp_continue }
#}
 
spawn ssh ${user}@${host} "ssh-keygen -t rsa" 
 
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pwd\r"; exp_continue }
"Enter file in which to save the key*" { send "\n\r"; exp_continue }
"Overwrite*" { send "y\n"; exp_continue }
"Enter passphrase (empty for no passphrase):" { send "\n\r"; exp_continue }
"Enter same passphrase again:" { send "\n\r" }
}
 
spawn ssh ${user}@${host} "cat ~/.ssh/id_rsa.pub" 
 
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pwd\r" }
}
 
expect eof


[root@dns01 mnt]# cat ip.list
10.0.11.23
10.0.11.24
10.0.11.25
10.0.40.81
10.0.40.82
10.0.52.200
10.0.52.201

[root@dns01 mnt]# cat set_dns.sh 
#!/bin/bash
for i in `cat /mnt/ip.list`
do
ssh ${i} '>/etc/resolv.conf && echo "domain kevin.cn" >> /etc/resolv.conf && echo "search kevin.cn" >> /etc/resolv.conf && echo "nameserver 10.0.11.21" >> /etc/resolv.conf && echo "nameserver 10.0.11.22" >> /etc/resolv.conf && chattr +ai /etc/resolv.conf'
done

[root@dns01 mnt]# cat hostname.sh 
#!/bin/bash
for i in `cat /mnt/ip.list`
do
domain=$(cat /var/named/kevin.cn_zone|grep -w ${i}|awk '{print $1}').kevin.cn
ssh $i "hostname $domain"
ssh $i "/bin/sed -i "/HOSTNAME/d" /etc/sysconfig/network"
ssh $i "echo HOSTNAME=$domain >>/etc/sysconfig/network"
ssh $i "echo "$i   $domain" >> /etc/hosts"
done

------------------------------------------------------------------------------------
待通过上面脚本修改新服务器的主机名和DNS地址后,可以使用下面的命令修改密码和ssh配置
echo '4GF2a5mr!GkU$njS' |passwd --stdin root
sed -i 's/#Port 22/Port 6666/g' /etc/ssh/sshd_config
sed -i 's/#   Port 22/Port 6666/g' /etc/ssh/ssh_config
/etc/init.d/sshd restart
------------------------------------------------------------------------------------


一、第二台DNS服务器(10.0.11.22)==========================================

[root@dns02 named]# ls
bind.keys  named.conf  rndc.conf  rndc.key
[root@dns02 named]# cat named.conf 
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;
        forwarders {
            223.5.5.5;
            223.6.6.6;
            8.8.8.8;
            8.8.4.4;
          };
        };

logging {                             
        channel default_debug {
        file "data/named.run";
        severity dynamic;
        };
};

zone "." {
        type hint;        
        file "named.ca";  
        };

zone "kevin.cn" {                      
        type master;                            
        file "kevin.cn_zone";             
};
zone "11.0.10.in-addr.arpa" {        
        type master;
        file "10.0.11.zone";              
};
zone "52.0.10.in-addr.arpa" {
        type master;
        file "10.0.52.zone";
};
zone "40.0.10.in-addr.arpa" {
        type master;
        file "10.0.40.zone";
};

[root@dns02 named]# cd /var/named/
[root@dns02 named]# ls
10.0.11.zone 10.0.40.zone  named.ca  10.0.52.zone  data kevin.cn_zone
[root@dns02 named]# cat kevin.cn_zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.            
ns1                         IN      A       10.0.11.21    
ns2                         IN      A       10.0.11.22
dns01                       IN      A       10.0.11.21
dns02                       IN      A       10.0.11.22 
inner-lb01                  IN      A       10.0.11.23
inner-lb02                  IN      A       10.0.11.24 
bl-db01                     IN      A       10.0.40.80
bl-db02                     IN      A       10.0.40.81
bl-db82                     IN      A       10.0.40.82
nc-ftp01                    IN      A       10.0.52.23
nc-ftp02                    IN      A       10.0.52.24
nc-ftp                      IN      A       10.0.52.25
nc-db20                     IN      A       10.0.40.20
nc-db121                    IN      A       10.0.40.121
nc-db122                    IN      A       10.0.40.122
lvs01                       IN      A       10.0.52.200
lvs02                       IN      A       10.0.52.201
........
........


[root@dns02 named]# cat 10.0.40.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.
80    IN  PTR   bl-db01.kevin.cn.
81    IN  PTR   bl-db02.kevin.cn.
82    IN  PTR   bl-db82.kevin.cn.
20    IN  PTR   nc-db20.kevin.cn.
121   IN  PTR   nc-db121.kevin.cn.
122   IN  PTR   nc-db122.kevin.cn.

[root@dns02 named]# cat 10.0.11.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.
21    IN  PTR   ns1.kevin.cn.
22    IN  PTR   ns2.kevin.cn.
21    IN  PTR   dns01.kevin.cn.
22    IN  PTR   dns02.kevin.cn.
23    IN  PTR   inner-lb01.kevin.cn.
24    IN  PTR   inner-lb02.kevin.cn.

[root@dns02 named]# cat 10.0.52.zone 
$TTL 600
@       IN SOA  ns.kevin.cn. root. (
                        2017071114 
                         2H            
                         10M            
                         7D            
                         1D )
@                           IN      NS      ns1.kevin.cn.            
@                           IN      NS      ns2.kevin.cn.
21    IN  PTR   nc-app01.kevin.cn.
22    IN  PTR   nc-app02.kevin.cn.
23    IN  PTR   nc-ftp01.kevin.cn.
24    IN  PTR   nc-ftp02.kevin.cn.
25    IN  PTR   nc-ftp.kevin.cn.
200   IN  PTR   lvs01.kevin.cn.
201   IN  PTR   lvs02.kevin.cn.

===========踩过的一个坑===============

在dns的正向解析配置文件里添加一个解析,如下:
[root@dns01 named]# vim kevin.cn_zone
......
uatfastdfs_tracker01          IN      A       10.0.52.86
uatfastdfs_storage01          IN      A       10.0.52.87

然后成功重启了named服务
[root@dns01 named]# /etc/init.d/named start

最后,发现上面记录添加之后,所有机器解析都除了问题,都不能正常解析kevin.cn的域名了!!!

最后排查日志发现(最好在重启named服务的时候观察日志)错误如下:
[root@dns01 named]# tail -f /var/log/messages
......
Mar  1 21:39:50 localhost named[11111]: zone 50.16.172.in-addr.arpa/IN: loading from master file 192.168.10.zone failed: bad name (check-names)
Mar  1 21:39:50 localhost named[11111]: zone 50.16.172.in-addr.arpa/IN: not loaded due to errors.
Mar  1 21:39:50 localhost named[11111]: veredholdings.cn_zone:87: uatfastdfs_storage01.veredholdings.cn: bad owner name (check-names)
Mar  1 21:39:50 localhost named[11111]: zone veredholdings.cn/IN: loading from master file veredholdings.cn_zone failed: bad owner name (check-names)

产生原因:
在添加正反向解决记录的时候,域名不能使用_等特殊字符,可以使用-,但是绝不能使用_,因为DNS服务不能识别特殊字符命名的域名。

解决办法:修改域名即可
[root@dns01 named]# vim kevin.cn_zone
......
uatfastdfs-tracker01          IN      A       10.0.52.86
uatfastdfs-storage01          IN      A       10.0.52.87

[root@dns01 named]# /etc/init.d/named start

=============DNS压力测试(queryperf)==================
bind有专门的工具可以将配置文件的数据放入到数据库中,对于bind来讲,最常见的压力测试软件是querypery。此工具是bind源码包自带的一个工具,但安装完bind之后很有可能官方的包并没有提供,这就需要我们自己去手动安装了。

# wget https://www.isc.org/downloads/file/bind-9-9-4-p1-tar-gz/?version=tar.gz
# cd bind-9.9.4-P1/contrib/queryperf/
# make
gcc  -DHAVE_CONFIG_H -c queryperf.c
gcc  -DHAVE_CONFIG_H  queryperf.o -lnsl -lresolv  -lm -o queryperf
#不用直接make install 将queryperf 拷贝至/bin/目录即可
# cp queryperf /bin/

使用queryperf
首先创建文件,指定需要测试的域名和记录类型:
[root@dns01 ~]# cat /root/test
www.test.com    A
a.test.com      A
b.test.com      A
c.test.com      A
d.test.com      A
aa.test.com     A
bb.test.com     A
cc.test.com     A
test.com        NS
192.168.7.9     PTR
192.168.7.19    PTR
192.168.7.29    PTR
192.168.7.39    PTR

使用-d指定数据文件,做压力测试的时候,要对其解析哪些记录为基准型测试,-s 指定需要压测的服务器IP
[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $

[Status] Processing input data                                 #正在读取数据
[Status] Sending queries (beginning with 192.29.16.127)        #发送查询请求
[Status] Testing complete

Statistics:

  Parse input file:     once
  Ended due to:         reaching end of file

  Queries sent:         3 queries                             #共发起了多少请求
  Queries completed:    3 queries                             #完成了多少请求
  Queries lost:         0 queries                             #丢失多少请求
  Queries delayed(?):   0 queries

  RTT max:           	0.054551 sec                          #将请求发出去响应回过来最大的一次耗时多少
  RTT min:              0.000263 sec                          #最短一次
  RTT average:          0.018360 sec                          #平均多久
  RTT std deviation:    0.025597 sec
  RTT out of range:     0 queries

  Percentage completed: 100.00%                               #完成的比例
  Percentage lost:        0.00%                               #丢失的比例

  Started at:           Tue Jul 25 11:59:15 2017
  Finished at:          Tue Jul 25 11:59:15 2017
  Ran for:              0.054570 seconds

  Queries per second:   54.975261 qps                        #每秒钟平均能完成多少个请求

上面测试的数量太少,可以将/root/test文件的信息填满:
[root@dns01 ~]# cat /root/test
www.test.com    A
a.test.com      A
b.test.com      A
c.test.com      A
d.test.com      A
aa.test.com     A
bb.test.com     A
cc.test.com     A
mail.test.com   A
wang.test.com   A    #这个域名不存在
.....
test.com        NS
192.168.7.9     PTR
192.168.7.19    PTR
192.168.7.29    PTR
192.168.7.39    PTR
192.168.7.3     PTR
192.168.7.13    PTR
192.168.7.23    PTR
192.168.7.33    PTR
......

[root@dns01 ~]# wc -l /root/test
9877764 /root/test

[root@dns01 ~]# du -sh /root/test 
104M	/root/test

再次进行压力测试
[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $

[Status] Processing input data
[Status] Sending queries (beginning with 192.29.16.127)
[Status] Testing complete

Statistics:

  Parse input file:     once
  Ended due to:         reaching end of file

[Timeout]Query timed out: msg id 62
[Timeout]Query timed out: msg id 64
[Timeout]Query timed out: msg id 71
[Timeout]Query timed out: msg id 73
[Timeout]Query timed out: msg id 80
[Timeout]Query timed out: msg id 82
[Timeout]Query timed out: msg id 89
[Timeout]Query timed out: msg id 91
[Timeout]Query timed out: msg id 98
[Timeout]Query timed out: msg id 100
[Status]Testing complete

Statistics:

 Parse input file:     once
 Ended due to:         reaching end of file

 Queries sent:         2364 queries
 Queries completed:    2364 queries
 Queries lost:         0 queries
 Queries delayed(?):   0 queries

 RTT max:              0.347522sec
 RTT min:              0.000083 sec
 RTT average:          0.002009 sec
 RTT std deviation:    0.022389 sec
 RTT out of range:     0 queries

 Percentage completed: 100.00%
 Percentage lost:        0.00%

 Started at:           Wed Dec 18 20:40:35 2013
 Finished at:          Wed Dec 18 20:40:40 2013
 Ran for:              5.024620 seconds

 Queries per second:   470.483340 qps

#可以看到以下有很多包处于丢失状态
[Status]Processing input data
[Status]Sending queries (beginning with 10.0.10.60)
[Timeout]Query timed out: msg id 62
[Timeout]Query timed out: msg id 64
[Timeout]Query timed out: msg id 71
[Timeout]Query timed out: msg id 73
[Timeout]Query timed out: msg id 80
#----------略------------------
[Status]Testing complete

但是在本地测试不用考虑服务器端的带宽,查看本地服务器负载情况:
[root@dns01 ~]# uptime
20:51:07 up 2:27,  2 users,  load average: 2.20, 0.00, 0.00

发现利用率也不高,使用vmstat查看实时负载情况,可以看到,阻塞队列正常,bi 和 bo量偶尔会有所以中断和上下文切换量也很小,所以这些都不是问题,可是响应速度依然非常的慢
[root@dns01 ~]# vmstat 1
procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b   swpd   free  buff  cache   si  so    bi    bo  in   cs us sy id wa st
0 0      0  68720 53988 214796    0    0   26    15   25  23  0  0 96 3  0    
0 0      0  68712 53988 214800    0    0    0     0   18  20  0  0 100 0  0  
0 0      0  68712 53988 214800    0    0    0     0   19  13  0  0 100 0  0  
0 0      0  68712 53988 214800    0    0    0     0   15  14  0  1 99 0  0    

技术压力测试,切换到其它服务器对其进行压力测试
[root@nginx-web1 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127
依旧如此有一堆的timeout
Warning:RTT is out of range: 29.990839 [query=192.29.16.127/12, rcode=2]
Warning:RTT is out of range: 24.962086 [query=192.29.16.127/12, rcode=2]
Warning:RTT is out of range: 24.962383 [query=192.29.16.127/12, rcode=2]
[Timeout]Query timed out: msg id 223
[Timeout]Query timed out: msg id 224
[Timeout]Query timed out: msg id 212
[Timeout]Query timed out: msg id 193

接下来在被测试的服务器上使用rndcstatus查看named服务器的运行状况
[root@dns01 ~]# rndc status
version:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6
CPUsfound: 1
workerthreads: 1
numberof zones: 21
debuglevel: 0
xfersrunning: 0
xfersdeferred: 0
soaqueries in progress: 0
querylogging is OFF                  #query log是关闭的
recursiveclients: 20/0/1000         #收到20个递归请求 tcp clien没有
tcpclients: 0/100
serveris up and running

怀疑是否是反向解析的问题,将/root/test包含反向解析的行全部使用sed删除
[root@dns01 ~]# sed -i '/^10/d' /root/test 
[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127

DNSQuery Performance Testing Tool
Version:$Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $

[Status]Processing input data
[Status]Sending queries (beginning with 192.29.16.127)
[Timeout]Query timed out: msg id 1
[Timeout]Query timed out: msg id 2
[Timeout]Query timed out: msg id 3
[Timeout]Query timed out: msg id 4
[Timeout]Query timed out: msg id 5
[Timeout]Query timed out: msg id 6
[Timeout]Query timed out: msg id 7
[Timeout]Query timed out: msg id 8
[Timeout]Query timed out: msg id 9

Statistics:

 Parse input file:     once
 Ended due to:         reaching end of file

 Queries sent:         4548 queries
 Queries completed:    4548 queries
 Queries lost:         0 queries
 Queries delayed(?):   0queries

 RTT max:             0.004176sec
 RTT min:              0.000126 sec
 RTT average:          0.001663 sec
 RTT std deviation:    0.000515 sec
 RTT out of range:     0 queries

 Percentage completed: 100.00%
 Percentage lost:        0.00%

 Started at:           Wed Dec 18 20:59:48 2013
 Finished at:          Wed Dec 18 20:59:48 2013
 Ran for:              0.405095 seconds

 Queries per second:   11226.996137 qps           #总共每秒可以承受11226个查询请求

进一步压力测试:
可以看到,此服务器负载比刚才高出了一些
[root@dns01 ~]# wc -l /root/test
13633842/root/test
[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127
[root@test2~]# vmstat  1
procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b   swpd   free  buff  cache   si  so    bi    bo  in   cs us sy id wa st
1 0      0 314332  12800 60260    0    0    2     0 7686   59 25 95 0  0  0    
1 0      0 314332  12800 60260    0    0    0     0 7731   36 30 89 1  0  0    
1 0      0 314332  12800 60260    0    0    0     0 7494   40 36 84 0  0  0
得出结果:
DNSQuery Performance Testing Tool
Version:$Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $

[Status]Processing input data
[Status]Sending queries (beginning with 192.29.16.127)
[Status]Testing complete

Statistics:

 Parse input file:     once
 Ended due to:         reaching end of file

 Queries sent:         3774840 queries
 Queries completed:    3774840 queries
 Queries lost:         0 queries
 Queries delayed(?):   0 queries

 RTT max:             0.041022sec
 RTT min:              0.000037 sec
 RTT average:          0.001813 sec
 RTT std deviation:    0.000452 sec
 RTT out of range:     0 queries

 Percentage completed: 100.00%
 Percentage lost:        0.00%

 Started at:           Wed Dec 18 21:04:24 2013
 Finished at:          Wed Dec 18 21:10:16 2013
 Ran for:              351.908312 seconds

 Queries per second:   8726.771353 qps
可以将查询日志打开,再次进行压力测试,这里就不做演示了,打开后可以通过iostat 来查看负载情况,每秒读写的数据量多少,很有可能在某个磁盘上不停的写入数据,所以正是因为io子系统比较慢

=================dnstop工具=================
除了queryperf之外,还可以使用dnstop工具监视bind服务性能状态。使用dnstop可以用来实现观测dns响应请求查询时候的性能,用来监控DNS流量情况。
在维护DNS服务器时,用户往往希望知道到底是哪些用户在使用DNS服务器,同时也希望能对DNS状态查询做一个统计,以及时地知道DNS的工作情况和状态。
在传统的方式下,用户通常使用的是tcpdump等开源工具来进行抓包并通过查看53端口的流量来查看DNS数据包。由于tcpdump并没有针对DNS流量进行特殊定制,
因此使用起来可能不是非常方便。因此,用户可以使用专用于DNS的dnstop工具查询DNS服务器状态。

dnstop是一种非常优秀的开源软件,用户可以到网站http://dns.measurement-factory.com/tools/dnstop/src/上进行下载使用。
由于该软件依赖tcpdump和pcap抓包库(libpcap)对网络上传输的数据包进行截获和过滤,所以用户需要确保系统安装相应软件后才能正常安装和使用dnstop。
通常情况下,这两种必须的库都已经在系统中预装好了,使用下面的命令安装dnstop即可:

安装dnstop
[root@dns01 ~]# wget http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20140915.tar.gz
[root@dns01 ~]# tar -zvxf dnstop-20140915.tar.gz
[root@dns01 ~]# cd dnstop-20140915
[root@dns01 dnstop-20140915]# ./configure
[root@dns01 dnstop-20140915]# make &&  makeinstall

安装成功后,可以查看通过相应的网络接口来监控DNS网络流量。如下所示,开始抓包分析,对eth0接口的请求进行分析:
[root@dns01 ~]# dnstop -4 -Q eth0            #回车出现下面信息。
Queries: 0 new, 1 total                                                        Tue Jul 25 13:21:47 2017

Sources          Count      %   cum%

然后在另一个终端上使用queryperf进行压力测试,观察下面情况
[root@dns01 ~]# /data/bind9/bin/queryperf -s 192.29.16.127 -d /root/test 

或者对其做dig查询
[root@dns01 ~]# dig -t A www.test.com @192.29.16.127

; <<>> DiG 9.10.5-P3 <<>> -t A www.test.com @192.29.16.127
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18840
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com.			IN	A

;; ANSWER SECTION:
www.test.com.		600	IN	A	23.22.28.187

;; Query time: 54 msec
;; SERVER: 192.29.16.127#53(192.29.16.127)
;; WHEN: Tue Jul 25 13:24:42 CST 2017
;; MSG SIZE  rcvd: 57

再次查看dnstop监测状态:
[root@dns01 ~]# dnstop -4 -Q eth0

Queries: 0 new, 16 total                                                       Tue Jul 25 13:25:43 2017

Sources          Count      %   cum%
------------ --------- ------ ------
192.29.34.27        10   62.5   62.5
192.29.16.27         5   31.2   93.8
192.29.16.21         1    6.2  100.0

在运行dnstop的过程中,可以键入<S>、<D>、<T>、<1>、<2>、<Ctr+R>、<Ctr+X>等方式以交互方式来显示不同的信息:
S:记录发送DNS查询的客户端IP地址列表
D:记录DNS查询的目的服务器的IP地址表
T:记录查询详细类型
1:记录查询的顶级域名
2:记录查询的二级域名
Ctr+R:重新纪录
Ctr+X:退出

总结:
1)抓包时可以在NS服务器上对测试机进行压力测试观测效果);
2)建议做压力测试的时候对目标主机做分布式压力测试,效果更佳;
posted @ 2016-06-08 15:47  散尽浮华  阅读(7792)  评论(0编辑  收藏  举报