利用Bind DLZ MySQL 构建智能DNS

来源:互联网 发布:淘宝开店专业培训 编辑:程序博客网 时间:2024/05/10 02:20

本文来自: IT运维专家网 作者: NetSeek 日期: 2009-3-8 19:52 阅读: 742 人 打印 收藏

DNS, Bind, DLZ, 智能, MySQL

作者:NetSeek  http://www.linuxtone.org
日期:2009-3-7 gmail:cnseek@gmail.com
推荐下载PDF版(方便查阅):http://www.linuxtone.org/project/cdn/bind-dlz-view.pdf
【题 纲】
一、相关述语简介
二、智能DNS系统服务规划
三、安装配置Bind-DLZ (介绍Bind-dlz具体安装)
四、添加相关记录并进行测试
五、后续话题及相关参考.
一、相关术语简介:
1、智能DNS(Bind-view)
智能DNS的原理很简单:在用户解析一个域名的时候,判断一下用户的IP,然后跟DNS服务器内部的IP表匹配一下,看看用户是电信还是网通用户,然后给用户返回对应的IP地址。目前的域名服务运营商不提供智能DNS服务,所以必须自行架设DNS服务或者使用网上免费的智能DNS服务,如DNSPOD.
2.Bind-DLZ
Bind-DLZ主页:http://bind-dlz.sourceforge.net/
DLZ(Dynamically Loadable Zones)与传统的BIND9不同,BIND的不足之处:
* BIND从文本文件中获取数据,这样容易因为编辑错误出现问题。
* BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存。
* BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间。
* 如果近修改一条记录,那么要重新加载或者重启BIND才能生效,那么需要时间,可能会影响客户端查询。
而Bind-dlz 即将帮你解决这些问题, 对Zone文件操作也更方便了,直接对数据库操作,可以很方
便扩充及开发管理程序。
二、智能DNS系统服务规划:
1、NameServer 服务器注册(到新网或者万网后台添加)
ns1.aim18.com  211.100.72.137
ns2.aim18.com  219.232.244.11
点击查看原始尺寸

下载 (12.5 KB)

2009-3-8 19:52

2、测试NS记录是否生效.

  1. #dig ns aim18.com
  2. #dig aim18.com +trace

复制代码

更多的命令技巧请参考: http://bbs.linuxtone.org/thread-2021-1-1.html
3、Bind-View规划
www.aim18.com 网通 (CNC)  210.51.36.116 (NK手机)
www.aim18.com 电信(TELECOM) 221.238.249.178 (CU)
www.aim18.com 教育网(EDU) 202.205.109.207 (教育网)
www.aim18.com 电信通(ANY) 211.103.156.230 (51CTO)
【注】:由于资源问题,在此引用国内一些知名站点的IP做实验,请见谅~!
即当您是网通用户的时候,输入www.aim18.com智能DNS服务器将把你分配到210.51.36.116 (NK手机) 这台服务器,其它同例。
View{CNC(网通),TELECOM(电信),EDU(教育网),ANY(其它所有)}

  1. include "/usr/local/bind/etc/cnc_acl.conf";
  2. include "/usr/local/bind/etc/telecom_acl.conf";
  3. include "/usr/local/bind/etc/edu_acl.conf";

复制代码

【注】IP库及ACL,如果你有比较详细的按城市或者地域的IP库,在设计BIND-VIEW这个字段的时候,VIEW就可以以城市或地区来命名和规划.
三、安装配置Bind-DLZ
1、编译安装MySQL
在此不作介绍,具体的请看http://www.linuxtone.org 相关内容。
注意编译MySQL的时候禁掉线程,相关的参数如下:

  1. --without-server --disable-threads --without-pthread

复制代码

2、编译安装Bind

  1. #mkdir /usr/local/src/bind-dlz
  2. #cd /usr/local/src/bind-dlz
  3. #wget http://ftp.isc.org/isc/bind9/9.6.0-P1/bind-9.6.0-P1.tar.gz
  4. #tar zxvf bind-9.6.0-P1.tar.gz

复制代码

  1. #cd bind-9.6.0-P1
  2. #./configure --with-dlz-mysql --enable-largefile --enable-threads=no --prefix=/usr/local/bind --with-openssl=/usr/local/openssl/

复制代码

注:禁掉线程;--with-openssl= 你的openssl安装的相关目录有可能是/usr

  1. # make && make install

复制代码

创建相关配置文件

  1. cd /usr/local/bind/etc
  2. ../sbin/rndc-confgen >rndc.conf
  3. tail -n10 rndc.conf | head -n9 | sed -e s/#///g >named.conf

复制代码

# vi localhost.zone

  1. ttl 86400
  2. @ IN SOA localhost. root.localhost. (
  3. 1997022700 ; Serial
  4. 28800 ; Refresh
  5. 14400 ; Retry
  6. 3600000 ; Expire
  7. 86400 ) ; Minimum
  8. IN NS localhost.
  9. 1 IN PTR localhost.

复制代码

# dig > named.root
#vi named.conf 在后面加入如下:

  1. include "/usr/local/bind/etc/cnc_acl.conf"; //网通ACL
  2. include "/usr/local/bind/etc/telecom_acl.conf"; //电信ACL
  3. include "/usr/local/bind/etc/edu_acl.conf"; //教育网ACL
  4. include "/usr/local/bind/etc/view.conf"; //DLZ相关的配置

复制代码

#vi /usr/local/bind/etc/view.conf //创建view相关的配置文件
#cnc-view //贴出其中网通部分的范例,更详细的请参照view.conf配置文件.

  1. view "cnc_view" {
  2. match-clients { CNC; };
  3. allow-query-cache { none; };
  4. allow-recursion { none; };
  5. allow-transfer { none; };
  6. recursion no;
  7. dlz "Mysql zone" {
  8. database "mysql
  9. {host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass= }
  10. {select zone from dns_records where zone = '%zone%' and view='CNC' limit 1}
  11. {select ttl, type, mx_priority, case when lower(type)='txt' then concat('/"', data, '/"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view='CNC'}
  12. {}
  13. {select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('/"', data, '/"') else data end as mydata, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '%zone%' and view='CNC'}
  14. {select zone from xfr_table where zone = '%zone%' and client = '%client%' and view='CNC' limit 1}
  15. {update data_count set count = count + 1 where zone ='%zone%' and view='CNC'}";
  16. };
  17. };

复制代码

官方相关参考请参照: http://bind-dlz.sourceforge.net/mysql_example.html
3、DLZ相关数据库表结构建立 (//详细见提供的cdn_view.sql含测试数据.)

  1. mysql>create database cdn_view; //创建数据库名为cdn_view
  2. mysql>use cdn_view;
  3. CREATE TABLE `dns_records` (
  4. `id` int(10) unsigned NOT NULL auto_increment,
  5. `zone` varchar(255) NOT NULL,
  6. `host` varchar(255) NOT NULL default '@',
  7. `type` enum('MX','CNAME','NS','SOA','A','PTR') NOT NULL,
  8. `data` varchar(255) default NULL,
  9. `ttl` int(11) NOT NULL default '800',
  10. `view` enum('CNC','TELECOM','EDU','ANY') NOT NULL, //智能DNS区域范围
  11. `mx_priority` int(11) default NULL,
  12. `refresh` int(11) NOT NULL default '3600',
  13. `retry` int(11) NOT NULL default '3600',
  14. `expire` int(11) NOT NULL default '86400',
  15. `minimum` int(11) NOT NULL default '3600',
  16. `serial` bigint(20) NOT NULL default '2008082700',
  17. `resp_person` varchar(64) NOT NULL default 'root.domain.com.',
  18. `primary_ns` varchar(64) NOT NULL default 'ns1.domain.com.',
  19. `data_count` int(11) NOT NULL default '0',
  20. PRIMARY KEY (`id`),
  21. KEY `type` (`type`),
  22. KEY `host` (`host`),
  23. KEY `zone` (`zone`)
  24. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;

复制代码

#desc dns_records; 显示表结构.
点击查看原始尺寸

下载 (11.19 KB)

2009-3-8 19:52

【注】直接将本文提供的cdn_vew.sql导入你的数据库即可,具体操作如下:

  1. Mysql>create database cdn_view; //创建cdn_view数据库
  2. #mysql cdn_view –uroot –p < cdn_view.sql 导入数据库

复制代码

4、启动bind服务.
# /usr/local/bind/sbin/named -uroot -g -d 9 //调试状态,如果没有报错说明环境配置正确。
做成启动服务. Debug的时候多用此模式启动bind.
# /usr/local/bind/sbin/rndc reload 重载named.conf相关配置文件.
# /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf 启动bind服务.
四、添加相关记录并进行测试
将相关解析记录添加到数据库内,以下是相关SQL范例供参考:
1、添加SQL创建相关ZONE及记录.(以网通为例,具体建我提供的测试SQL)

  1. - - - - SOA
  2. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  3. ('aim18.com', '@', 'SOA', 'ns1.aim18.com.', 10, 'CNC', NULL, 3600, 3600, 86400, 10, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  4. - - - - NS--SOA
  5. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`,
  6. `primary_ns`, `data_count`) VALUES
  7. ('aim18.com', '@', 'SOA', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  8. - - - - NS1
  9. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  10. ('aim18.com', 'ns1', 'A', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  11. - - - - NS2
  12. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  13. ('aim18.com', 'ns2', 'A', '219.232.244.11', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  14. - - - - A
  15. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  16. ('aim18.com', 'www', 'A', '210.51.36.116', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  17. - - - -CNAME
  18. INSERT INTO dns_records (zone,host,type,DATA,view)
  19. VALUES ('aim18.com', 'man', 'CNAME', 'www','CNC');

复制代码

2. 基本查询测试:
通过网通的机器查询,解析后得到提网通的服务器,说明智能解析是正确的。
nslookup.png

下载 (5.46 KB)

2009-3-8 19:52

soa.png

下载 (*** KB)

2009-3-8 19:52

settypeany.png

下载 (6.03 KB)

2009-3-8 19:52

经测试解析都比较正确,能将电信用户解析到电信服务器,网通用户解析到网通服务器,教育网用户
解析到教育网网服务器,电信通用户解析到电信通服务器.
【注】本方案中的IP库抓取由(edison7500) 欣哥热情帮助分析抓取IP库,在此表示感谢!目前从测试来看IP库比较精准,能够真正做到智能DNS的智能解析
3、性能测试工具

  1. # cd /usr/local/src/bind-dlz
  2. # cd bind-9.6.0-P1/contrib/queryperf
  3. # ./configure && make

复制代码

# vi rslist //解析记录列表写入此文件

  1. www.aim18.com A
  2. bbs.aim18.com A
  3. man.aim18.com CNAME

复制代码

…..
#vi do.sh //建立一个循环程序对了bind服务器查询进行压力测试,同时多关注数据库状态.

  1. #!/bin/bash
  2. while true
  3. do
  4. ./queryperf –d rslist -s 211.100.72.137 -v
  5. done

复制代码

/usr/local/bind/sbin/named -uroot -g -d 9 bind启为调试模式,在bind排错的时候请多用此模式来debug.
这里可以观察到查询过程中执行的SQL。
【注】在此不做深入详细的性能和压力测试报告,用户可以自己通过以上范例编写压力测试方案。
五、后续话题及相关参考
1、利用PHP程序开发一套Bind-DLZ 管理程序
目前正在编写PHP管理页面,Falcon.C版主正在帮我做这方面的工作。主要在于数据设计和优化还需要花一些时间。大家可以考虑进一步优化数据库结构,同时也希望能与我分享你的心得。
PHP页面管理参考网站:
1)、https://svn.lokkju.com/svn/dnsEditor/trunk/ 国外开源程序
2)、http://www.dnswood.com/ dnswood的管理界面
3)、http://www.dnspod.com dnspod老牌智能DNS站的管理界面,用户体验做的一流!
2、智能DNS集群构建
Bind本身也很容易构建集群,由于Zone文件是存在数据库里面,利用mysql服务
器也很容易构建多个集群,很方便扩充,在些就不做详细介绍。
相关技术点: 负载均衡:LVS, 数据库集群:MySQL Replication.
3、结合SQUID服务器,可以很轻松实现CDN.
目前国内CDN技术比较热,国内各大门户都在考虑自建CDN,利用本文提供的智能DNS构建文档可以很方便的实现智能DNS解析系统,再与SQUID集群结合,可以很轻松实现CDN。下次我将给大家介绍SQUID构建和优化的经验,同时推荐出整
套的CDN集群解决方案,请实时关注linuxtone: http://www.linuxtone.org 相关信息。
4、相关参考网址.
1)、DNS相关工具(解析排错):http://bbs.linuxtone.org/thread-2021-1-1.html
2)、Bind-DLZ国外相关资料参考:
http://projects.navynet.it/DLZ/dlz-addons/
http://svn.the-mesh.org/trac.cgi/wiki/HardyBindDlzHowto
http://svn.the-mesh.org/trac.cgi/attachment/ticket/40/bind9-dlz.sql
http://projects.navynet.it/DLZ/dlz-addons/
5、附件相关的文件说明:
bind_dlz/etc.tar.gz 为/usr/local/bind/etc配置文件含IP库,编译后直接替换此文件.
bind_dlz/cdn_view.sql 为bind-dlz数据库表结构及数据, 直接用mysql 命令导入数据库.
下载地址:http://www.linuxtone.org/project/cdn/bind-dlz.tar.gz
测试数据:http://www.linuxtone.org/project/cdn/test.txt

原创粉丝点击