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

昝辉Zac Zac的SEO博客,坚持12年,优化成为生活。

本文章为各位介绍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. wgetftp://ftp.isc.org/isc/bind9/9.10.1/bind-9.10.1.tar.gz
  2. tarxzfbind-9.10.1.tar.gz
  3. cdbind-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. FieldTypeNullKeyDefaultExtra
  2. zonetextYESNULL
  3. hosttextYESNULL
  4. typetextYESNULL
  5. datatext
  6. ttlint(11)YESNULL
  7. mx_prioritytextYESNULL
  8. refreshint(11)YESNULL
  9. retryint(11)YESNULL
  10. expireint(11)YESNULL
  11. minimumint(11)YESNULL
  12. serialbigint(20)YESNULL
  13. resp_persontextYESNULL
  14. primary_nstextYESNULL
  15. zone区域
  16. host记录名
  17. type记录类型
  18. data记录值
  19. ttl缓存时间
  20. mx_prioritymx记录优先级
  21. refreshSOA记录的刷新时间
  22. retrySOA记录的重试时间
  23. expireSOA记录的过期时间
  24. minimumSOA记录的minimum
  25. serialSOA记录的序列号
  26. resp_personSOA记录的序列号
  27. primary_ns<尚不明确这个字段的意义>

建库建表,新建数据库:

create database demo;

新建record表:

  1. CREATETABLEIFNOTEXISTSrecords(
  2. idint(10)unsignedNOTNULLAUTO_INCREMENT,
  3. zonevarchar(255)NOTNULL,
  4. hostvarchar(255)NOTNULL,
  5. typeenum('A','MX','CNAME','NS','SOA','PTR','TXT','AAAA','SVR','URL')NOTNULL,
  6. datavarchar(255)NOTNULL,
  7. ttlint(11)NOTNULL,
  8. mx_priorityint(11)DEFAULTNULL,
  9. refreshint(11)DEFAULTNULL,
  10. retryint(11)DEFAULTNULL,
  11. expireint(11)DEFAULTNULL,
  12. minimumint(11)DEFAULTNULL,
  13. serialbigint(20)DEFAULTNULL,
  14. resp_personvarchar(64)DEFAULTNULL,
  15. primary_nsvarchar(64)DEFAULTNULL,
  16. PRIMARYKEY(id),--phpfensi.com
  17. KEYtype(type),
  18. KEYhost(host),
  19. KEYzone(zone)
  20. )ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1;

新建acl表:

  1. CREATETABLEIFNOTEXISTSacl(
  2. idint(10)unsignedNOTNULLAUTO_INCREMENT,
  3. zonevarchar(255)NOTNULL,
  4. clientvarchar(255)NOTNULL,
  5. PRIMARYKEY(id),
  6. KEYclient(client),
  7. KEYzone(zone)
  8. )ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_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. recursionno;
  13. zone"foos.com"{
  14. typemaster;
  15. file"pri/foos-north-america.db";
  16. };
  17. };
  18. view"other"{
  19. match-clients{any;};
  20. recursionno;
  21. zone"foos.com"{
  22. typemaster;
  23. file"pri/foos-other.db";
  24. };
  25. };

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

Dynamic Record

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

  1. dlz"Mysqlzone"{//定义DLZ标识
  2. database"mysql//database为dlz这个block唯一可指定的关键字,mysql表示使用mysqldriver
  3. {host=localhostdbname=dns_datassl=tRue}//连接数据库的信息
  4. {selectzonefromdns_recordswherezone='$zone$'}//用于findzone调用,查询zone
  5. {selectttl,type,mx_priority,casewhenlower(type)='txt'thenconcat('\"',data,'\"')
  6. elsedataendfromdns_recordswherezone='$zone$'andhost='$record$'
  7. andnot(type='SOA'ortype='NS')}//用于lookup调用,查询record
  8. {selectttl,type,mx_priority,data,resp_person,serial,refresh,retry,expire,minimum
  9. fromdns_recordswherezone='$zone$'and(type='SOA'ortype='NS')}//用于authority调用,查询SOA或者NS记录,注意这个配置是可选的,SOA和NS查询可以放到lookup调用里,具体见后文
  10. {selectttl,type,host,mx_priority,data,resp_person,serial,refresh,retry,expire,
  11. minimumfromdns_recordswherezone='$zone$'andnot(type='SOA'ortype='NS')}//用于allnode调用,和接下来的allowzonexfr一起来提供AXFR查询,可选的配置项
  12. {selectzonefromxfr_tablewherezone='$zone$'andclient='$client$'}//用于allowzonexfr()调用,用于查询客户端是否可发起AXFR查询,可选的配置项
  13. {updatedata_countsetcount=count+1wherezone='$zone$'}";
  14. };

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

  1. logging{
  2. channelall{
  3. file"/opt/bind/log/named.log"versions1;
  4. print-timeyes;
  5. severitydynamic;
  6. print-categoryyes;
  7. print-severityyes;
  8. };
  9. categorydefault{all;};
  10. categoryqueries{all;};
  11. };
  12. options{
  13. directory"/opt/bind/var/";
  14. listen-on-v6{none;};
  15. listen-on{any;};
  16. pid-file"/var/run/named.pid";
  17. recursionyes;
  18. allow-transfer{127.0.0.1;};
  19. };
  20. dlz"mysql-dlz"{
  21. database"mysql
  22. {host=localhostdbname=demossl=falseport=3306user=rootpass=thinkin}
  23. {selectzonefromrecordswherezone='$zone$'limit1}
  24. {selectttl,type,mx_priority,casewhenlower(type)='txt'thenconcat('\"',data,'\"')whenlower(type)='soa'thenconcat_ws('',data,resp_person,serial,refresh,retry,expire,minimum)elsedataendfromrecordswherezone='$zone$'andhost='$record$'}
  25. {}
  26. {selectttl,type,host,mx_priority,datafromrecordswherezone='$zone$'andnot(type='SOA'ortype='NS')}
  27. {selectzonefromaclwherezone='$zone$'andclient='$client$'}";
  28. };
  29. zone"."IN{
  30. typehint;
  31. file"named.root";
  32. };
  33. key"rndc-key"{
  34. algorithmhmac-md5;
  35. secret"OdEg+tCn/bMe+/2vbJgQvQ==";
  36. };
  37. controls{
  38. inet127.0.0.1allow{localhost;}keys{"rndc-key";};
  39. };

注意:这里的配置开启了递归解析且支持本机发起的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. INSERTINTOdemo.records(zone,host,type,data,ttl)VALUES(&#phpfensi.com','www','A','1.1.1.1','60');
  2. INSERTINTOdemo.records(zone,host,type,data,ttl)VALUES('phpfensi.com','cloud','A','2.2.2.2','60');
  3. INSERTINTOdemo.records(zone,host,type,data,ttl)VALUES('phpfensi.com','ns','A','3.3.3.3','60');
  4. INSERTINTOdemo.records(zone,host,type,data,ttl)VALUES('phpfensi.com','blog','CNAME','cloud.phpfensi.com.','60');
  5. INSERTINTOdemo.records(zone,host,type,data,ttl)VALUES('phpfensi.com','@','NS','ns.phpfensi.com.','60');
  6. INSERTINTOdemo.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.1www.phpfensi.com a
  2. dig@127.0.0.1blog.phpfensi.com a
  3. dig@127.0.0.1blog.phpfensi.com cname
  4. dig@127.0.0.1phpfensi.com ns
  5. dig@127.0.0.1www.phpfensi.com axfr

相关广告
  • Bind基于DLZ实现智能DNS配置教程 Bind基于DLZ实现智能DNS配置教程 Bind基于DLZ实现智能DNS配置教程
相关阅读

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

2019/10/10 17:44:45 | 谷歌SEO算法 | DNS