BIND9.9.1-P1 ゾーン転送ファイル

BINDを検索

最近は「bind」と検索すると、「ホームページ制作ソフト BiND」が一番上に表示されますね。
そのネーミング(後者)はあかんやろうと思います。広告費大変じゃない? bindと検索したら「ISCのBIND」が一番上に表示されて欲しいですし。
それはいいとして、検索した目的は2012年6月5日にBIND9.xの注意喚起文書が公開されたので今後もっとメンテナンスしやすいようにと思ったところ、bind-9.9.1-P1で受けたセカンダリDNSサーバのゾーン転送ファイル形式が今までと違うことに気付いたからです。
 
 

男は黙ってソース

BINDやSendmailは、結構インパクトの大きい話題を提供してくれます。その都度対応を迫られてきたのですが、Sendmailは2000年頃に決別、DNSは今もBINDをメインに使っています。
DNSはあまりチューニングを必要としないこともあって、OSのディストリビューターが配布しているパッケージのBINDを利用していたのですが、OSのメジャーバージョンが上がった後、それまでのバージョンのパッケージをいつまでも配布してもらえる訳ではないので、BINDもソースからコンパイルした方がいいですね。
 
 

BIND 9.9.1-P1 をコンパイル

プライマリとセカンダリにBIND 9.9.1-P1をインストールしました。コンパイルオプションはDebianに習い以下の内容にしました。

./configure
–prefix=/usr
–mandir=/usr/share/man
–infodir=/usr/share/info
–sysconfdir=/etc/bind
–localstatedir=/var
–enable-threads
–enable-largefile
–with-libtool
–enable-shared
–enable-static
–with-openssl=/usr
–with-gssapi=/usr
–with-gnu-ld
–with-dlz-postgres=no
–with-dlz-mysql=no
–with-geoip=/usr
–enable-ipv6

 
 

BIND 9.9.1-P1 のゾーンファイル

インストールと設定を終え、プライマリを起動し、次にセカンダリを起動しました。/etc/resolv.conf の nameserver が自ホストに設定されていることを確認して dig で管理ドメインの問い合わせをすると正常に値が返ってきます。
が、しかし、プライマリからセカンダリで受け取ったゾーン転送ファイルをnkfやfileコマンドでチェックすると、形式が ASCII text ではなく data 形式でエンコードはBINARY。
 
 

BIND 9.8.3-P1

BIND 9.9.1-P1 のコンパイルオプションを変更したりして試してみたけど、やっぱり同じ。名前解決できない訳ではないから良いと言えば良いのだけど、もしプライマリが落ちた状態でゾーンファイルを書き換えなければならなくなったら?
そのようなことは滅多にないし、セカンダリの役目的にはこれでいいのかもしれないが、
# dig DOMAIN_NAME axfr @localhost > ZONE_FILE_NAME
# chown bind:bind ZONE_FILE_NAME
をすれば何とかなるかな?と思ったけどダメだね。
上記のコンパイルオプションを使って、BIND 9.8.3-P1をインストールでは今までのバージョンと同じファイル形式。
ということは、BIND 9.9.1-P1では、セカンダリとして機能するDNSサーバのゾーン転送ファイルのデフォルト値が変更になったということ。ソース内のCHANGESに何か書かれているはずですね。
 
 

BIND9.9.1-P1のCHANGES

これだな!

3180.   [func]
Local copies of slave zones are now saved in raw format by default, to improve startup performance.
‘masterfile-format text;’ can be used to override the default, if desired. [RT #25867]

 
 

セカンダリのゾーンファイルをtext形式にする方法

named.conf内のzone{};内にmasterfile-format text;を記述すればtext形式になります。text形式にすると、CHANGESにも書かれている通り、起動パフォーマンスが低下するようです。多くのゾーンを管理しているDNSサーバではraw形式方がいいのでしょうね。
以下が記述サンプルです。

// We are a slave server for example.com
zone “example.com” {
    type slave;
    masterfile-format text;
    file “example.com.zone”;
    // IP address of example.com master server
    masters { 192.168.4.12; };
};

全てのゾーンファイルをtext形式にしたい場合は、zone{};の中ではなく、named.confやnamed.conf.optionsに「masterfile-format text;」を書くとよい。
 
 

Raw形式のzoneファイルの内容をチェックする方法

先にも書いたAXFRでzoneで設定されている内容をチェックする方法もありますが、named-checkzoneコマンドで中身を直接見ることもできます。
named-checkzone -D -f raw <ZONE_NEME> <ZONE_FILE_NAME>
e.g.
# named-checkzone -D -f raw example.com example.com.zone

関連記事一覧

  1. los angeles kitchen remodel

    Thanks , I’ve recently been searching for information about this subject for ages and yours is the greatest I’ve discovered till now.
    However, what about the conclusion? Are you sure concerning the source?

  2. NEO

    Thank you for your comment.
    source for bind-9.9.2-P2.
    ~/bind-9.9.2-P2/bin/named/zoneconf.c
    If you use bind-9.9.x for slave mode, and you do not specify any file type, default set raw type.
    912 if (ztype == dns_zone_slave)
    913 masterformat = dns_masterformat_raw;
    914 else
    915 masterformat = dns_masterformat_text;
    916 obj = NULL;
    917 result= ns_config_get(maps, “masterfile-format”, &obj);
    918 if (result == ISC_R_SUCCESS) {
    919 const char *masterformatstr = cfg_obj_asstring(obj);
    920
    921 if (strcasecmp(masterformatstr, “text”) == 0)
    922 masterformat = dns_masterformat_text;
    923 else if (strcasecmp(masterformatstr, “raw”) == 0)
    924 masterformat = dns_masterformat_raw;
    925 else
    926 INSIST(0);
    927 }