> CentOS > CentOS服务器 > DNS服务器 >

CentOS6.5DNS服务BIND配置、正反向解析、主从及压力测试

  前言:
了解named
   如果说我们安装的rpm包不符合我们的要求怎么办、比如说我们想起用named的线程模式、比如说我想让他禁用IPv6、比如说我们想启用某种特性、而rpm在编译时没有提供、那这时我们只能去手动编译安装了,那如何去编译安装named:

   编译安装named有一个麻烦之处、所有的配置文件你都得自己去建立、像/var/named/这个目录、编译安装时连这个目录都不会存在、得自己去创建这个目录、里面的各种配置文件、区域文件、像根的、localhost的、以及localhost的反向的、都得手动去做、连我们service启动脚本都没、所以不到万不得以最好别去编译他、因为很麻烦、但对于我们学习来讲、我们应该是变得法的去折腾自己、活着就是折腾嘛、那我们各种方法都去摸索一遍、将来我们真要用得着了也好应对。

   首先上来就同步一下我们的时间:
   # hwclock -s


   然后检查一下安装环境所需要的开发包组、确保所依赖的开发包组都装有了、我这里没有装、那我就用yum来装一下吧:
   # yum -y groupinstall "Development Tools"
   # yum -y groupinstall "Server Platform Development"
   # yum grouplist

   装好后查看一下、最主要两项:Development tools和Server Platform Development

   然后我们就去下载源码包了、这里我就去www.isc.org/donloads/官方网站下载了、支持使用的版本是9.9.5、当前使用的稳定版、这个版本中已经自带dlz了、以前的版本没有自带的、安装时要装这个dlz的、如果我们将来人希望指资源记录基于数据库的方式存放的话、而且要能够现场检索、现场响应的话、则自定义启用dlz功能即可、下载好我们就去解压缩:
   # tar xf bind-9.9.5.tar.gz

   wKioL1MhkdbjXvswAAHNdY4VZXg331.jpg
   

   这里注意一下:我们要去编译安装一个服务、首先要去看他的README、然后看他的INSTALL、大体了解一下有没有我们所需要的信息、当然我们这里就不多说了、直接往下走:
   # ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot

   --prefix=/usr/local/bind9:指定编译存放的路径
   --sysconfdir=/etc/named:指定配置文件存放路径
   --enable-threads:启用了多线程的功能

   然后make和make install就OK了、安装完成就可以去配置了
   # make && make install

   wKioL1MhkjTAg7N0AAKi8eTJhyA380.jpg
   

   我们前面说过、编译安装named什么都得自己创建、用户也没有的、所以我们得给他创建一个用户先、而且用户是系统用户、要加-r、系统用户不会给他创建家目录的:
   先创建用户组:
   # groupadd -g 53 -r named
   # useradd -g named -r named
   wKioL1MhkpTQ-ZC8AAClx2mdHcA461.jpg
   这里我们先去创建named的工作目录、然后创建named.ca这个文件:
   # mkdir /var/named

   这里@后面的IP是能访问互联网的服务器、生成的数据存在到/var/named/named.ca中去
   # dig -t NS . @172.16.0.1 > /var/named/named.ca

   wKiom1MhkpmT9-OqAAE1lwAc-8c613.jpg
   

   然后再去编辑/etc/named/named.conf的配置文件、这个文件也没有、需要自己去编写的:
   # vim /etc/named/named.conf   

#定义全局的
        options {
                #定义named的固定工作路径
                directory "/var/named";
        };
        #定义根的区域
        zone "." IN {
                type hint;        #类型、hint表示为根的
                file "named.ca";  #指定的文件
        };
        #定义本本地的区域
        zone "localhost" IN {
                type master;           #类型属于master、属于自己的
                file "named.localhost"#指定的文件
                allow-transfer { none; }; #不允许任何人传送的
        };
        #定义反向解析的
        zone "0.0.127.in-addr.arpa" IN {
                type master;            #类型属于master、属于自己的
                file "named.loopback";    #指定的文件
                allow-transfer { none; };#不允许任何人传送的
        };

   配置文件中的三个文件named.ca、named.localhost、named.loopback上面已经提供有一个了named.ca了、还有这两个named.localhost、named.loopback、同样我们也得提供、也是在/var/named目录下创建:


   # vim /var/named/named.localhost

 
$TTL 86400    ;定义宏
@       IN      SOA     localhost       admin.localhost. (
                        2014031101    ;序列号
                         2H            ;刷新时间
                         10M            ;失败时重试间隔时间
                         7D            ;过期时间
                         1D)            ;否定答案的时间
                 IN      NS      localhost.

localhost.       IN      A       172.0.0.1   

   然后复制一份改写named.loopback的文件:
   # cp /var/named/named.localhost /var/named/named.loopback
   # vim named.loopback

 
$TTL 86400
@       IN      SOA     localhost       admin.localhost. (
                         2014031101
                         2H
                         10M
                         7D
                         1D )
                 IN      NS      localhost.
1                IN      PTR     localhost.

   如果想用rndc远程登录可以生成一个/etc/named/rndc.conf的配置文件:
   # /usr/local/bind9/sbin/rndc-confgen -r /dev/urandom > /etc/named/rndc.conf 

   到这里我们别忘了给named.conf和rndc.conf修改属主属组和权限:
   # chown root:named /etc/named/named.conf
   # chown root:named /etc/named/rndc.conf
   # chown root:named /var/named/*
   # chmod 640 /etc/named/named.conf
   # chmod 640 /etc/named/rndc.conf
   # chmod 640 /var/named/*

   wKioL1MhkyywE9LIAACdXssfy94489.jpg
   wKiom1Mhk3bS9GHdAACw_6olTGQ848.jpg

   

   为了方便、我们在PATH下加个的路径、/etc/profile.d/named.sh:
   # vim /etc/profile.d/named.sh
   export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH

   在我们的终端重新登录一下就可以生效了

   好的、检查一下我们的区域文件有没有语法错误、然后就可以启动了:
   # named-checkzone "localhost" /var/named/named.localhost 
   # named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback
   # named -u named    #这个表示以named用户启动named
   # ss -tunl | grep "\<53\>"  然后再查看一下有没有监听53号端口

   wKioL1Mhk37wLYL7AAF9YH3B058963.jpg


   最后、因为他是一个服务、所以我们要为他提供一个服务脚本、以后可以利用脚本启动、编辑/etc/rc.d/init.d/named:

 
# vim /etc/rc.d/init.d/named
    #!/bin/bash
    #
    # description: named daemon  描述信息
    # chkconfig: - 25 88    启动和关闭级别
    #
    # 启动named的pid文件、其实文件路径我们都可以自己指定的
    pidFile=/usr/local/bind9/var/run/named.pid
    # 启动服务时的锁文件、判断一个服务是不是启动是靠这个锁文件的
    lockFile=/var/lock/subsys/named
    # named的配置文件路径
    confFile=/etc/named/named.conf
        # 判断/etc/rc.d/init.d/functions路径下的functios是否存在这个文件、存在就sources进来
        [ -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:"
            # 调用functions中的daemon方法、并用--pidfile指定pid文件在什么地方、还指定用户和配置文件、我们本来是直接启用named的、现在利用daemon这个函数来启用这个服务、他会获得很多额外的属性、如果成功了会帮我们打印什么[ OK ]的、还可以做判断
            daemon --pidfile "$pidFile" /usr/local/bind9/sbin/named -u named -c "$confFile"
            RETVAL=$?
            echo
            # 判断上面的命令是否执行成功、说明启动成功
            if [ $RETVAL -eq 0 ]; then
                    # 如果判断成功、就创建锁文件
                    touch $lockFile
                    return $RETVAL
            else
                    # 否则、就是失败了、那就删除锁文件和pid文件
                    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
                    # 删除锁文件和pid文件
                    rm -f $lockFile $pidFile
                    return 0
            else
                    # 否则打印说没能正常停止
                    echo "Cannot stop named."
                    # 调用functions中的函数、会打印失败
                    failure
                    return 1
            fi
    }
    # 定义重启服务
    restart() {
            # 调用停止方法
            stop
            # 睡眠2秒
            sleep 2
            # 调用启动方法
            start
    }
    # 定义重新加载服务方法
    reload() {
            echo -n "Reloading named: "
            # killprco HUP信号、named进程的信号
            killproc named -HUP
            RETVAL=$?
            echo
            return $RETVAL
    }
    # 定义服务状态
    status() {
            if pidof named &> /dev/nullthen
                    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


   OK、到这里保存退出,给他个执行权限
   # chmod +x /etc/rc.d/init.d/named

   再加到chkconfig里面去:
   # chkconfig --add named
   # chkconfig --list named

=============================我是分隔线==========================================  

DNS正反向解析

   DNS(Domain Name Service)域名服务、就是域名解析服务器、所谓名称解析的过程就是某个应用程序基于某个搜索键在指定的数据库中查询、而后查询到某些对应的键以后与之对应的键导出来的过程。    
   NDS是互联网的基础设施类的服务、这是一种协议、协议最后是要实现的、协议实现的软件很多、我们前面安装配置好的就是其中一个、我们也是用这个BIND来实现DNS的、他运行时监听在UDP的53号端口上、同时监听TCP的53号端口、两种协议的53号端口都被监听了。

wKioL1Mi3yijHocWAAKTNt9KY6g081.jpg

wKiom1Mi31LCW_wXAAHkT48k8Qc964.jpg


   域名:如 http://tanxw.blog.51cto.com/  --> IP地址

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

wKioL1Mi3v3jrpefAAFYbGzvZPQ614.jpg


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


   那DNS服务是怎么实现的呢、接下来我们就来说说他的实现过程及基本步骤,上一篇我们已经安装好了BIND这个软件包了、基于这个软件我们来实现DNS服务器:

   先来个案例,假如我们注册了一个域名:tanxw.com、有域名了、解析IP地址就可以挂你的网站上去了、这里我们的网段为172.16.251.、在这个服务内我们
   提供mail服务:172.16.251.128
   提供web服务:172.16.251.176
   提供pop服务:是mail的别名,指向mail
   提供ftp服务:是www的别名,指向www
   还有一台DNS服务器:当前服务器地址 172.16.251.171

   看看我们怎么解析:

正向解析
   首先配置主配置文件,定义区域、配置文件在/etc/named.confg下、有哪些区域需要定义的、一般主配置文件中通常有三个区域、一个是根、还有本地localhost、以及127.0.0.1的反向区域。
   其次我们每个区域要完成解析要有区域数据文件、所以还要定义区域数据库文件、而区域数据文件一般都在/var/named/中、运行named的进程还是named这个用户、组也是、这些区域文件或配置文件都不允许额外的其他用户访问、所以他们的权限通常都为640的。

   查看全球13个根节点的服务:
   # dig -t NS .

   于是我们就来配置一下以上案例的相关配置信息了、定义我们的区域
   # vim /etc/named/named.conf

   在后定义我们注册的那个域
   zone "tanxw.com." IN {
          type master;
          file "tanxw.com.zone";
   };

wKioL1MhlbPy8Dy4AAE59eXAgQ0399.jpg

再切换到/var/named/下创建tanxe.com.zone数据文件、根据我们上规划好的:
   # vim /var/named/tanxe.com.zone

wKiom1MhlhDCpjHEAAEivLcvM0Q385.jpg


   然后修改一下权限和属主属组:
   # chown root:named /var/named/tanxe.com.zone
   # chmod 640 /var/named/tanxe.com.zone

wKioL1Mhlhay5VsCAAE5vRE1uJ4114.jpg


   检查主配置文件和区域数据文件有没有语法错误:
   # named-checkconf    这个是检查主配置文件语法的
   这个是检查区域数据文件语法的、指定区域和指定文件
   # named-checkzone "tanxe.com" /var/named/tanxw.com.zone
   即检查区域、又检查主配置文件的
   # service named configtest

wKioL1MhljeiB33eAAB31nuRi1I499.jpg


   重启服务后、解析域名:
   # service named restart
   # dig -t A www.tanxw.com @172.16.251.171  
 wKiom1MhlpHRlB4PAAMEN1ChZdU658.jpg

wKioL1MhlsywXqh7AAGt08JSPgo312.jpg

 

反向解析
   好了、这样我们就可以解析域名了,这个是正向解析、正向解析就是把域名解析成IP地下、而反向的则是把IP地址解析成域名、那我们再来看看反向的怎么解析呢:

   第一步:在我们的named的配置文件中定义一个反向的区域、把我们的网络地址反过来写:如下
   # vim /etc/named/named.conf
   zone "251.16.172.in-addr.arpa" IN {
       type master;
       file "251.16.172.zone";
   };

wKiom1Mhl0LSWInMAACBhoewnLE616.jpg

 


   再切换到/var/named/目录下创建区域数据文件、这里我们复制正向的那个区域数据文件进行修改:
   # cp /var/named/tanxw.com.zone /var/named/251.16.172.zone
   # vim /var/named/251.16.172.zone
   $TTL 43200
   @       IN      SOA     dns.tanxw.com.  admin.tanxw.com. (
                           2014031202
                           2H
                           10M
                           7D
                           1D )
           IN      NS      dns.tanxw.com.
   171     IN      PTR     dns.tanxw.com.
   128     IN      PTR     mail.tanxw.com.
   176     IN      PTR     www.tanxw.com.
wKiom1Mhl5bzM4JoAADtPAx9oQY261.jpg

这两个配置好之后还要改一下你的NDS服务器的指向、编辑/etc/resolv.conf:
   # vim /etc/resolv.conf
wKioL1Mhl5Sj7sO-AABhS1qIpsI589.jpg


   检查主配置文件和区域数据文件有没有语法错误:
   # named-checkconf    这个是检查主配置文件语法的
   这个是检查区域数据文件语法的、指定区域和指定文件
   # named-checkzone "tanxe.com" /var/named/tanxw.com.zone

   重启服务后、解析域名:
   # service named restart

   然后我们就可以来测试一下看了:
   # dig -x 172.16.251.176

wKiom1Mhl-nyu_4vAAKOWEKMnbY645.jpg

 

 

   OK、到此为止我们的正反向域名解析也都算是完也了、那接下来我们再来说说DNS服务器的主从复制关系

DNS服务器的主从复制关系
 

   首先我们要有两台NDS服务器、我这里就启动了两台虚拟机了、要想为域内的DNS服务器必须要在上级获得授权的前提下、添加从服务器的关键的一步:那就是在你主服务器的区域文件中为从服务器添加一条ND记录和对应的A记录。

   启动我们另一台虚拟机后、安装上BIND、安装过程上一篇文章我们已经说过了、你也可以用yum来安装、安装完后我们查看一下他的版本:

   wKioL1MhmavjHzhnAABNLTRDYZg275.jpg


   版本为9.9的、跟我们前面安装的的主服务器的版本一致、这里要注意的是、从服务器的版本一定要高于主服务器的版本、如果主服务器的版本高于从服务器的、那么主服务器的一些新功能可以在从服务器上不兼容了。

   安装好后根据我们上面说的、切换去我们的主服务器的区域文件目录下、注意、这里是主服务器的区域文件、编辑tanxw.com.zone这个文件加一条新的NS记录、两台DNS服务都可以互相成为主从:
   # cd /var/named/
   # vim /var/named/tanxw.com.zone
   wKioL1MhmfOAWRftAAFOvvGp2Jc836.jpg


   切换到从服务器这里、首先保证从服务器可以跟我们的主服务器可以通信、那我们ping一下:
   # ping 172.16.251.171

   wKiom1MhmkHjbvNoAAGXKiXo5-Y909.jpg


   好了、没问题、那我们就去配置一下从服务器的主配置文件了、我们注释掉一些我们不要的项:
   # vim /etc/named.conf
   wKioL1Mhmkih8QUTAAHHa6uK7Vs130.jpg

然后再定义我们的区域数据文件、在最后定义一个区域:
   # vim /etc/named.rfc1912.zones

   wKiom1MhmpuQZfXuAAC3prsqbAo345.jpg


   再改一下你的从NDS服务器地址、编辑/etc/resolv.conf:
   # vim /etc/resolv.conf
   wKioL1MhmqCz3oKxAAB-wU2LJ9w400.jpg

   然后启用named服务、同时查看一下监听的端口是否有了:
   # service named start
   # ss -tnul |grep "53"

   wKiom1MhmvzwE3sCAAE0VrdkRTY254.jpg


   服务启动后都要看一下日志、这个是一个好习惯、不管有没有问题都要看一眼、下面说明数据已经开始传输了:    wKioL1Mhmx3SY4a4AAOBorkY1Nk721.jpg


   再去看一下/var/named/salves/目录下有没有生成一个tanxw.com.zone的文件:
   # ls /var/named/salves/
   # vim /var/named/salves/tanxw.com.zone    

   wKioL1Mhm-DCQAjtAACEVR9TzJQ769.jpg

   wKiom1MhnBLTKLwDAAEGAzfT9JA739.jpg

 

   然后我们再用从服务器解析一下看、完全没问题、是不是:

   # dig -t NS tanxw.com @172.16.251.127  
   wKiom1Mhm-GB11wOAAIa9HxTPCI570.jpg

   好了、一切OK了、到这里我们的主从复制也完成了!

=======================================我是分隔线、我又出来了============================


子区域授权和转发机制

   BIND子域授权的实现:假我们一家公司获得了某一个域的使用权、而我们想在这个域下分出几个子域来分别分给一些部门使用、这样也方便管理、举个例子:tanxw.com下有两个子域、分别是tech.tanxw.com、fin.tanxw.com、而他们两个下面也他别有自己的www和mail等主机、而每一个域内最主要的一台主机就是dns主机、所谓子域授权就是在父域的配置文件中添加如下项:
   1、要授权给谁要明确说明、也就是授权的子区域名称
   2、指定子区域的名称服务器
   3、子区域的名称服务器的IP地址

   首先找到你的父域名称服务器、我这里就是主服务器了、再找到正向解析区域数据配置文件、添加一项:
   # vim /var/named/tanxw.com.zone
   wKiom1MhnLHA_6YzAAFt3Hi1_fo314.jpg


   然后我们再找一台服务器、我这里再启用一个虚拟机(IP为172.16.251.134)、当然、可以设置在不同的网段、用作子域的服务器、同样安装好BIND、配置好匹配数据文件等相关的配置、这个我们前面都做了很多了、轻车熟路了:
   # vim /etc/named.conf
   wKiom1MhnTrDmWbLAAHHa6uK7Vs311.jpg


   # vim /etc/named.rfc1912.zones
   zone "tech.tanxw.com" IN {
       type master;
       file "tech.tanxw.com.zone"
   };

   # vim /var/named/tech.tanxw.com.zone
   $TTL 600
   @         IN        SOA        dns.tech.tanxw.com.        admin.tech.tanxw.com. (
                           2014031301
                           1H
                           10M
                           7D
                           1D )
           IN        NS       dns
           IN        MX  10   mail
   dns     IN        A        172.16.251.134
   www     IN        A        172.16.251.121
   mail    IN        A        172.16.251.120

   修改他的属主和属组、还有权限:
   # chown root:named /var/named/tech.tanxw.com.zone
   # chmod 640 /var/named/tech.tanxw.com.zone

 

   启动服务:

   wKiom1MhniLyLzQ6AAGHwsPwtx0923.jpg  


   测试一下、看看可不可以解析:
   # dig -t A www.tech.tanxw.com @172.16.251.134    wKiom1MhnlSDm4wSAAK8ezgVi7Q746.jpg
   

 

   在父域的服务器上解析看:
   # dig -t NS tech.tanxw.com @172.16.251.171
   wKioL1MhntySNIXkAALHcx9-f_I865.jpg

在此、我们的子域授权功能也能够顺利完了、你可以了吗?

   当然、我们@172.16.251.134这台子域服务器当接收到不负责的区域请求时都会转发给根、比如:
   # dig -t A www.tanxw.com @172.12.251.134
   他不负责解析父域名、所以他会转发给根、那如果我们不想转发给根、我们想转发给指定的DNS服务器、如果指定的服务器也不响应我们的转发请求、那不是再得去找根呢、这里我们配置他如果转发的那个服务器不响应我们就不去找根了、那要怎么完全区域转发呢;
   这里我们以@172.12.251.134这台服务为转发不解析的区域:
   # vim /etc/named.rfc1912.zones

   wKiom1Mhn4KjJ-8pAACgshxpn5I302.jpg    

 

   这里注意一个、编辑/etc/named.conf配置文件、把最后一行注释了、因为转了时要递归、递归时要验证信息的合法性、可能不会通过。

   保存退、重启服务、测试一下:    
wKiom1Mhn7rQnyZwAAOQOUriLrg558.jpg

 

   OK、服务器转发的我们也完成了、接下来我们还是DNS服务的功能、视图的性能压力测试!

   接下篇:总结之:CentOS6.5 DNS服务BIND配置、正反向解析、主从及压力测试(4)

 

本文出自 “我拿青春换酒钱” 博客,请务必保留此出处http://tanxw.blog.51cto.com/4309543/1376091

(责任编辑:IT)