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

  • Post author:
  • Post category:其他




使用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