/etc/
    named.conf         named.named 600    主設定ファイル
    named.custom       named.named 600    主設定の一部を分割記述するファイル(RedHat系特有?)
    rndc.conf          root.root   600    rndcツール設定
    rndc.key           root.root   600    namedに接続する際のキー定義
    named.key          named.named 600    rndcから接続される際のキー定義
    sysconfig/named    root.root   644    rcスクリプトのオプション
/var/
    named/             named.named 700 
        named.ca       named.named 600    ルートゾーンファイル
        localhost.zone named.named 600    localhostゾーン正引き
        localhost.rev  named.named 600    localhostゾーン逆引き
        hoge.cxm.zone  named.named 600    自ドメインゾーン正引き
        hoge.cxm.rev   named.named 600    自ドメインゾーン逆引き
    log/named/         named.named 700 
        named_custom.log  named.named 644    カスタムログファイル
        named.log      named.named 644    syslogを通すログのログファイル
    run/named/         named.named 700 
        named.pid      named.named 644    PIDファイル
log と run ディレクトリにわざわざ named ディレクトリを挟むのは、named は log/ と run/ に直接書き込みを行う権限がないから。ただし BIND のログを常に syslog を通じて記録するならそんな必要はない。 log/ や run/ 自体のパーミションを変更するのは御法度 (認証フレームワーク PAM に怒られる) !
以下、各ファイルの説明。
RedHat系では、 BIND コンフィギュレーションユーティリティでサポートされていない設定項目だけは named.custom という別ファイルに分割する。そういう項目は BIND-Conf で変更して保存すると消されてしまう可能性があるからだ。下記の設定例の中で、現在の system-config-bind でサポートされていないのは logging セクション (loggingセクションの説明を参照のこと)。
設定ファイルにコメントを記述する場合、 Cスタイル (/* コメント */)、 C++スタイル (// コメント)、シェルスタイル (# コメント) が使用できる。しかしゾーンファイルではコメント記述方法が異なるので注意。
logging {                                 # ロギングに関する設定ブロック
 channel "my_file" {                            # カスタムログチャネルmy_fileを定義
  file "/var/log/named/named_custom.log" versions 4 size 2m;
  severity dynamic;
  print-time yes;
  print-severity yes;
  print-category yes;
 };
 channel "secure_syslog" {                      # カスタムログチャネルsecure_syslogを定義
  syslog authpriv;
  severity info;
 };
 channel "default_syslog" {                     # 定義済みチャネルsecure_syslogを再定義
  syslog local1;
  severity dynamic;
 };
 category "security" {                          # ログカテゴリsecurityに対する取り扱いを指定
  "my_file";
  "default_syslog";
 };
 category "database" {                          # ログカテゴリdatabaseの取り扱い指定
  "my_file";
 };
 category "config" {                            # ログカテゴリconfigの取り扱い指定
  "my_file";
 };
 category "resolver" {                          # ログカテゴリresolverの取り扱い指定
  "my_file";
 };
 category "general" {                           # ログカテゴリgeneralの取り扱い指定
  "my_file";
 };
 category "client" {                            # ログカテゴリclientの取り扱い指定
  "my_file";
 };
 category "lame-servers" {                      # ログカテゴリlame-serversの取り扱い指定
  "null";
 };
 category "default" {                           # 「その他すべて」のログの取り扱い指定
  "default_syslog";
 };
};
acl "hoge-local" {                        # アクセスコントロールリストに関するブロック
 192.168.0/24;                                  # 以降の設定記述内でこれらのアドレスがニックネーム、
 127.0.0.1;                                     # hoge-localの一言で指し示せるようになる
};
options {                                 # オプションに関するブロック
 directory "/var/named";                        # namedの作業ディレクトリ
 max-cache-size 10485760;                       # DNSキャッシュを10MBに制限
 allow-query {
  "hoge-local";                                 # acl "hoge-local" からのDNSクエリのみ許可
 };
 allow-transfer {                               # acl "hoge-local" 内にあるスレーブDNSサーバからの
  "hoge-local";                                 # ゾーン転送要求のみを許可。今回はマスターのみなので
 };                                             # 本来は不要だが、不正な要求に答えないために設定
 allow-recursion {
  "hoge-local";                                 # 再起的名前解決を提供するのは
 };                                             # hoge-local からのクエリ時のみ
 auth-nxdomain yes;                             # 「そんなドメイン無いよ」の回答にもAAビットを立てる
forward first; # 外部DNSサーバに問い合わせを行う (委託) forwarders { xxx.xxx.xxx.xxx; # 委託する外部DNSを指定 (プロバイダのDNSなど) yyy.yyy.yyy.yyy; }; version "8.0"; # バージョンを偽装。クラッカーへのささやかな用心 };
controls {                                      # rndcユーティリティからの接続に関する設定
 inet 127.0.0.1 allow {                         # ループバックアドレスのデフォルトポートTCP953で待機
 localhost;                                     # localhost からの接続のみ受け付ける
 } keys { "rndckey";                            # rndckeyという名前で定義された(ファイル名ではない)
 };                                             # キーを使って
};
include "/etc/named.key";                       # "rndckey"の定義は別ファイル"named.key"を読む
# ゾーン定義に関するブロック zone "." IN { # ルートゾーンファイルの指定 type hint; # ファイル名のみで指定した場合、optionsブロック file "named.ca"; # のdirectoryで定義したdirからの相対パスと }; # 見なされる zone "localhost" IN { # ローカルホストゾーンファイル (正引き) 指定 type master; file "localhost.zone"; } zone "0.0.127.in-addr.arpa" IN { # ローカルホストゾーンファイル (逆引き) 指定 type master; file "localhost.rev"; }; zone "hoge.cxm" IN { # hoge.cxmゾーンファイル (正引き) 指定 type master; file "hoge.cxm.zone"; }; zone "0.168.192.in-addr.arpa" IN { # hoge.cxmゾーンファイル (逆引き) 指定 type master; file "hoge.cxm.rev"; };
| logging | 設定ファイルに文法エラーがあるなどもログされるわけなので、logging セクションは named.conf の先頭に置かなくてはいけない。 RedHat系では system-config-bind の関係で、このセクションは named.custom に書き、その代わり named.conf の頭に `include /etc/named.custom;' と記述。 include しないと自動的には読み込まれない。裏を返せば、追加設定ファイルの名前は named.custom でなくても構わないし、もっとたくさんのファイルに分けることも可能なわけだ | 
| channel | ロギングポリシーのセットを定義して、それを category でエイリアスのように使用できる。その他に、channel で定義しなくても使える定義済みチャネルである default_debug, default_syslog, default_stderr, null がある。 null は「記録せず捨ててしまう」チャネル。定義済みチャネルは再定義も可能で、設定例の default_syslog のように、その中の一部項目だけを上書きすることもできる。 | 
| file | ログを特定のファイルに出す場合は、ファイル名 (絶対パス) の他、ログファイルの世代ローテーション設定も可能。例では 2M に達すると次のログにスイッチし、4代保存 | 
| syslog | 特定ファイルでなく syslogd に渡す。引数は authpriv, daemon といったファシリティ。設定例の default_syslog チャネルのようにユーザ定義ファシリティ local* を割り当てることもできる (man syslog.conf を見よ) | 
| severity | syslog で言う priority。 info, notice, warn, `debug 3' など。 `dynamic' にすると、rndc を使ってログレベルを随時変更できる | 
| print-time | ログに日時も記録。 syslogd はもともと日時を書き加えるので syslogd に渡す場合に yes にするのは無駄 | 
| ログにシビアリティも添える | |
| category | named のログには17種類のカテゴリーがあり、必要なものに channel を割り当てる。 default カテゴリは、ここで指定していないログ「その他諸々」がマッチする | 
| lame-servers | ログカテゴリのひとつで、「設定のおかしいDNSサーバ」を意味する。再帰問い合わせで BIND がそう判断する場合が非常に多く、ログしてもほとんど無意味なので null チャネルを指定して捨ててしまう | 
| DNS データキャッシュに使用するメモリサイズ (バイト)を制限する。指定したサイズに達すると、キャッシュされているレコードの TTL が満期に達していなくても強制的に失効させる。デフォルトはサイズ無制限で、各データの TTL にのみ依存する | |
| リカージョンとは、名前解決できるまで上位 DNS に遡って問い合わせを行うことを意味する。デフォルトではすべてのホストからの問い合わせに対し再帰努力が行われる | |
| auth-nxdomain | 「そんなドメイン無いよ」 (NXDOMAIN = Non eXistent DOMAIN) という回答にも、常に AA (Authoritative Answer) ビットを付ける。古い DNS サーバへの互換性のために設定 | 
| forward | 名前解決を fowarders で指定した外部サーバに委託する。 `forward first' を指定した場合、クライアントからのクエリに対して以下のように動作する。 
 | 
| controls | このセクションが無ければ、デフォルトで localhost からの rndc 接続のみ可能となるようだが、 keys 定義が無いと、 named は起動時に勝手に rndc.key というファイルを探そうとして失敗し、 rndc からの接続が成り立たない。記述すべし | 
| zone | named.conf でのゾーン名には、最後のドットが必要ない | 
ここに網羅したのは全ディレクティブのほんの一部に過ぎない。とても説明しきれないので、詳しくは、google などでキーワード "BIND 9 Administrator Reference Manual" で検索するなどしてドキュメントを読むこと。
Zone File またはResource Records (RR) と呼ばれる。ISC のオフィシャルドキュメントはこの文法に関して非常にわかりにくい。 CEPBAが載せているもの、SUNのDOC、BIND9.NET のほうが分かりやすい。それらを翻訳整理要約したのが下記。
まず、レコードは以下のように分類される。リソースレコードのうちでも SOA レコードとそれ以外ではフォーマットがかなり異なるので、区別しておく必要がある。
| SOA | Start Of Authority。ひとつのゾーンの定義の開始を意味する。次の SOA が宣言されるまでが、ひとつのゾーンと見なされる。つまり、通常のゾーンファイルでは、下記のリソースレコード (NS, A, CNAME など) すべては、最初に定義される SOA レコードに「内包」されていると言える | 
| NS | Name Server。ゾーンのネームサーバを定義 | 
| A | Address。ホスト名 --> アドレス の対応を定義 | 
| PTR | PoinTeR。他の場所の名前 --> 本当の名前 の対応を定義。主に、アドレス --> ホスト名 の逆引きに利用される | 
| CNAME | Canonical NAME。エイリアス --> 正式名 の対応を定義 | 
| MX | Mail eXchanger。メール配信する機能 (MTA) を自前で持たないホストに代わって、ゾーンを代表してメール配信を受け持つホストを定義 | 
name class SOA master_data_holder person_in_charge serial trans_refresh trans_retry trans_expire neg_ttl
パラメータが多くて人間には読みにくいため、一般的には、改行を無効にする ( ) を利用して次の様に書く。
name class SOA master_data_holder person_in_charge (
    serial
    trans_refresh
    trans_retry
    trans_expire
    neg_ttl )
| name | ゾーン名。通常、現在のオリジンを意味する `@' だけ書く。指定する場合は最後にドットを付けるのを忘れずに | 
| class | ほぼ常に `IN'。 IN はインターネットアドレスの意 | 
| このゾーンのマスターデータを持つホスト名。普通はマスター DNS サーバ。今回のようにマスターサーバしかない場合はサーバ自身。最後にドットが必要 | |
| person_in_charge | master_data_holder の管理責任者のメールアドレス。ただし、 @ はドットに置き換えて、例えば root@hoge.cxm なら root.hoge.cxm. と書く。最後にドット | 
| serial | スレーブサーバがゾーン転送を受ける際、または、ローカルの named に "rndc reload" をかけた際、この数字が増していれば、データが新しくなったと見なしてリロードされる。10桁まで有効。左端にあるひとつ以上連続したゼロは無視され、桁数に入らない。10桁を超えるとゾーンは正常にロードできない。 `2004043001' のように YYYYMMDDRR の書式とするのが慣例 | 
| trans_refresh | スレーブサーバにマスターデータの更新をチェックさせる間隔 (秒) | 
| trans_retry | スレーブサーバが、マスターデータの更新チェックに失敗した際、リトライするまでの時間 (秒) | 
| trans_expire | ゾーン転送を受けられない期間が長引いた場合に、データが trans_expire (秒) より古くなったら、スレーブサーバはそのゾーンデータを無効と見なして無視する | 
| neg_ttl | 他の記述での TTL は「有効な回答」を保持する期間だが、ここでの TTL はネガティブキャッシュTTL であり、「そんなドメイン無いよ」という DNS 回答 (NXDOMAIN) を保持する期間。ネガティブキャッシュTTL は、存在しないドメインに関する無駄な問い合わせを減らすための仕組み。最大値は3時間 (10800秒) | 
[name] [ttl] class type data
| name | ホスト、ドメインの名前。代わりにスペースまたはタブを記述した場合は、 named.conf でこのファイルに対して定義したドメイン名が使われる。 @ の場合は オリジン 
(通常はドメインとイコール) の意味。完全に省略 (スペースもタブも無し) すると「直前のレコードと同じ」の意味となる。 このフィールドはあくまでも「名前」であり、アドレスは直接書けない。そのために使うのが、アドレスを名前に化けさせる in-addr.arpa. という特別なドメインだ。名前なので、右側に行くほど上位になる。192.168.0.1 なら、ひっくり返して 1.0.168.192.in-addr.arpa. と書く | 
| ttl | Time-To-Live。レコードを引いた相手DNSがデータベースにこのレコードを保持する寿命 (秒)。省略すれば、ゾーンファイル冒頭の $TTL で定義した TTL が適用される。省略することが多い | 
| class | インターネットを示す `IN' のみ。他にも CH と HS があるがまず使うことはない | 
| type | レコードタイプ (前述) | 
| data | アドレスまたはホスト。ホストは、ドメインも含めた FQDN (Fully Qualified Domain Name) を表したいなら最後にドット (.) が必要。ドットで終わらない名前には、$ORIGIN が補完される。 MX レコードに限っては、"優先順位 ホスト" を記述。優先順位は数字が小さいほど高い | 
| @ | オリジンに展開される (下記「特別なディレクティブ」も参照のこと) | 
| ( ) | 丸カッコで囲まれた範囲内では、改行が無視される | 
| ; | セミコロンはコメント開始記号。改行するまでが、コメントと解される | 
| * | ワイルドカード。ホストやドメイン名の先頭には使えるが、"mail.*" といった使い方は不可 | 
| $TTL ttl | 各レコードで TTL パラメータが省略されていた場合のデフォルトTTL。 SOA の前に宣言する | 
| デフォルトでは暗黙のうちに、named.conf で指定したゾーン名が domain_name にセットされる。それを明示的に変更したい場合に使用する | |
| この記述が現れた箇所に、 file に書かれた内容を読み込む。 origin も指定すると、file 内容に対する $ORIGIN が個別に明示的にセットできる |