zoukankan      html  css  js  c++  java
  • Linux系统下DNS主从配置详解

    一、DNS概述
    DNS(Domain Name System),即域名系统。因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。DNS服务器的作用就是就好比生活中的电话簿、114查号台一样,为各种网络程序找到对应目标主机的IP地址或对应的主机域名。

    二、DNS功能
    每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议所要完成的功能。

    主机名到IP地址的映射有两种方式:
    1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
    2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。

    通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。

    正向解析:根据主机名称(域名)查找对应的IP地址(实际应用中最多的)
    反向解析:根据IP地址查找对应的主机域名(不常用,一般用于搭建邮件服务器时。)

    根据服务器与所提供域名解析记录的关系,将DNS服务器分为不同的角色:
    1)缓存域名服务器,也称为 唯高速缓存服务器
    通过向其他域名服务器查询获得域名->IP地址记录
    将域名查询结果缓存到本地,提高重复查询时的速度

    2)主域名服务器
    特定DNS区域的官方服务器,具有唯一性
    负责维护该区域内所有域名->IP地址的映射记录

    3)从域名服务器(通俗一点就是用于备份DNS服务器的)
    也称为 辅助域名服务器
    其维护的 域名->IP地址记录 来源于主域名服务器
    搭建DNS服务应用的软件为:BIND(Berkeley Internet Name Daemon)

    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 ~]# hwclock -s
      
    检查一下安装环境所需要的开发包组、确保所依赖的开发包组都装有了
    [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
    [root@DNS-Master ~]# cat /var/named/named.ca
      
    ; <<>> 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 --add named
    [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
    

    5.1、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,"		IN","	PTR","	"$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
    "; exp_continue }
    # "*password:" { send "$pwd
    "; exp_continue }
    #}
      
    spawn ssh ${user}@${host} "ssh-keygen -t rsa"
      
    expect {
    "*yes/no" { send "yes
    "; exp_continue }
    "*password:" { send "$pwd
    "; exp_continue }
    "Enter file in which to save the key*" { send "
    
    "; exp_continue }
    "Overwrite*" { send "y
    "; exp_continue }
    "Enter passphrase (empty for no passphrase):" { send "
    
    "; exp_continue }
    "Enter same passphrase again:" { send "
    
    " }
    }
      
    spawn ssh ${user}@${host} "cat ~/.ssh/id_rsa.pub"
      
    expect {
    "*yes/no" { send "yes
    "; exp_continue }
    "*password:" { send "$pwd
    " }
    }
      
    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 ${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)建议做压力测试的时候对目标主机做分布式压力测试,效果更佳;
    

      

     ---------------------------------------------书山有路勤为径,学海无涯苦作舟--------------------------------------------------------

  • 相关阅读:
    教师不能太过于追求技巧
    两个有意思的数学谜题
    终于有博客啦
    215665645555
    Python 正则表达式之 sub 和 subn函数的使用
    python中可变数据类型和不可变数据类型
    python面试题手动总结答案锦集
    如何优雅的使用python中的代码注释
    使用win32com操作woord的方法记录
    redis问题:redis-server.exe双击闪退 win10系统
  • 原文地址:https://www.cnblogs.com/easonscx/p/9015194.html
Copyright © 2011-2022 走看看