1、安装bind
yum install -y bind bind-chroot bind-utis
2、配置named.conf
[root@dns /]# vi /etc/named.conf
注:在options中增加 rrset-order { order cyclic; }; 分配的会更均匀。
3、配置named.rfc1912.zones
[root@dns /]# vi /etc/named.rfc1912.zones
4、配置正向解析
[root@dns /]# cd /var/named/ [root@dns named]# cp named.localhost test.com.zone(一定要和主配置文件里面定义的zone文件名一致) [root@dns named]# vi test.com.zone
zone配置文件简单说明:
常见的正解文件 RR 相关信息
[domain] IN [[RR type] [RR data]]
主机名. IN A IPv4 的 IP 地址
主机名. IN AAAA IPv6 的 IP 地址
领域名. IN NS 管理这个领域名的服务器主机名字.
领域名. IN SOA 管理这个领域名的七个重要参数(如上说明)
领域名. IN MX 顺序数字 接收邮件的服务器主机名字
主机别名. IN CNAME 实际代表这个主机别名的主机名字.
单位:W= 周、D= 日、H= 小时、M= 分钟。
$TTL 86400
@ IN SOA ns.helome.com. root ( # ns.test.web. 是DNS服务器的名称
0 ; serial (d. adams) 仅作为序列号而已
1D ; refresh 服务器的更新时间
15M ; retry 重新更新时间间隔
1W ; expiry 多久之后宣布失败
1H ) ; minimum 相当于缓存记忆时间
@ IN NS ns.helome.com.
@ IN MX 5 mail.helome.com. (5为优先级别)
ns IN A 192.168.32.131
www IN A 192.168.32.131
mail IN A 192.168.32.131
5、关闭iptables
service iptables stop
6、看配置文件有没有读取权限
[root@dns /]# ll /var/named/
如果没有 chmod +r /var/named/* 即可
7、设置rndc.key
rndc-confgen -r /dev/urandom -a
8、启动bind
service named start
bind dns 宕机检测 故障切换shell脚本
www.test.com解析有多个A记录,下面是实现故障切换的脚本:
通过检测网站的返回状态码来确定服务器的健康状况,如果不返回或返回的状态非200,则开始记录一次故障,连续三次故障后开始删除此域名的故障ip A记录,如果之后的检测发现服务器已经恢复,则重新添加此ip的A记录。
要正常使用下面脚本,需要注意以下事项:
1、把域名的A记录IP写入/tmp/online_ip.txt文件,格式为每行一个IP。
2、根据bind设置修改脚本中的三个变量
- domain=www.test.com
- keyname=rndc-key
- keysecret=PwLjE4wQaXHnt/yQi+lY6g==
(vi /etc/rndc.key , 可获取keyname和keysecret)
3、在named.conf文件中的zone添加如下代码:
vi /etc/named.rfc1912.zones中增加
allow-update {key rndc-key;};
rndc-key修改为自己的。
#!/bin/bash #=============================================================================== #Description: this script is to automactic update dns record when website is down. #Author : www.centos.bz #文件说明: # /tmp/online_ip.txt 记录在线的服务器ip,需要提前写入IP,每行一个IP # /tmp/down_ip.txt 记录有故障的服务器ip # /tmp/curl.txt 记录curl获取的http状态码 # /tmp/${server_ip}_cur_time.txt 记录服务器出现故障的次数 #=============================================================================== #设置一些必要的变量 domain=www.test.com keyname=rndc-key keysecret=PwLjE4wQaXHnt/yQi+lY6g== #用来检测本机网络是否正常 function network_detect(){ ping -c1 8.8.8.8 >/dev/null 2>&1 && echo connect || exit 1 } #用来删除DNS记录 function del_record(){ /usr/local/bind/bin/nsupdate <<EOF key $keyname $keysecret update delete $domain A $1 send quit EOF } #用来增加DNS记录 function add_record(){ /usr/local/bind/bin/nsupdate <<EOF key $keyname $keysecret update add $domain 3600 A $1 send quit EOF } #用来检测在线ip列表健康状态 function online_detect(){ if [ -s /tmp/online_ip.txt ] ;then for server_ip in `cat /tmp/online_ip.txt` ; do curl -I -l -H "Host:$domain" $server_ip -o "/tmp/curl.txt" >/dev/null 2>&1 ###判断状态码是否为200 if [ -s /tmp/curl.txt ] && grep '200 OK' /tmp/curl.txt >/dev/null 2>&1;then echo "OK" ###清空故障次数 rm -f /tmp/${server_ip}_cur_time.txt ###状态码非200时 else ###开始计算故障次数 cur_time=0 [ -s /tmp/${server_ip}_cur_time.txt ] && cur_time=`cat /tmp/${server_ip}_cur_time.txt` cur_time=`expr $cur_time + 1` ###当故障次数大于等于3时 if [ $cur_time -gt 3 ];then ###删除故障ip记录 del_record $server_ip ###从在线ip列表中删除故障ip sed -i "/$server_ip/d" /tmp/online_ip.txt ###记录故障ip到文件 echo $server_ip >> /tmp/down_ip.txt ###删除记录此ip的故障文件 rm -f /tmp/${server_ip}_cur_time.txt else ###记录故障次数 echo $cur_time > /tmp/${server_ip}_cur_time.txt fi fi rm -f /tmp/curl.txt done fi } #用来检测故障ip列表健康状态 function down_detect(){ if [ -s /tmp/down_ip.txt ];then for server_ip in `cat /tmp/down_ip.txt` ; do curl -I -l -H "Host:$domain" $server_ip -o "/tmp/curl.txt" >/dev/null 2>&1 if [ -s /tmp/curl.txt ] && grep '200 OK' /tmp/curl.txt >/dev/null 2>&1;then ###添加A记录 add_record $server_ip ###从down_ip.txt删除故障ip sed -i "/$server_ip/d" /tmp/down_ip.txt ###重新添加此ip到online_ip.txt echo $server_ip >> /tmp/online_ip.txt fi rm -f /tmp/curl.txt done fi } network_detect online_detect down_detect