使用bind
构建高可用智能
DNS
服务器
作者
:
陆文举
luwenju@live.cn
2010-12-11
应用背景:
某远程教育公司服务器放于两个
BGP
机房,虽然是
BGP
机房,但是两个机房的电信、联通出口带宽不是太理想,一个机房电信用户访问较慢,另一个机房联通用户访问较慢。为了提高用户体验,所以采用了智能
DNS
来解决这个问题。在此构建智能
DNS
的出发点主要有两个,一个是利用智能
DNS
可以控制用户的访问流向,比如当某一个机房负载较大时,我们可以利用智能
DNS
将负载合理的划分到另一个机房;第二个考虑到以后业务发展需求,当以后用户较大时可以在全国各地放置服务器,然后利用智能
DNS
来实现
CDN
(目前
CDN
是花钱购买第三方公司的)。
目前智能
DNS
的实现主要有两种方式,一种是使用
F5
公司的
BIG-IP GTM
,另一种是使用
bind
自带的
view
来实现。
BIG-IP GTM
是一款商业产品,功能、性能极为强大,但是由于价格昂贵,中小型企业基本不会考虑花巨资购买此产品,所以只有一些门户网站将此用于核心业务,比如百度、阿里巴巴、金山;
bind
是一款开源程序,利用其自带的
view
可轻松实现智能
DNS
功能,其功能、性能都很好,一台普通配置的服务器,可每秒可处理
2-4
千查询请求。下面我们看一下利用
bind
的
view
功能是如何实现智能
DNS
的。
bind
的
view
原理:
view
在
bind
中被称为视图功能,我们都知道
DNS
最基本的功能就是响应域名的查询,然后返回该域名的地址数据。而
view
和常规的
DNS
不同,当用户访问某个域名时,智能
DNS
服务器上的
view
会先判断一下他的
IP
地址,然后和内部
IP
表做匹配,然后再返回给用户查询请求(注:一个区域会有多个
view
,每个
view
的配置均不相同,当用户访问一个域名时,
view
会根据用户
IP
判断此用户
IP
属于哪个
view
,然后某个
view
再给用户返回查询请求)
环境拓扑
一、
DNS-master
安装及配置
1
、安装
bind
#tar zxvf bind-9.6.2-P2.tar.gz
#cd bind-9.6.2-P2
#./configure –prefix=/usr/local/named–enable-threads –disable-openssl-version-check
#make && make install
2
、生成
rndc
配置文件
rndc.conf
#/usr/local/named/sbin/rndc-confgen >/usr/local/named/etc/rndc.conf
3
、生成主配置文件
named.conf
#cd /usr/local/named/etc/
#tail -n10 rndc.conf | head -n9 | sed -es/#\//g > named.conf
4
、生成
key
,用于主从
view
同步验证
每个视图使用一个
key
,用于主从直接数据传输的认证、数据加密
# /usr/local/named/sbin/dnssec-keygen -ahmac-md5 -b 128 -n HOST liantong
# /usr/local/named/sbin/dnssec-keygen -a hmac-md5-b 128 -n HOST dianxin
# /usr/local/named/sbin/dnssec-keygen -a hmac-md5-b 128 -n HOST any
查看一下
key
的具体内容,其中红色部分是需要添加到
bind
的主配置文件
#more Kliantong.+157+35810.private
Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key:
3ZVlHsAwi8ZRoyHt/g+F+Q==
Bits: AAA=
5
、新建
acl
收集全国联通、电信
IP
地址,然后新建
ACL
,将搜集到
IP
放到对应的
ACL
中
#mkdir /usr/local/named/var/named
#vi /usr/local/named/var/named/liantong.acl
//
联通用户访问时使用的
ACL
,可加多个联通
IP
地址
—————————————–
acl liantong {
202.102.152.3;
};
—————————————–
#vi /usr/local/named/var/named/dianxin.acl
//
电信用户访问使用的
ACL
,可加多个电信
IP
地址
————————
acl dianxin {
202.96.209.133;
};
————————
注:全国各地的
IP
地址请自行收集,然后放到对应得
acl
中即可
6
、设置主配置文件
named.conf
我们共新建了三个
view
,分别是
liantong
、
dianxin
、
any
。其中
liantong
负责为联通用户处理查询请求,
dianxin
负责为电信用户处理查询请求,
any
负责处理既不是联通用也不是电信用户的查询请求
#vi /usr/local/named/etc/named.conf
———————————————————————————————————
key “rndc-key” {
algorithm hmac-md5;
secret “dbR9UvR6CCFl18mf5IDgMQ==”;
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys {“rndc-key”; };
};
options {
directory”/usr/local/named/var/named”;
};
logging {
channelwarning {
file”warning.log” versions 3 size 2048k;
severitywarning;
print-category yes;
print-severity yes;
print-timeyes; };
channelquery {
file”query.log” versions 3 size 2048k;
severityinfo;
print-category yes;
print-severity yes;
print-timeyes; };
categorydefault { warning; };
categoryqueries { query; };
};
key liantong-key {
algorithm hmac-md5;
secret”3ZVlHsAwi8ZRoyHt/g+F+Q==”;
};
key dianxin-key {
algorithm hmac-md5;
secret”7aMK+a85Tcqm7snAd99Vaw==”;
};
key any-key {
algorithm hmac-md5;
secret”cX66/6wxsGl7xBKW4rFVKg==”;
};
include”/usr/local/named/var/named/liantong.acl”;
include “/usr/local/named/var/named/dianxin.acl”;
view “liantong” {
match-clients { !key dianxin-key; !key any-key; key liantong-key;liantong; };
recursion yes;
allow-transfer {key liantong-key;};
server192.168.0.252 {keys liantong-key;};
zone”.” IN {
typehint;
file”named.root”;
};
zone”luwenju.com” IN {
typemaster;
file”liantong.luwenju.com.zone”;
};
};
view “dianxin” {
match-clients { !key liantong-key; !key any-key; key dianxin-key;dianxin ;};
recursion yes;
allow-transfer {key dianxin-key;};
server192.168.0.252 {keys liantong-key;};
zone”.” IN {
typehint;
file”named.root”;
};
zone”luwenju.com” IN {
typemaster;
file”dianxin.luwenju.com.zone”;
};
};
view “any” {
match-clients { !key liantong-key; !key dianxin-key; key any-key; any;};
recursion yes;
allow-transfer {key any-key;};
server192.168.0.252 {keys liantong-key;};
zone”.” IN {
typehint;
file”named.root”;
};
zone”luwenju.com” IN {
typemaster;
file”any.luwenju.com.zone”;
};
};
————————————————————————–
注:
关于配置文件中key 的书写语法我们根据自带的rndc的key语法书写去写就行,然后把key的名字改为对应名字,key内容改成我们刚才所生成key的红色部分;配置文件中include指定的是acl;
7
、生成根区域配置文件
#/usr/local/named/bin/dig -t NS .>/usr/local/named/var/named/named.root
8
、撰写联通、电信、
any
的区域文件
#vi/usr/local/named/var/named/liantong.luwenju.com.zone
@ 3600
IN
SOA
luwenju.com.root.luwenju.com. (
5
3600
900
1209600
3600 )
3600
IN
NS
luwenju.com.
IN
A
192.168.0.100
blog
IN
#vi /usr/local/named/var/named/dianxin.luwenju.com.zone
@
3600
IN
SOA
luwenju.com. root.luwenju.com. (
5
3600
900
1209600
3600 )
3600
IN
NS
luwenju.com.
IN
A
192.168.0.100
blog
IN
A
192.168.0.252
#vi /usr/local/named/var/named/any.luwenju.com.zone
@
3600
IN
SOA
luwenju.com. root.luwenju.com. (
5
3600
900
1209600
3600 )
3600
IN
NS
luwenju.com.
IN
A
192.168.0.100
blog
IN
A
192.168.0.250
9
、启动
bind
#/usr/local/named/sbin/named -c/usr/local/named/etc/named.conf
#echo “/usr/local/named/sbin/named -c/usr/local/named/etc/named.conf” >>/etc/rc.local
//
加入开机自动启动
二、
DNS-slave
安装及配置
1
、安装
bind
#tar zxvf bind-9.6.2-P2.tar.gz
#cd bind-9.6.2-P2
#./configure –prefix=/usr/local/named–enable-threads –disable-openssl-version-check
#make && make install
2
、生成
rndc
配置文件
rndc.conf
#/usr/local/named/sbin/rndc-confgen >/usr/local/named/etc/rndc.conf
3
、生成主配置文件
named.conf
#cd /usr/local/named/etc/
#tail -n10 rndc.conf | head -n9 | sed -es/#\//g > named.conf
4
、将
DNS-master
服务器上的
/usr/local/named/var/named
整个目录拷贝到
DNS-slave
服务器的
/usr/local/named/var
目录下
5
、设置主配置文件
named.conf
——————————————————
key “rndc-key” {
algorithm hmac-md5;
secret “4CO5ZyB2818qOYVawk8plQ==”;
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys {“rndc-key”; };
};
options {
directory”/usr/local/named/var/named”;
};
logging {
channelwarning {
file”warning.log” versions 3 size 2048k;
severitywarning;
print-category yes;
print-severity yes;
print-timeyes; };
channelquery {
file”query.log” versions 3 size 2048k;
severityinfo;
print-category yes;
print-severity yes;
print-timeyes; };
categorydefault { warning; };
categoryqueries { query; };
};
key liantong-key {
algorithm hmac-md5;
secret”3ZVlHsAwi8ZRoyHt/g+F+Q==”;
};
key dianxin-key {
algorithm hmac-md5;
secret”7aMK+a85Tcqm7snAd99Vaw==”;
};
key any-key {
algorithm hmac-md5;
secret”cX66/6wxsGl7xBKW4rFVKg==”;
};
include”/usr/local/named/var/named/liantong.acl”;
include “/usr/local/named/var/named/dianxin.acl”;
view “liantong” {
match-clients { !key dianxin-key; !key any-key; key liantong-key;liantong; };
recursion yes;
allow-transfer {key liantong-key;};
server192.168.0.251 {keys liantong-key;};
zone”.” IN {
typehint;
file”named.root”;
};
zone”luwenju.com” IN {
type slave;
masters { 192.168.0.251;};
file”liantong.luwenju.com.zone”;
};
};
view “dianxin” {
match-clients { !key liantong-key; !key any-key; key dianxin-key;dianxin ;};
recursion yes;
allow-transfer {key dianxin-key;};
server192.168.0.251 {keys liantong-key;};
zone”.” IN {
typehint;
file”named.root”;
};
zone”luwenju.com” IN {
type slave;
masters { 192.168.0.251;};
file”dianxin.luwenju.com.zone”;
};
};
view “any” {
match-clients { !key liantong-key; !key dianxin-key; key any-key; any;};
recursion yes;
allow-transfer {key any-key;};
server192.168.0.251 {keys liantong-key;};
zone”.” IN {
typehint;
file”named.root”;
};
zone”luwenju.com” IN {
type slave;
masters { 192.168.0.251;};
file”any.luwenju.com.zone”;
};
};
——————————————————
三、测试
1
、故障转移测试
在同一时间,两台
DNS
断掉任何一台都可以提供解析
2
、
view
功能测试
找全国各地用户,然后去
ping
域名
blog.luwenju.com
,看联通用户得到的解析结果是否是
192.168.0.251,
看电信用户得到是否是
192.168.0.252
3
、主从同步测试
在主服务器上添加
/
删除
A
记录,然后增大
serai
值,然后执行
/usr/local/named/sbin/rndc reload
,看从服务器是否能得到同步
4
、性能压力测试
使用
bind
自带工具
queryperf
进行性能测试
(
在源安装目录
bind-9.6.2/contrib/queryperf
下)
#more test
blog.luwenju.com
A
[root@DNS-master queryperf]# ./queryperf -dtest -s 192.168.0.251
DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 markaExp $
[Status] Processing input data
[Status] Sending queries (beginning with 192.168.0.251)
[Status] Testing complete
Statistics:
Parse input file:
once
Ended due to:
reaching end of file
Queriessent:
1 queries
Queriescompleted:
1 queries
Queries lost:
0 queries
Queriesdelayed(?):
0 queries
RTT max:
0.000567 sec
RTT min:
0.000024 sec
RTT average:
0.000298 sec
RTT stddeviation:
0.000206 sec
RTT out ofrange:
0 queries
Percentagecompleted: 100.00%
Percentagelost:
0.00%
Started at:
Thu Dec
9 18:06:50 2010
Finished at:
Thu Dec
9 18:06:50 2010
Ran for:
0.000795 seconds
Queriesper second:
3773.584906 qps
可以看出,
DNS
服务器每秒可处理
3773
次查询请求
四、总结
1
、确保两台
DNS
服务器时钟同步,如两台服务器时间相差
5
分钟则无法实现同步
2
、虽然通过
bind-view
功能实现智能
DNS
,但在用户访问时会面临如下情况
杭州电信用户
à
杭州电信
DNS
à
联通
DNS ->——
智能
DNS
,将用户请求解析到联通
IP
上
。那么这种情况是我们不可控制的
3
、
IP
地址收集困难,如想更详细的做智能
DNS
或者
CDN
,需要像第三方买
IP
数据(比如
ip.cn
这类公司)
4
、要定时清空
DNS
缓存,以免当缓存中毒时被他人恶意利用
5
、防火墙要开启
TCP/53
、
UDP/53
,
TCP/53
用于主从
DNS
间的数据传输,
UDP/53
用于用户到
DNS
服务器之间的查询
五、鸣谢
在做智能
DNS
时遇到很多问题,在此再次感谢
刘宇
、
洪峰
二位兄弟及师父
sery
的帮助。
http://bbs.linuxtone.org/thread-8424-1-1.html