web-dev-qa-db-ja.com

データベースバックエンドとDLZサポートを使用してBINDを構成する

WindowsベースのDNSサーバーをLinuxに移動することを決定しました。問題は、バインドを再起動せずにゾーンファイルを動的に更新できる必要があることです。最も一般的な解決策は、データベースサーバー(postgresql、sqlite、mysql)のバインドドライバーをインストールしてから、ゾーンファイルを更新することです。シンプルなようですが、私の人生でそれを機能させることはできません。

私は現在Amazon Linuxディストリビューションを使用していますが、RHEL 6.2でもすべてを試しました。

私はいくつかの方法を試しました。 1つ目は、mysqlサポート http://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-serverhttp://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を使用した経験がないためです。

7
bwight

たぶんあなたの質問に対する答えではないかもしれませんが、とにかく。 (私は最近この問題も調査しており、ここに私の結論があります):

BIND9のDLZサポートは、「パッチ」に似ています。それは十分に文書化されていません-BIND ARMでそれについての単一の単語ではありません。あまり使われていないようです。クエリのパフォーマンスはひどい-これによると ベンチマーク 、PostgreSQLは30になります時間(!)は、通常のメモリ内操作よりも遅くなります。 (ベンチマークは古いですが、物事が大幅に改善されたと仮定する理由はありません)。

「最も人気のある解決策」だとは思いません。

別のオプション:

BIND9は動的更新をサポートしています。十分に文書化され、広く使用されており、実装も簡単です。パフォーマンスの低下なし-すべてのクエリはmemoryから引き続き応答します。データベースが不要なため、セットアップが簡単です。 DNSプロトコルライブラリを使用してプログラムで更新を実行します(おそらくほとんどの言語に存在しますが、私自身もPHPを使用しています)、またはコマンドラインnsupdateツールを使用します。これが私がお勧めするソリューションです。

本当にデータベースが必要な場合-PowerDNSはデータベースバックエンドで使用するように設計されているようです。データベースを毎回クエリするのではなく、しばらくの間データベースクエリをキャッシュできるなど、データベースを使用するときにパフォーマンスを完全には犠牲にしない可能性がある機能があります。いくつかのまともなDNSホスティングはPowerDNSを使用しています。

よりエキゾチックなオプション- BIND1 、まだ作業中ですが、開発者は人々が実際にそれを実稼働で使用していると主張しています。現在、BIND10はSQLITEバックエンドを使用しています。

10
Sandman4

完全を期すために、元の要件に対処するには(「バインドを再起動せずにゾーンファイルを動的に更新する」):ゾーンファイルを編集し、SIGHUPをnamedに送信します。デーモンはゾーンファイルを再読み取りします。

5
Mark Wood

少し遅いですが、チュートリアル here を作成しました。

DLZサポートはbind9に完全に統合されており、実行時に有効にする必要があります./configure
それは難しくありません、実際、それは非常に単純ですが、それは非常にひどく文書化されています。
私のチュートリアルはそれを変えます。
これで、起動して実行するのに30分(コンパイル時間を含む)以上かかることはありません。

残念ながら、ここにはチュートリアルをコピーできません。サイズが大きすぎます。

2
Quandary

bind-sdbモジュールを使用できますが、残念ながらそれはldapとpgsqlをサポートしているだけです

# yum install -y bind bind-sdb

1