Domain-Name-System

使用數據庫後端和 DLZ 支持配置 BIND

  • September 18, 2019

決定將我基於 Windows 的 DNS 伺服器移至 linux。問題是我需要能夠動態更新區域文件而不必重新啟動綁定。似乎最流行的解決方案是為數據庫伺服器(postgresql、sqlite、mysql)安裝綁定驅動程序,然後更新區域文件。看起來很簡單,但我無法讓它為我的生活工作。

我目前正在使用 Amazon Linux 發行版,但我也嘗試了 RHEL 6.2 中的所有內容,但運氣不佳。

我嘗試了幾種不同的方法。第一個是使用 mysql 支持http://pbraun.nethence.com/doc/net/bind-mysql.html的原始碼更改編譯綁定。這可以很好地與更改一起編譯,並且我沒有收到任何錯誤,但是在執行make install所有二進製文件後都被複製到 /usr/local/sbin 但我似乎無法啟動我執行的守護程序service named start,它只是告訴我沒有名為命名的服務(沒有雙關語的意思)。其次,不會生成任何配置文件。所以我創建了一個名為.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 | 數據 | 響應人 | 連載 | 刷新 | 過期| 最低限度
------------+-------------+--------+------+-------------+------------------------+----------------------+--------+---------+--------+---------
我的雲 | 我的雲。| 259200 | SOA | 0 | dns01.my.cloud。| it.cloud.com。| 1 | 28800 | 86400 | 28800
我的雲 | 我的雲。| 259200 | NS | 0 | dns01.my.cloud。| | 0 | 0 | 0 | 0
我的雲 | dns01 | 259200 | 一個 | 0 | 127.0.0.1 | | 0 | 0 | 0 | 0
(3 行)

如果有人能指出我正確的方向,那麼真的可以接受任何解決方案。我更喜歡使用 MySQL 作為數據庫,因為我沒有使用 postgresql 或 sqlite 的經驗。

也許不是你問題的真正答案,但無論如何。(我最近也在調查這個問題,這是我的結論):

BIND9 中的 DLZ 支持看起來更像是一個“更新檔”。它沒有得到很好的記錄 - 在 BIND ARM 中沒有一個字。它似乎沒有被廣泛使用。查詢性能很糟糕——根據這個基準,PostgreSQL將比正常的記憶體操作慢30 倍(!) 。(基準是舊的,但沒有理由假設情況會大大改善)。

我認為這不是“最受歡迎的解決方案”。

其他選項:

BIND9 支持動態更新。它有據可查、廣泛使用且易於實施。沒有性能損失——所有的查詢仍然從記憶體中回答。設置更簡單,因為不需要數據庫。您可以使用 DNS 協議庫(可能存在於大多數語言,我自己使用 PHP)或通過命令行nsupdate工具以程式方式執行更新。這是我推薦的解決方案。

如果您真的想要數據庫 - PowerDNS 似乎被設計為與數據庫後端一起使用。它具有在使用數據庫時可能有助於不完全犧牲性能的功能,例如它可以記憶體數據庫查詢一段時間而不是每次都查詢數據庫。一些不錯的 DNS 主機使用 PowerDNS。

更奇特的選項 - BIND10,雖然仍在開發中,但開發人員聲稱人們實際上在生產中使用它。目前 BIND10 使用 SQLITE 後端。

引用自:https://serverfault.com/questions/365434