使用数据库后端和DLZ支持配置BIND

Modified on: Sat, 21 Sep 2019 11:40:02 +0800

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

我目前正在使用Amazon Linux发行版,但我已经在RHEL 6.2中尝试了所有内容,但没有更多运气。

我尝试过几种不同的方法。第一个是使用mysql支持的源代码更改编译bind http:// pbraun.nethence.com/doc/net/bind-mysql.html。这可以很好地编译更改并且我没有错误但是在运行make install之后所有二进制文件都被复制到/ usr / local / sbin但是我似乎无法启动守护进程我运行service named start,它告诉我没有名为named的服务(没有双关语意)。其次,没有生成任何配置文件。所以我创建了一个名为.conf的文件并将其放在/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上的步骤操作我创建了一个新的postgre数据库和表等。下面是我当前的named.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";

我的数据库表输出

//
// 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";

如果有人能指出我正确的方向,那么真正开放任何解决方案。我更喜欢使用MySQL作为数据库,因为我有使用postgresql或sqlite的经验。

作者:bwight

最佳答案

也许不是你问题的真正答案,但无论如何。 (我最近也在调查这个问题,这是我的结论):

BIND9中的DLZ支持看起来更像是一个“补丁”。它没有很好的文档记录 - 在BIND ARM中没有一个关于它的单词。它似乎没有被广泛使用。查询性能可怕 - 根据此基准,PostgreSQL是比正常的内存中操作慢<30次(!)。 (基准是旧的,但没有理由认为事情有了很大的改善)。

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

其他选择:

BIND9支持动态更新。它文档齐全,使用广泛且易于实现。没有性能损失 - 所有查询仍然从内存回答。由于不需要数据库,因此安装更简单。您使用DNS协议库(可能存在大多数语言,我自己使用PHP)或命令行nsupdate工具以编程方式执行更新。这是我推荐的解决方案。

如果你真的想要数据库 - PowerDNS似乎设计与数据库后端一起使用。它具有的功能可能有助于在使用数据库时不会完全牺牲性能,就像它可以缓存数据库查询一段时间而不是每次查询数据库。一些像样的DNS托管使用PowerDNS。

更具异国情调的选项 - BIND10,虽然仍在进行中,但开发人员声称人们实际上在生产中使用它。目前BIND10使用SQLITE后端。

作者:Sandman4

相关问答

添加新评论