使用bind构建高可用智能DNS服务器

 使用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千查询请求。下面我们看一下利用bindview功能是如何实现智能DNS的。


bindview原理:

       viewbind中被称为视图功能,我们都知道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,分别是liantongdianxinany。其中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断掉任何一台都可以提供解析


2view功能测试

找全国各地用户,然后去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

。那么这种情况是我们不可控制的

3IP地址收集困难,如想更详细的做智能DNS或者CDN,需要像第三方买IP数据(比如ip.cn这类公司)

4、要定时清空DNS缓存,以免当缓存中毒时被他人恶意利用

5、防火墙要开启TCP/53UDP/53TCP/53用于主从DNS间的数据传输,UDP/53用于用户到DNS服务器之间的查询


五、鸣谢

在做智能DNS时遇到很多问题,在此再次感谢刘宇洪峰 二位兄弟及师父sery的帮助。


http://bbs.linuxtone.org/thread-8424-1-1.html


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值