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

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

决定将基于 Windows 的 DNS 服务器移至 Linux。问题是我需要能够动态更新区域文件,而无需重新启动 bind。似乎最流行的解决方案是安装数据库服务器 (postgresql、sqlite、mysql) 的 bind 驱动程序,然后更新区域文件。这似乎很简单,但我无论如何也做不到。

我目前正在使用 Amazon Linux 发行版,但是我也尝试了 RHEL 6.2 中的所有方法,但都没有成功。

我尝试了几种不同的方法。第一种方法是使用源代码更改来编译 bind,以支持 mysqlhttp://pbraun.nethence.com/doc/net/bind-mysql.html。经过修改后,编译正常,没有出现任何错误,但运行后,make install所有二进制文件都被复制到 /usr/local/sbin,但我似乎无法启动我运行的守护进程service named start,它只是告诉我没有名为 named 的服务(没有双关语)。其次,没有生成任何配置文件。所以我创建了一个名为 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";

我的数据库表的输出

    区域 | 主机 | 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 行)

如果有人能给我指明正确的方向,我愿意接受任何解决方案。我更喜欢使用 MySQL 作为数据库,因为我没有使用 postgresql 或 sqlite 的经验。

答案1

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

BIND9 中的 DLZ 支持看起来更像是一个“补丁”。它没有很好的文档记录 - BIND ARM 中没有关于它的一个字。它似乎没有被广泛使用。查询性能糟糕的- 根据这个基准PostgreSQL 将会30次(!)比正常的内存操作慢。(基准测试已经过时,但没有理由认为情况有了显着改善)。

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

其他选择:

BIND9 支持动态更新。它有详尽的文档、广泛的应用并且易于实现。没有性能损失 - 所有查询仍可从记忆。设置更简单,因为不需要数据库。您可以使用 DNS 协议库(可能存在于大多数语言中,我自己使用 PHP)或通过命令行nsupdate工具以编程方式执行更新。这是我推荐的解决方案。

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

更加奇特的选择 -BIND10,尽管仍在进行中,但开发人员声称人们实际上在生产中使用它。目前 BIND10 使用 SQLITE 后端。

答案2

为了完整起见,为了满足原始要求(“动态更新区域文件而无需重新启动绑定”):编辑区域文件,向 named 发送 SIGHUP。守护进程将重新读取区域文件。

答案3

虽然有点晚了,但是我还是做了一个教程这里。DLZ

支持已完全集成到 bind9 中,您只需在运行时启用它即可./configure
这并不难,事实上,它非常简单,但它的文档记录非常糟糕。
我的教程改变了这一点。
现在,您启动和运行它的时间不应超过 30 分钟(包括编译时间)。

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

答案4

您可以使用 bind-sdb 模块,但不幸的是它只支持 ldap 和 pgsql

# yum install -y bind bind-sdb

相关内容