> shell编程 >

DNS自动化部署shell脚本

最近研究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 {
typemaster;
file"$NAME.zone";
allow-transfer { $SLAVE; };
also-notify { $SLAVE; };
allow-update { none; };
};
zone "$ARPA_IP.in-addr.arpa"IN {
typemaster;
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 {
typemaster;
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
fori 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
(责任编辑:IT)