利用bind9架设智能DNS——PostgreSQL数据库篇


智能DNS工作原理

在用户解析一个域名的时候,判断一下用户的IP,然后跟DNS服务器内部的IP表匹配一下,看看用户是电信还是网通用户,然后给用户返回对应的IP地址。目前的域名服务运营商不提供智能DNS服务,所以必须自行架设DNS服务或者使用网上免费的智能DNS服务,如DNSPOD

本实例中我架设的是一个简单的内外解析模式,如果需要增加其他类别(电信、网通)只需添加对于的 view 即可。

bind 在很早以前就已经集成了bind-dlz 数据库模块,可支持sqllit、bdb Mysql  PostgreSQL ODBC LDAP等数据源,详见:http://bind-dlz.sourceforge.net/

本次架设采用PostgreSQL作为数据源实现,数据库已经准备完毕(可使用已有的数据库系统,创建一个新库即可)。

1、配置说明
两个view
       local   内部网络
       any     其他(公网)

两台DNS服务器
       master dns 10.0.0.8    222.222.222.8
       slave  dns  10.0.0.9     222.222.222.9

2、创建数据库、表并添加基本记录记录

  1. create database dns_dlz;  
  2. create table dns_records(  
  3.     zone character varying(256),  
  4.     host character varying(256) NOT NULL default '@',     
  5.     ttl integer,  
  6.     view character varying(256),  
  7.     type  character varying(256),  
  8.     mx_priority integer,  
  9.     data character varying(256),  
  10.     resp_person character varying(256),  
  11.     serial integer,  
  12.     refresh integer,  
  13.     retry  integer,  
  14.     expire   integer,  
  15.     minimum integer  
  16. );  
  17.   
  18. create INDEX dns_records_host_index on dns_records (host);  
  19. create INDEX dns_records_type_index on dns_records ("type");    
  20. create INDEX dns_records_zone_index on dns_records ("zone");   
# zone sample.com 

  1. #soa 记录  
  2. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''@', 600, 'LOCAL''SOA'NULL'sample.com.''root.sample.com.', 2011083001, 28800, 14400, 86400, 86400);  
  3. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''@', 600, 'ANY''SOA'NULL'sample.com.''root.sample.com.', 2011083001, 28800, 14400, 86400, 86400);  
  4. #dns 记录  
  5. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''@', 600, 'LOCAL''NS'NULL'ns1.sample.com.'NULL, 2011083001, 28800, 14400, 86400, 86400);  
  6. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''@', 600, 'ANY''NS'NULL'ns1.sample.com.'NULL, 2011083001, 28800, 14400, 86400, 86400);  
  7. #A记录 time.sample.com  
  8. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''time', 600, 'LOCAL''A'NULL'10.0.0.8'NULL, 2011083001, 28800, 14400, 86400, 86400);  
  9. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''time', 600, 'ANY''A'NULL'222.222.222.8'NULL,  2011083001, 28800, 14400, 86400, 86400);  
  10. #A记录 ns1.sample.com  
  11. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''ns1', 600, 'LOCAL''A'NULL'10.0.0.10',  NULLNULLNULLNULLNULLNULL);  
  12. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''ns1', 600, 'ANY''A'NULL'222.222.222.10'NULL,  NULLNULLNULLNULLNULL);  
  13. #mx记录   
  14. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''@', 600, 'LOCAL''MX', 10, 'mail.sample.com.'NULLNULLNULLNULLNULLNULL);  
  15. insert into dns_records(zone, host, ttl, view, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) values ('sample.com''@', 600, 'ANY''MX', 10, 'mail.sample.com.'NULL,  NULLNULLNULLNULLNULL);  

其他域名的添加方式类似,将zone项替换为对于的域名即可

3、bind 编译安装及配置

rpm包默认不支持dlz模式,需要使用源码编译

  1. ./configure --with-dlz-postgres --enable-threads  --prefix=/usr/local/bind  
  1. ./configure --with-dlz-postgres  --build=x86_64-RedHat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --with-libtool --localstatedir=/var --enable-threads --enable-ipv6 --with-pic --disable-openssl-version-check   

以下安装路径为系统默认路径 

配置文件 /etc/named.conf  

其他配置文件路径 /etc/named/

4、创建相关配置文件

  1. cd /etc  
  2. rndc-confgen >rndc.conf  
  3. tail -n6 rndc.conf | head -n5 | sed -e s/#\//g >named.conf  
  4. rm -f rndc.conf  (该文件与 rndc.key 文件一起出现会出现 rndc警告,删除为妙)  
  5. dig > named/named.root  

查看是否存在 /etc/rndc.key 文件,如果没有就生成一个
rndc-confgen -a -c rndc.key

默认的rndc.key 文件中的key名称 好像是 rndckey

手动生成的key名称是 rndc-key

key的名称一定要一致,否则会出现不能使用 rndc 刷新、不能同步的问题。

使用 dnssec-keygen 生成view TSIG key
  1. dnssec-keygen -a hmac-md5 -b 128 -n HOST local  
  2. dnssec-keygen -a hmac-md5 -b 128 -n HOST any  
将生成的key 填入named.conf 对应的位置 

如: 

  1. key "any" {  
  2.         algorithm hmac-md5;  
  3.         secret "0bUZSQ1p3OMbX/6nGB6YPQ==";  
  4. };  

详细见下面的完整配置文件,该配置文件包含文件存储和数据库两种方式(数据库存储已经注视掉),文件存储方式已经包含master slave 之间的TSIG 方式同步。

及在不同的view中使用各自key进行同步。

完整 named.conf 内容

  1. options  
  2. {  
  3.         directory       "/var/named";  
  4.         dump-file       "data/cache_dump.db";  
  5.         statistics-file "data/named_stats.log";  
  6.         memstatistics-file "data/named_mem_stats.log";  
  7.         #listen-on port 53 { 127.0.0.1; 10.0.0.8; 222.222.222.8; };  
  8.         allow-recursion { 127.0.0.1; };  
  9.         allow-transfer  { dns_ip; };     #使用文件存储zone时使用 slave 无需此项  
  10.         also-notify     { 10.0.1.9; };   #使用文件存储zone时使用 slave 无需此项  
  11.   
  12.         edns-udp-size   512;  
  13. };  
  14. include "/etc/rndc.key";  
  15. controls {  
  16.         inet 127.0.0.1 port 953  
  17.                 allow { 127.0.0.1; } keys { "rndckey"; };  
  18. };  
  19. key "any" {  
  20.         algorithm hmac-md5;  
  21.         secret "0bUZSQ1p3OMbX/6nGB6YPQ==";  
  22. };  
  23. key "local" {  
  24.         algorithm hmac-md5;  
  25.         secret "OuhPGr+uFmSeOm04ZPJFmA==";  
  26. };  
  27.   
  28. acl "dns_ip" {  
  29.         10.0.0.8; #master  
  30.         10.0.0.9; #slave  
  31. };  
  32.   
  33.   
  34. acl "LOCAL" {  
  35.         10.0.0.0/8;  
  36. };  
  37.   
  38. include "/etc/named/local_acl.conf";  
  39. include "/etc/named/any.conf";  
  40.   
  41. logging {    
  42.         category edns-disabled { null; };  
  43.         channel query_log {    
  44.                 file "/var/named/data/query.log"        versions 3 size 20m;    
  45.                 severity                info;    
  46.                 print-time              yes;    
  47.                 print-category  yes;    
  48.         };    
  49.         category queries {    
  50.                 query_log;    
  51.         };  
  52. };  
  • 1
  • 2
  • 下一页

相关内容