当前位置:首页 > linux教程 > 列表

Bind基于DLZ实现智能DNS配置教程

发布:smiling 来源: PHP粉丝网  添加日期:2015-05-07 14:30:47 浏览: 评论:0 

本文章为各位介绍Bind基于DLZ实现智能DNS配置教程,如果有需要对于这个智能dns配置的朋友可以进来参考此教程.

简介:在我看来基于Bind的只能DNS方案主要包括两个部分:Geolocation和Dynamic Record。国内的业界对智能DNS的定位也无非这两点,但是我所理解的智能DNS是建立在这两条基础上的智能调度系统,比如我有三个负载能力不同的数据中心,DNS可以根据数据中心的metrics(这里可能包括带宽,服务能力等)实现流量的调度,限于个人水平个人未在这个方向有所实践,这个话题留作以后讨论,所以本文只针对前两个问题。由于Bind本身的配置可运维性比较差,这就引出本文主要讨论的DLZ。

原理:DLZ实际上就是扩展了Bind,将Zonefle的内容放到外部数据库里,然后给Bind配置查询语句从数据库里查询记录。当修改数据库里的记录信息的时候,无需重启Bind,下次客户请求时直接就能返回新的记录了。另外,DLZ本身不支持缓存,所以需要自己根据实际情况解决查询的问题。

安装:

注意:这里我以CentOS7上安装dlz-mysql模块为例。

安装依赖:yum install mariadb-devel gcc wget patch make

下载源码:

Bind9.8之前的版本需要打patch,具体可参考DLZ官方文档,Bind9.8之后(包括9.8)的版本已经集成DLZ:

  1. wget ftp://ftp.isc.org/isc/bind9/9.10.1/bind-9.10.1.tar.gz 
  2. tar xzf bind-9.10.1.tar.gz 
  3. cd  bind-9.10.1 

配置:由于CentOS7目录结构上的变更,在编译dlz-mysql时会找不到库文件或者head文件,所以要做个软连接:

  1. ln -s /usr/lib/mysql /usr/lib64/mysql 
  2. ./configure --prefix /opt/bind --with-dlz-filesystem --with-dlz-mysql 

编译:make

安装:make install

模型:

注意:DLZ没有限制用户的数据模型,你可以根据业务逻辑定义模型,然后构造自己的查询语句即可,官方给出了建议的模型.

建模:

  1. Field Type Null Key Default Extra 
  2. zone text YES  NULL  
  3. host text YES  NULL  
  4. type text YES  NULL  
  5. data text     
  6. ttl int(11) YES  NULL  
  7. mx_priority text YES  NULL  
  8. refresh int(11) YES  NULL  
  9. retry int(11) YES  NULL  
  10. expire int(11) YES  NULL  
  11. minimum int(11) YES  NULL  
  12. serial bigint(20) YES  NULL  
  13. resp_person text YES  NULL  
  14. primary_ns text YES  NULL  
  15. zone 区域 
  16. host 记录名 
  17. type 记录类型 
  18. data 记录值 
  19. ttl 缓存时间 
  20. mx_priority mx记录优先级 
  21. refresh SOA记录的刷新时间 
  22. retry SOA记录的重试时间 
  23. expire SOA记录的过期时间 
  24. minimum SOA记录的minimum 
  25. serial SOA记录的序列号 
  26. resp_person SOA记录的序列号 
  27. primary_ns <尚不明确这个字段的意义> 

建库建表,新建数据库:

create database demo;

新建record表:

  1. CREATE TABLE IF NOT EXISTS records ( 
  2.   id int(10) unsigned NOT NULL AUTO_INCREMENT, 
  3.   zone varchar(255) NOT NULL
  4.   host varchar(255) NOT NULL
  5.   type enum('A','MX','CNAME','NS','SOA','PTR','TXT','AAAA','SVR','URL'NOT NULL
  6.   data varchar(255) NOT NULL
  7.   ttl int(11) NOT NULL
  8.   mx_priority int(11) DEFAULT NULL
  9.   refresh int(11) DEFAULT NULL
  10.   retry int(11) DEFAULT NULL
  11.   expire int(11) DEFAULT NULL
  12.   minimum int(11) DEFAULT NULL
  13.   serial bigint(20) DEFAULT NULL
  14.   resp_person varchar(64) DEFAULT NULL
  15.   primary_ns varchar(64) DEFAULT NULL
  16.   PRIMARY KEY (id),  --phpfensi.com 
  17.   KEY type (type), 
  18.   KEY host (host), 
  19.   KEY zone (zone) 
  20. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

新建acl表:

  1. CREATE TABLE IF NOT EXISTS acl ( 
  2.   id int(10) unsigned NOT NULL AUTO_INCREMENT, 
  3.   zone varchar(255) NOT NULL
  4.   client varchar(255) NOT NULL
  5.   PRIMARY KEY (id), 
  6.   KEY client (client), 
  7.   KEY zone (zone) 
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

配置:GeoIP

这块目前还没有那么灵活,基本上都是基于acl来实现的,虽然最新版的bind 9.10支持maxmind的api来做Geo,但还是改写配置文件的方式,下面是一个示例:

  1. acl "US" { 
  2.      3.0.0.0/8; 
  3.      4.0.0.0/25; 
  4.      4.0.0.128/26; 
  5.      4.0.0.192/28; 
  6.      4.0.0.208/29; 
  7.      4.0.0.216/30; 
  8.      4.0.0.220/31; 
  9. }; 
  10. view "north_america" { 
  11.       match-clients { US; CA; MX; }; 
  12.       recursion no
  13.       zone "foos.com" { 
  14.             type master; 
  15.             file "pri/foos-north-america.db"
  16.       }; 
  17. }; 
  18. view "other" { 
  19.       match-clients { any; }; 
  20.       recursion no
  21.       zone "foos.com" { 
  22.             type master; 
  23.             file "pri/foos-other.db"
  24.       }; 
  25. }; 

该示例引用自这里,但是我们可以通过DLZ实现GeoIP,二次开发一个自己的driver,然后在driver里根据client ip,结合自己的业务系统实现真正的Geo以及智能业务调度.

Dynamic Record

DLZ新定义了一个配置关键字dlz,完整的配置项参考官方文档,这里给出简要说明:

  1. dlz "Mysql zone" { //定义DLZ标识 
  2.    database "mysql //database为dlz这个block唯一可指定的关键字,mysql表示使用mysql driver 
  3.    {host=localhost dbname=dns_data ssl=tRue} //连接数据库的信息 
  4.    {select zone from dns_records where zone = '$zone$'} //用于findzone调用,查询zone 
  5.    {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"'
  6.         else data end from dns_records where zone = '$zone$' and host = '$record$' 
  7.         and not (type = 'SOA' or type = 'NS')} //用于lookup调用,查询record 
  8.    {select ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum 
  9.         from dns_records where zone = '$zone$' and (type = 'SOA' or type='NS')} //用于authority调用,查询SOA或者NS记录,注意这个配置是可选的,SOA和NS查询可以放到lookup调用里,具体见后文 
  10.    {select ttl, type, host, mx_priority, data, resp_person, serial, refresh, retry, expire, 
  11.         minimum from dns_records where zone = '$zone$' and not (type = 'SOA' or type = 'NS')} //用于allnode调用,和接下来的allowzonexfr一起来提供AXFR查询,可选的配置项 
  12.    {select zone from xfr_table where zone = '$zone$' and client = '$client$'} //用于allowzonexfr()调用,用于查询客户端是否可发起AXFR查询,可选的配置项 
  13.    {update data_count set count = count + 1 where zone ='$zone$'}"; 
  14. }; 

注意:此配置为最新Bind版本的配置,如果是打patch的版本请将$换成%,以下的配置同样,这里也给出我的配置:

  1. logging { 
  2.     channel all { 
  3.         file "/opt/bind/log/named.log" versions 1; 
  4.         print-time yes; 
  5.         severity dynamic; 
  6.         print-category yes; 
  7.         print-severity yes; 
  8.     }; 
  9. category default { all; }; 
  10. category queries { all; }; 
  11.  
  12. }; 
  13.  
  14. options { 
  15.     directory "/opt/bind/var/"
  16.     listen-on-v6 { none; }; 
  17.     listen-on { any; }; 
  18.     pid-file "/var/run/named.pid"
  19.     recursion yes; 
  20.     allow-transfer {127.0.0.1;}; 
  21. }; 
  22.  
  23. dlz "mysql-dlz" { 
  24.     database "mysql 
  25.     {host=localhost dbname=demo ssl=false port=3306 user=root pass=thinkin} 
  26.     {select zone from records where zone = '$zone$' limit 1} 
  27.     {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 from records where zone = '$zone$' and host = '$record$'
  28.     {} 
  29.     {select ttl, type, host, mx_priority, data from records where zone = '$zone$' and not (type = 'SOA' or type = 'NS')} 
  30.     {select zone from acl where zone = '$zone$' and client = '$client$'}"; 
  31. }; 
  32.  
  33. zone "." IN { 
  34.     type hint; 
  35.     file "named.root"
  36. }; 
  37.  
  38. key "rndc-key" { 
  39.     algorithm hmac-md5; 
  40.         secret "OdEg+tCn/bMe+/2vbJgQvQ=="
  41. }; 
  42.  
  43. controls { 
  44.         inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; }; 
  45. }; 

注意:这里的配置开启了递归解析且支持本机发起的AXFR请求。

根zonefile

wget -SO /opt/bind/var/named.root http://www.internic.net/domain/named.root

启动:/opt/bind/sbin/named -n1 -c /opt/bind/etc/named.conf -d9 -g

测试,导入数据,导入records数据:

  1. INSERT INTO demo.records (zone, host, type, data, ttl) VALUES (&#phpfensi.com''www''A''1.1.1.1''60'); 
  2. INSERT INTO demo.records (zone, host, type, data, ttl) VALUES ('phpfensi.com''cloud''A''2.2.2.2''60');  
  3. INSERT INTO demo.records (zone, host, type, data, ttl) VALUES ('phpfensi.com''ns''A''3.3.3.3''60'); 
  4. INSERT INTO demo.records (zone, host, type, data, ttl) VALUES ('phpfensi.com''blog''CNAME''cloud.phpfensi.com.''60'); 
  5. INSERT INTO demo.records (zone, host, type, data, ttl) VALUES ('phpfensi.com''@''NS''ns.phpfensi.com.''60'); 
  6. INSERT INTO demo.records (zone, host, type,  ttl, data,refresh, retry, expire, minimum, serial, resp_person) VALUES ('phpfensi.com''@''SOA''60''ns''28800''14400''86400''86400''2012020809''admin'); 

导入acl数据:

INSERT INTO demo.acl (zone, client) VALUES ('phpfensi.com', '127.0.0.1');

测试记录:

  1. dig @127.0.0.1 www.phpfensi.com a 
  2. dig @127.0.0.1 blog.phpfensi.com a 
  3. dig @127.0.0.1 blog.phpfensi.com cname 
  4. dig @127.0.0.1 phpfensi.com ns 
  5. dig @127.0.0.1 www.phpfensi.com axfr

Tags: Bind DLZ DNS配置

分享到: