IT技术互动交流平台

CentOS Bind DNS自动化部署

作者:wgkgood  发布日期:2013-08-29 10:05:10

最近研究DNS主从服务,也是参考了很多文章,这里记录一下,方便大家少走弯路,DNS服务可以算是Linux服务中比较难的一个了,尤其是配置文件书写,少一个字符都有可能造成错误。

那什么是DNS呢?简单的说就是完成域名到IP的解析过程。简洁的域名能让人们更方便记忆,不需要记那么长的IP访问某一个网站。
DNS解析过程到底是怎样的呢?
第一步:客户机访问某个网站,请求域名解析,首先查找本地HOST文件,如果有对应域名、IP记录,直接返回给客户机。如果没有则将该请求发送给本地的域名服务器:
第二步:本地DNS服务器能够解析客户端发来的请求,服务器直接将答案返回给客户机。
第三步:本地DNS服务器不能解析客户端发来的请求,分为两种解析方法
1、采用递归解析:本地DNS服务器向根域名服务器发出请求,根域名服务器对本地域名服务的请求进行解析,得到记录再给本地DNS服务器,本地DNS服务器将记录缓存,并将记录返给客户机。
2、采用迭代解析:本地DNS服务器向根域名服务器发出请求,根域名服务器返回给本地域名服务器一个能够解析请求的根的下一级域名服务器的地址,本地域名服务器在向根返回的IP地址发出请求,最终得到域名解析记录。
如上只是简单介绍了一下DNS相关知识,言归正传,如下通过脚本自动安装并添加域名解析,脚本可以根据自己的需求修改:(脚本适用于CentOS x86_64 5.8系列)


#!/bin/sh 
#auto install config bind server 
#wugk 2013-08-28 
#定义变量 
BND_ETC=/var/named/chroot/etc 
BND_VAR=/var/named/chroot/var/named 
BAK_DIR=/data/backup/dns_`date +%Y%m%d-%H%M` 
##Backup named server 
if
      [ ! -d  $BAK_DIR ];then 
      echo "Please waiting  Backup Named Config ............"
      mkdir   -p  $BAK_DIR 
      cp -a  /var/named/chroot/{etc,var}   $BAK_DIR 
      cp -a  /etc/named.* $BAK_DIR 
fi 
##Define Shell Install Function 
Install () 
{ 
  if
     [ ! -e /etc/init.d/named ];then 
     rpm -e --nodeps bind-utils 
     rpm -e --nodeps bind-libs 
     rpm -e --nodeps bind 
     rpm -e bind-chroot 
     rpm -e caching-nameserver 
     rpm -ivh --nodeps  bind-9.3.6-20.P1.el5_8.6.x86_64.rpm  bind-chroot-9.3.6-20.P1.el5_8.6.x86_64.rpm    bind-libs-9.3.6-20.P1.el5_8.6.x86_64.rpm  bind-utils-9.3.6-20.P1.el5_8.6.x86_64.rpm   caching-nameserver-9.3.6-20.P1.el5_8.6.x86_64.rpm 
                                                      
else
     echo -------------------------------------------------
     echo "The Named Server is exists ,Please exit ........."
     sleep 1
 fi 
} 
##Define Shell Init Function 
Init_Config () 
{ 
       cd $BND_ETC ;ls ./*
       cp   -p  named.caching-nameserver.conf named.conf 
       sed  -i -e 's/localhost;/any;/g' -e '/port/s/127.0.0.1/any/g' named.conf 
       echo -------------------------------------------------
       sleep 2
       echo "The named.conf config Init success !"
} 
##Define Shell Add Name Function 
Add_named () 
{ 
##DNS name 
       read -p  "Please  Insert Into Your Add Name ,Example 51cto.com :" NAME 
       echo $NAME |grep -E "com|cn|net|org"
                                                           
       while
        [ "$?" -ne 0 ] 
                                                             
         do 
        read -p  "Please  reInsert Into Your Add Name ,Example 51cto.com :" NAME 
        echo $NAME |grep -E "com|cn|net|org"
                                                            
     done 
## IP address 
       read -p  "Please  Insert Into Your Name Server IP ADDress:" IP 
       echo $IP |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
       while
       [ "$?" -ne "0" ] 
                                                           
        do 
        read -p  "Please  reInsert Into Your Name Server IP ADDress:" IP 
       echo $IP |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
      done 
       ARPA_IP=`echo $IP|awk -F. '{print $3"."$2"."$1}'` 
       ARPA_IP1=`echo $IP|awk -F. '{print $4}'` 
       cd  $BND_ETC 
       grep  "$NAME" named.rfc1912.zones 
                                                          
if
         [ $? -eq 0 ];then 
         echo "The $NAME IS exist named.rfc1912.zones conf ,please exit ..."
         exit 
else
        read -p  "Please  Insert Into SLAVE Name Server IP ADDress:" SLAVE 
                                                          
        echo $SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
        while
                                                     
        [ "$?" -ne "0" ] 
        do 
        read -p  "Please  Insert Into SLAVE Name Server IP ADDress:" SLAVE 
        echo $SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
        done 
        grep  "rev" named.rfc1912.zones 
                                                     
       if
         [ $? -ne 0 ];then 
       cat >>named.rfc1912.zones <<EOF 
#`date +%Y-%m-%d` Add $NAME CONFIG 
zone "$NAME" IN { 
        type master; 
        file "$NAME.zone"; 
        allow-transfer { $SLAVE; }; 
        also-notify { $SLAVE; }; 
        allow-update { none; }; 
}; 
zone "$ARPA_IP.in-addr.arpa" IN { 
        type master; 
        file "$ARPA_IP.rev"; 
        allow-transfer { $SLAVE; }; 
        also-notify { $SLAVE; }; 
        allow-update { none; }; 
}; 
EOF 
      else
       cat >>named.rfc1912.zones <<EOF 
#`date +%Y-%m-%d` Add $NAME CONFIG 
zone "$NAME" IN { 
        type master; 
        file "$NAME.zone"; 
        allow-transfer { $SLAVE; }; 
        also-notify { $SLAVE; }; 
        allow-update { none; }; 
}; 
EOF 
    fi 
fi 
       [ $? -eq 0 ]&& echo "The $NAME config name.rfc1912.zones success !"
       sleep 3 ;echo "Please waiting config $NAME zone File ............."
       cd  $BND_VAR 
                                                           
       read -p "Please insert Name DNS A HOST ,EXample  www or mail :" HOST 
       read -p "Please insert Name DNS A NS IP ADDR ,EXample 192.168.111.130 :" IP_HOST 
       echo $IP_HOST |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
       ARPA_IP2=`echo $IP_HOST|awk -F. '{print $3"."$2"."$1}'` 
       ARPA_IP3=`echo $IP_HOST|awk -F. '{print $4}'` 
       while
       [ "$?" -ne "0" ] 
do 
                                                           
       read -p "Please Reinsert Name DNS A IPADDRESS ,EXample 192.168.111.130 :" IP_HOST 
       echo $IP_HOST |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
done 
       cat >$NAME.zone <<EOF 
\$TTL    86400
@               IN SOA  localhost.      root.localhost. ( 
                                        43              ; serial (d. adams) 
                                        1H              ; refresh 
                                        15M             ; retry 
                                        1W              ; expiry 
                                        1D )            ; minimum 
                IN  NS          $NAME. 
EOF 
                                                          
       REV=`ls  *.rev` 
       ls  *.rev >>/dev/null 
                                                       
if
       [ $? -ne 0 ];then 
       cat >>$ARPA_IP.rev <<EOF 
\$TTL    86400
@       IN      SOA     localhost.    root.localhost.  ( 
                                      1997022703 ; Serial 
                                      28800      ; Refresh 
                                      14400      ; Retry 
                                      3600000    ; Expire 
                                      86400 )    ; Minimum 
            IN  NS  $NAME. 
EOF 
        echo  "$HOST             IN  A           $IP_HOST" >>$NAME.zone 
        echo  "$ARPA_IP3         IN  PTR         $HOST.$NAME." >>$ARPA_IP.rev 
                                                            
        [ $? -eq 0 ]&& echo -e "The $NAME config success:\n$HOST       IN  A           $IP_HOST\n$ARPA_IP3         IN  PTR         $HOST.$NAME."
else
                                                           
                                                            
        sed -i  "9a IN  NS  $NAME." $REV 
        echo  "$HOST             IN  A           $IP_HOST" >>$NAME.zone 
        echo  "$ARPA_IP3         IN  PTR         $HOST.$NAME." >>$REV 
                                                            
        [ $? -eq 0 ]&& echo -e "The $NAME config success1:\n$HOST       IN  A           $IP_HOST\n$ARPA_IP3         IN  PTR         $HOST.$NAME."
fi 
} 
##Define Shell List A Function 
Add_A_List () 
{ 
if
       cd  $BND_VAR 
       REV=`ls  *.rev` 
       read -p  "Please  Insert Into Your Add Name ,Example 51cto.com :" NAME 
       [ ! -e "$NAME.zone" ];then 
       echo "The $NAME.zone File is not exist ,Please ADD $NAME.zone File :"
       Add_named ; 
else
                                                           
       read -p "Please Enter List Name A NS File ,Example /tmp/name_list.txt: " FILE
    if
                                                     
                                                           
       [ -e $FILE ];then 
                                                           
       for i in  `cat $FILE|awk '{print $2}'|sed "s/$NAME//g"|sed 's/\.$//g'` 
       #for i in  `cat $FILE|awk '{print $1}'|sed "s/$NAME//g"|sed 's/\.$//g'` 
do 
       j=`awk -v I="$i.$NAME" '{if(I==$2)print $1}' $FILE` 
                                                         
       echo -----------------------------------------------------------
       echo "The $NAME.zone File is exist ,Please Enter insert NAME HOST ...."
       sleep 1
       ARPA_IP=`echo $j|awk -F. '{print $3"."$2"."$1}'` 
       ARPA_IP2=`echo $j|awk -F. '{print $4}'` 
       echo  "$i             IN  A           $j" >>$NAME.zone 
       echo  "$ARPA_IP2      IN  PTR      $i.$NAME." >>$REV 
       [ $? -eq 0 ]&& echo -e "The $NAME config success:\n$i      IN  A           $j\n$ARPA_IP2         IN  PTR         $i.$NAME."
done 
                                                           
                                                        
     else
                                                           
       echo "The $FILE List File IS Not Exist .......,Please exit ..."
                                                       
     fi 
fi 
} 
##Define Shell Select Menu 
                                                         
PS3="Please select Menu Name Config: "
select i in "自动安装Bind服务"  "自动初始化Bind配置" "添加解析域名"  "批量添加A记录"
do 
case   $i   in
       "自动安装Bind服务") 
       Install 
;; 
       "自动初始化Bind配置") 
       Init_Config 
;; 
       "添加解析域名") 
       Add_named 
;; 
       "批量添加A记录") 
       Add_A_List 
                                                           
;; 
       * ) 
       echo -----------------------------------------------------
       sleep 1
       echo "Please exec: sh  $0  { Install(1)  or Init_Config(2) or Add_named(3) or Add_config_A(4) }"
;; 
esac 
done

 

Tag标签: CentOS   Bind   DNS  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规