使用數據庫後端和 DLZ 支持配置 BIND
決定將我基於 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 後端。