一、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.confoptions {        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.shexport 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.22athena-web02                IN      A       192.168.33.31www-web01                   IN      A       192.168.34.29www-web02                   IN      A       192.168.34.30zabbix                      IN      A       192.168.1.21zrx-web01                   IN      A       192.168.34.33zrx-web02                   IN      A       192.168.34.32athena-matrix02             IN      A       192.168.33.36lx-db126                    IN      A       192.168.8.126lx-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_zonezone wangshibo.cn/IN: loaded serial 2017071111OK 启动服务后、解析域名[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.confdomain wangshibo.cn      //域名和查询都要写成内网DNS的主域名search wangshibo.cnnameserver 192.168.1.27 [root@DNS-Master ~]# ping zrx-web02PING 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 ms64 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.27ns2.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> wwwServer:     192.168.1.27Address:    192.168.1.27#53 Name:   www.wangshibo.cnAddress: 192.168.4.21> zabbixServer:     192.168.1.27Address:    192.168.1.27#53 Name:   zabbix.wangshibo.cnAddress: 192.168.1.21> lx-db126Server:     192.168.1.27Address:    192.168.1.27#53 Name:   lx-db126.wangshibo.cnAddress: 192.168.8.126> 192.168.1.27Server:     192.168.1.27Address:    192.168.1.27#53 27.16.192.168.in-addr.arpa   name = ns1.wangshibo.cn.> 192.168.1.21Server:     192.168.1.27Address:    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.confdomain wangshibo.cn      //域名和查询都要写成内网DNS的主域名search wangshibo.cnnameserver 192.168.1.27 [root@Nginx-web1 ~]# ping zabbixPING 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 ms64 bytes from www.wangshibo.cn (192.168.1.21): icmp_seq=2 ttl=64 time=0.223 ms64 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 -awrote key file "/etc/named/rndc.key"[root@DNS-Master ~]# chown named.named /etc/named/rndc.key2)报错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.confoptions {        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 ~]# ls192.168.1.zone  wangshibo.cn_zone  data  db-9TWfGmpO  db-kHbKJg9L  named.ca 然后修改从的自己的DNS[root@DNS-Slave ~]# cat /etc/resolv.confsearch wangshibo.cnnameserver 192.168.1.28 然后测试正反向解析:[root@DNS-Slave ~]# ping athena-web02PING 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 ms64 bytes from 192.168.33.31: icmp_seq=2 ttl=62 time=0.442 ms [root@DNS-Slave ~]# nslookup> lx-db127Server:     192.168.1.28Address:    192.168.1.28#53 Name:   lx-db127.wangshibo.cnAddress: 172.29.8.127> 192.168.1.28Server:     192.168.1.28Address:    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.cnsearch wangshibo.cnnameserver 172.168.1.27nameserver 172.168.1.28

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

两台DNS服务器的信息如下dns01.kevin.cn    10.0.11.21dns02.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]# lsbind.keys  named.conf  rndc.conf  rndc.key[root@dns01 named]# cat named.confoptions {        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]# ls10.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.22dns01                       IN      A       10.0.11.21dns02                       IN      A       10.0.11.22 inner-lb01                  IN      A       10.0.11.23inner-lb02                  IN      A       10.0.11.24 bl-db01                     IN      A       10.0.40.80bl-db02                     IN      A       10.0.40.81bl-db82                     IN      A       10.0.40.82nc-ftp01                    IN      A       10.0.52.23nc-ftp02                    IN      A       10.0.52.24nc-ftp                      IN      A       10.0.52.25nc-db20                     IN      A       10.0.40.20nc-db121                    IN      A       10.0.40.121nc-db122                    IN      A       10.0.40.122lvs01                       IN      A       10.0.52.200lvs02                       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]# lsbuild_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/bashrsync -e "ssh -p6666" -avpgolr /var/named/kevin.cn_zone root@10.0.11.22:/var/namedrsync -e "ssh -p6666" -avpgolr /var/named/10.0.* root@10.0.11.22:/var/namedrsync -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/bashcd /var/namedfor ipp in 11 40 52;doecho $ipppcat /data/dns_rsync/ptr.zone > 10.0.$ipp.zonecat /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.zonedone/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.html3)在10.0.11.21服务器上通过脚本批量配置新服务器的DNS和主机名。将新服务的DNS地址设置为10.0.11.21和10.0.11.22后,主机域名就可以直接解析了。4)信任服务器的密码默认为123456[root@dns01 mnt]# lshostname.sh  ip.list  noscp.exp  set_dns.sh  sshkey.exp  sshkey.sh [root@dns01 mnt]# cat sshkey.sh #!/bin/bashfor 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 123456done[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.list10.0.11.2310.0.11.2410.0.11.2510.0.40.8110.0.40.8210.0.52.20010.0.52.201[root@dns01 mnt]# cat set_dns.sh #!/bin/bashfor i in `cat /mnt/ip.list`dossh ${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/bashfor i in `cat /mnt/ip.list`dodomain=$(cat /var/named/kevin.cn_zone|grep -w ${i}|awk '{print $1}').kevin.cnssh $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 rootsed -i 's/#Port 22/Port 6666/g' /etc/ssh/sshd_configsed -i 's/#   Port 22/Port 6666/g' /etc/ssh/ssh_config/etc/init.d/sshd restart------------------------------------------------------------------------------------一、第二台DNS服务器(10.0.11.22)==========================================[root@dns02 named]# lsbind.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]# ls10.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.22dns01                       IN      A       10.0.11.21dns02                       IN      A       10.0.11.22 inner-lb01                  IN      A       10.0.11.23inner-lb02                  IN      A       10.0.11.24 bl-db01                     IN      A       10.0.40.80bl-db02                     IN      A       10.0.40.81bl-db82                     IN      A       10.0.40.82nc-ftp01                    IN      A       10.0.52.23nc-ftp02                    IN      A       10.0.52.24nc-ftp                      IN      A       10.0.52.25nc-db20                     IN      A       10.0.40.20nc-db121                    IN      A       10.0.40.121nc-db122                    IN      A       10.0.40.122lvs01                       IN      A       10.0.52.200lvs02                       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.86uatfastdfs_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.86uatfastdfs-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/# makegcc  -DHAVE_CONFIG_H -c queryperf.cgcc  -DHAVE_CONFIG_H  queryperf.o -lnsl -lresolv  -lm -o queryperf#不用直接make install 将queryperf 拷贝至/bin/目录即可# cp queryperf /bin/使用queryperf首先创建文件,指定需要测试的域名和记录类型:[root@dns01 ~]# cat /root/testwww.test.com    Aa.test.com      Ab.test.com      Ac.test.com      Ad.test.com      Aaa.test.com     Abb.test.com     Acc.test.com     Atest.com        NS192.168.7.9     PTR192.168.7.19    PTR192.168.7.29    PTR192.168.7.39    PTR使用-d指定数据文件,做压力测试的时候,要对其解析哪些记录为基准型测试,-s 指定需要压测的服务器IP[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127DNS Query Performance Testing ToolVersion: $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 completeStatistics:  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/testwww.test.com    Aa.test.com      Ab.test.com      Ac.test.com      Ad.test.com      Aaa.test.com     Abb.test.com     Acc.test.com     Amail.test.com   Awang.test.com   A    #这个域名不存在.....test.com        NS192.168.7.9     PTR192.168.7.19    PTR192.168.7.29    PTR192.168.7.39    PTR192.168.7.3     PTR192.168.7.13    PTR192.168.7.23    PTR192.168.7.33    PTR......[root@dns01 ~]# wc -l /root/test9877764 /root/test[root@dns01 ~]# du -sh /root/test 104M/root/test再次进行压力测试[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127DNS Query Performance Testing ToolVersion: $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 completeStatistics:  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 completeStatistics: 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 ~]# uptime20:51:07 up 2:27,  2 users,  load average: 2.20, 0.00, 0.00发现利用率也不高,使用vmstat查看实时负载情况,可以看到,阻塞队列正常,bi 和 bo量偶尔会有所以中断和上下文切换量也很小,所以这些都不是问题,可是响应速度依然非常的慢[root@dns01 ~]# vmstat 1procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r b   swpd   free  buff  cache   si  so    bi    bo  in   cs us sy id wa st0 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依旧如此有一堆的timeoutWarning: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 statusversion:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6CPUsfound: 1workerthreads: 1numberof zones: 21debuglevel: 0xfersrunning: 0xfersdeferred: 0soaqueries in progress: 0querylogging is OFF                  #query log是关闭的recursiveclients: 20/0/1000         #收到20个递归请求 tcp clien没有tcpclients: 0/100serveris 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.127DNSQuery Performance Testing ToolVersion:$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 9Statistics: 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/test13633842/root/test[root@dns01 ~]# /data/bind9/bin/queryperf -d /root/test -s 192.29.16.127[root@test2~]# vmstat  1procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r b   swpd   free  buff  cache   si  so    bi    bo  in   cs us sy id wa st1 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 ToolVersion:$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 completeStatistics: 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 2017Sources          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.INA;; ANSWER SECTION:www.test.com.600INA23.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 eth0Queries: 0 new, 16 total                                                       Tue Jul 25 13:25:43 2017Sources          Count      %   cum%------------ --------- ------ ------192.29.34.27        10   62.5   62.5192.29.16.27         5   31.2   93.8192.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)建议做压力测试的时候对目标主机做分布式压力测试,效果更佳;
©著作权归作者所有:来自51CTO博客作者80民工的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Gitblit版本服务器环境部署记录
  2. NFS上的数据通过inotify或者sersync软件实时同步数据到rsync服务
  3. 可以中文免费使用的Final Shell 和 需要破解Xshell我们应该选择
  4. Linux网络管理基础——网络的配置和服务器初始化【CentOS】
  5. Flask | Web开发基础提要
  6. Python爬虫进阶必备 | RSA 加密案例解析汇总(一)
  7. nginx搭建web服务器,配置端口复用
  8. 面试官给我挖坑:单台服务器并发TCP连接数到底可以有多少 ?
  9. PDMan 之数据库逆向解析

随机推荐

  1. 解决使用go get命令被墙的问题
  2. golang怎么搭一个网站
  3. go mod模块化介绍
  4. go引入外部依赖的三种方式介绍
  5. golang怎么debug
  6. 安装go第三方库的方法
  7. go语言之goroute协程
  8. golang写爬虫乱码怎么办
  9. Go接口interface的用法介绍
  10. Go语言执行流程详解