1 安装bind 服务
yum -y install bind*
主服务器:
named.conf:
[root@localhost etc]# more named.conf
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.ip6.local";
allow-update { none; };
};
zone "255.in-addr.arpa" IN {
type master;
file "named.broadcast";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.zero";
allow-update { none; };
};
zone "2.168.192.in-addr.arpa" IN {
type master;
file "2.168.192.zone";
allow-transfer { 192.168.2.163; };
notify yes;
also-notify{ 192.168.2.163;}
};
zone "test.com" IN {
type master;
file "test.com";
allow-transfer { 192.168.2.163;};
notify yes;
also-notify{ 192.168.2.163;};
};
test.com:
[root@localhost named]# more test.com
$TTL 86400
@ IN SOA ns.test.com. root.test.com. (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns.test.com.
IN A 192.168.2.164
ns IN A 192.168.2.164
www IN A 192.168.2.164
2.168.192.zone:
[root@localhost named]# more .2.168.192.zone
$TTL 86400
2 .168.192.in-addr.arpa. IN SOA ns.test.com. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
@ IN NS ns.test.com.
8 IN PTR ns.test.com.
从服务器:
从服务器的安装很简单只需要配置named.conf文件即可,区域文件无须手动建立:
[root@localhost etc]# vi named.conf
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.ip6.local";
allow-update { none; };
};
zone "255.in-addr.arpa" IN {
type master;
file "named.broadcast";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.zero";
allow-update { none; };
};
zone "2.168.192.in-addr.arpa" IN {
type slave;
file "slaveslave.zone";
masters{192.168.2.164;};
};
zone "test.com" IN {
type slave;
file "slaves/test.salve";
masters{192.168.2.164;};
};
上述配置后,分别启动主从的DNS服务器后,从服务器会在slaves/下生成test.salve区域文件,这样主从服务器即建好了。
2 配置rndc,使bind平滑重载配置文件
生成rndc控制命令的key文件
[root@linux usr]# sbin/rndc-confgen > /etc/rndc.conf
从rndc.conf文件中提取named.conf用的key
[root@linux usr]# cd /etc
[root@linux etc]# tail -10 rndc.conf | head -9 | sed s/#\ //g >
/var/named/chroot/etc/named.conf
自动在/var/named/chroot/etc下生成named.conf文件
进入/var/named/chroot/etc
[root@linux etc]# cd /var/named/chroot/etc
现在named.conf文件中有了rndc-key区段
[root@linux etc]# more named.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Nd0nLoL8t4Mv0iSpqP1noA==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
3 用脚本测试后端主机的存活~
#!/bin/bash
#文件说明:
# /tmp/domain_list.txt 需要监控的域名列表,每行一个域名
# /tmp/${domain}_online_ip.txt 记录在线的服务器ip,需要提前写入IP,每行一个IP
# /tmp/${domain}_down_ip.txt 记录有故障的服务器ip
# /tmp/curl.txt 记录curl获取的http状态码
# /tmp/${domain}_${server_ip}_cur_time.txt 记录服务器出现故障的次数
#===============================================================================
#设置一些必要的变量
keyname=rndc-key
keysecret=gAnBYq6xSv7FKTZFmzAD0Q==
#用来检测本机网络是否正常
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/${domain}_online_ip.txt ] ;then
for server_ip in `cat /tmp/${domain}_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/${domain}_${server_ip}_cur_time.txt
###状态码非200时
else
###开始计算故障次数
cur_time=0
[ -s /tmp/${domain}_${server_ip}_cur_time.txt ] && cur_time=`cat /tmp/${domain}_${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/${domain}_online_ip.txt
###记录故障ip到文件
echo $server_ip >> /tmp/${domain}_down_ip.txt
###删除记录此ip的故障文件
rm -f /tmp/${domain}_${server_ip}_cur_time.txt
else
###记录故障次数
echo $cur_time > /tmp/${domain}_${server_ip}_cur_time.txt
fi
fi
rm -f /tmp/curl.txt
done
fi
}
#用来检测故障ip列表健康状态
function down_detect(){
if [ -s /tmp/${domain}_down_ip.txt ];then
for server_ip in 'cat /tmp/${domain}_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
###从${domain}_down_ip.txt删除故障ip
sed -i "/$server_ip/d" /tmp/${domain}_down_ip.txt
###重新添加此ip到${domain}_online_ip.txt
echo $server_ip >> /tmp/${domain}_online_ip.txt
fi
rm -f /tmp/curl.txt
done
fi
}
network_detect
if [ -s /tmp/domain_list.txt ];then
for domain in 'cat /tmp/domain_list.txt' ;
do
online_detect
down_detect
done
else
echo "/tmp/domain_list.txt not found!"
exit 1
fi
遇到的问题~ 要是使用rndc reload的时候,从没有同步~ 要改下zone的版本号~
还有就是加个 also-notify
想要尽快的让下面的dns更新记录的话,尽量把ttl的时间改小~ 但是太小的话,dns端的压力有点大的~ 可以看情况调节~ 我一般设置为30
什么是域名的TTL值?TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间。当各地的DNS服务器接受到解析请求时,就会向域名指定的NS服务器(权威域名服务器)发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器(各地的缓存服务器,也叫递归域名服务器)中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向NS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。 域名DNS分两种,一种是权威域名服务器,域名注册商的服务器都为权威域名服务器,TTL值只能在权威服务器修改,还有一种域名解析服务器就是缓存DNS服务器,比如各地ISP上网设置的DNS服务器,它的作用主要是把域名解析结果缓存到本地,方便你查询。域名DNS的TTL值实际上就是各地的DNS缓存服务器多久去你的权威域名解析服务器(NS)获取一次你域名的解析IP。 那么域名解析的TTL只应该设置为多少合适呢,下面有两个建议,你可以结合自己参考一下: 一.增大TTL值,以节约域名解析时间,给网站访问加速。 一般情况下,域名的各种记录是极少更改的,很可能几个月、几年内都不会有什么变化。我们完全可以增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长,这样在更长的一段时间内,我们访问这个网站时,本地ISP的DNS服务器就不需要向域名的NS服务器发出解析请求,而直接从缓存中返回域名解析记录。 二.减小TTL值,减少更换空间时的不可访问时间。 更换空间99.9%会有DNS记录更改的问题,因为TTL缓存的问题,新的域名记录在有的地方可能生效了,但在有的地方可能等上一两天甚至更久才生效。结果就是有的人可能访问到了新服务器,有的人访问到了旧服务器。如果原来的域名TTL值设置的小,各地的ISP域名缓存服务器服务器就会很快的访问你域名的权威DNS解析服务器,尽快把你域名的DNS解析IP返回给查询者 这就是说你如果想要解析速度,各地ISP的DNS服务器缓存你的域名,你就需要把TTL值设置大一些,如果你想域名更换空间或者IP后能尽快解析到新的IP上,就需要把TTL值设置小一些 总结:对于IP地址相对固定,或短期内不会变更IP地址的用户来说TTL值设置的大些如几个小时或更大些为宜。调大TTL值可以显著的提高域名的解析稳定性和速度。而对于近期有计划变更IP地址的用户需要提前把TTL值改小,以便使缓存在世界各地DNS服务器上的旧域名记录迅速过期,等IP地址固定下来后再把TTL值改大。
|