configurationBIND与数据库后端和DLZ支持

决定把我的基于Windows的DNS服务器移动到Linux。 问题是我需要能够dynamic更新区域文件,而不必重新启动绑定。 看来最stream行的解决scheme是安装数据库服务器(postgresql,sqlite,mysql)的绑定驱动程序,然后更新区域文件。 似乎很简单,但我不能让它为我的生活工作。

我目前正在使用亚马逊Linux发行版,但是我已经在RHEL 6.2中尝试了一切,没有更多的运气。

我已经尝试了几种不同的方法。 第一个是编译绑定与源代码更改为MySQL支持http://pbraun.nethence.com/doc/net/bind-mysql.html 。 这编译罚款的变化,我没有得到任何错误,但运行make install所有的二进制文件复制到/ usr / local / sbin,但我似乎无法启动守护进程我运行service named start ,它只是告诉我有没有名为命名的服务(没有双关语意)。 其次,没有任何configuration文件生成。 所以我创build了一个/usr/local/sbin/named-checkconf的文件,放在/etc/named.conf中,然后运行/usr/local/sbin/named-checkconf ,它告诉我找不到/etc/named.conf文件,所以我有不知道。

接下来我尝试的是安装包bind-sdb并使用postgresql。 已安装的软件包yum -qy bind bind-sdb bind-utils postgresql postgresql-server按照http://bind-dlz.sourceforge.net/postgresql_example.html上的步骤,我创build了一个新的postgre数据库和表等。下面是我目前的命名.conf文件

 // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; }; recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; dlz "my.zone" { database "postgres 1 {host=localhost port=5432 dbname=bind user=postgre password=****} {select zone from dns_records where zone = '%zone%'} {select ttl, type, mx_priority, case when lower(type)='txt' then '\"' || data || '\"' when lower(type)='soa' then data || ' ' || resp_person || ' ' || serial || ' ' || refresh || ' ' || retry || ' ' || expire || ' ' || minimum else data end from dns_records where zone = '%zone%' and host = '%record%'}"; }; include "/etc/named.rfc1912.zones"; 

从我的数据库表输出

    区域| 主机|  ttl | 键入|  mx_priority | 数据|  resp_person | 串行| 刷新| 过期| 最低限度
 ------------ + ------------- + -------- + ------ + ------- ------ + ------------------------ + ------------------ ---- + -------- + --------- + -------- + ---------
  my.cloud |  my.cloud。  |  259200 |  SOA |  0 |  dns01.my.cloud。  |  it.cloud.com。  |  1 |  28800 |  86400 |  28800
  my.cloud |  my.cloud。  |  259200 |  NS |  0 |  dns01.my.cloud。  |  |  0 |  0 |  0 |  0
  my.cloud |  dns01 |  259200 |  A |  0 |  127.0.0.1 |  |  0 |  0 |  0 |  0
 (3排)

如果有人能指引我正确的方向,那么真的打开任何解决scheme。 我宁愿使用MySQL作为数据库,因为我有0使用postgresql或sqlite的经验。

    也许不是真的回答你的问题,但无论如何。 (我最近也在研究这个问题,这里是我的结论):

    BIND9中的DLZ支持看起来更像是一个“补丁”。 这是没有很好的文件 – 在BIND ARM没有一个单一的话。 这似乎没有被广泛使用。 查询性能很糟糕 – 根据这个基准 ,PostgreSQL将比正常的内存操作慢30倍(!) 。 (基准是旧的,但没有理由认为事情大大改善)。

    我不认为这是“最受欢迎的解决scheme”。

    其他选项:

    BIND9支持dynamic更新。 这是有据可查,广泛使用,易于实施。 没有性能损失 – 所有的查询仍然从内存中回答。 安装简单,因为没有数据库要求。 您可以使用DNS协议库(大多数语言可能存在,我自己使用PHP)或通过命令行nsupdate工具以编程方式执行更新。 这是我推荐的解决scheme。

    如果你真的想要数据库 – PowerDNS似乎被devise成与数据库后端一起使用。 它具有的function可能不会完全牺牲使用数据库时的性能,就像它可以caching数据库查询一段时间而不是每次查询数据库一样。 一些体面的DNS托pipe使用PowerDNS。

    更奇特的select – BIND10 ,虽然仍在进行中,但开发人员声称,人们实际上在生产中使用它。 目前BIND10使用SQLITE后端。

    为了完整性,为了满足原始需求(“dynamic更新区域文件而不必重新启动绑定”):编辑区域文件,发送SIGHUP到named。 守护进程将重新读取区域文件。

    这有点晚,但我在这里做了一个教程。

    DLZ支持完全集成到bind9中,只需在运行./configure时启用。
    这并不难,事实上,这很简单,但logging却很糟糕。
    我的教程改变了。
    现在不要花30多分钟(包括编译时间)来启动它。

    不幸的是,我不能在这里复制教程,它太大了。

    安装和configurationBind9 + PostgreSQL – CentOS7

     [root@named ~]# yum install -y epel-release [root@named ~]# yum install -y bind bind-sdb bind-devel postgresql postgresql-server [root@named ~]# postgresql-setup initdb [root@named ~]# systemctl start postgresql && systemctl enable postgresql [root@named ~]# sudo -i -u postgres $ createuser root --login --superuser --createdb --createrole --encrypted --replication -P -W <br/> [root@named ~]# createdb bind-db --owner=root [root@named ~]# psql -d bind-db bind-db# create table forward_tbl ( name varchar(255) DEFAULT NULL, ttl int DEFAULT '86400', rdtype varchar(90) DEFAULT NULL, rdata varchar(255)); bind-db# create table reverse_tbl ( name varchar(255) DEFAULT NULL, ttl int DEFAULT '86400', rdtype VARCHAR(90) DEFAULT NULL, rdata varchar(255)); [root@named ~]# vim /etc/named.conf <br/> zone "maranet.local" { type master; database "pgsql bind-db forward_tbl 127.0.0.1 root Aa123456"; }; zone "1.168.192.in-addr.arpa" { type master; database "pgsql bind-db reverse_tbl 127.0.0.1 root Aa123456"; }; [root@named ~]# vim /var/lib/pgsql/data/pg_hba.conf local all all md5 host all all 127.0.0.1/32 md5 [root@named ~]# systemctl start postgresql && systemctl enable postgresql [root@named ~]# systemctl start named-sdb && systemctl enable named-sdb [root@named ~]# psql -d bind-db bind-db# INSERT INTO forward_tbl VALUES ('maranet.local','86400','SOA','named.maranet.local. root.maranet.local. 201609100 3600 1800 2419200 86400'); bind-db# INSERT INTO forward_tbl VALUES ('maranet.local','86400','NS','named.maranet.local.'); bind-db# INSERT INTO forward_tbl VALUES ('named.maranet.local','86400','A','192.168.1.1'); bind-db# INSERT INTO forward_tbl VALUES ('nginx.maranet.local','86400','A','192.168.1.2'); bind-db# INSERT INTO forward_tbl VALUES ('PC1.maranet.local','86400','A','192.168.1.10'); bind-db# INSERT INTO forward_tbl VALUES ('PC2.maranet.local','86400','A','192.168.1.11'); bind-db# INSERT INTO reverse_tbl VALUES ('1.168.192.in-addr.arpa','86400','SOA','named.maranet.local. root.maranet.local. 201609100 3600 1800 2419200 86400'); bind-db# INSERT INTO reverse_tbl VALUES ('1.168.192.in-addr.arpa','86400','NS','named.maranet.local.'); bind-db# INSERT INTO reverse_tbl VALUES ('1.1.168.192.in-addr.arpa','86400','PTR','named.maranet.local.'); bind-db# INSERT INTO reverse_tbl VALUES ('2.1.168.192.in-addr.arpa','86400','PTR','nginx.maranet.local.'); bind-db# INSERT INTO reverse_tbl VALUES ('10.1.168.192.in-addr.arpa','86400','PTR','PC1.maranet.local.'); bind-db# INSERT INTO reverse_tbl VALUES ('11.1.168.192.in-addr.arpa','86400','PTR','PC2.maranet.local.');