作者: 陆文举 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
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
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
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