2011/07/19 CentOS5.5





named.confを調整する(CentOS5)

BINDのnamed.confは不要といえるほど多数の設定が施せます。
ここでは割と使うかもしれない設定情報を例にします。


DNSフォワーディングの設定
自分が管理しているゾーンにだけ応答する(インターネットドメインは解決しない)
ログファイルの出力
ACLでクライアント要求を制限する
MXレコード
DNSフォワーディングの設定
デフォルトでは、知らないドメインはルートヒントへ問い合わせに行きます。つまり自力で遠いサーバへ接続しに行きます。
しかし毎回インターネットの解決にルートヒントを使うのも、イマイチです。
通常はフォワーダに一番近い上位DNSを指定し、名前の解決を上位DNSに任せます。

forwardersを指定すると、自分がmaster以外のゾーンは常に自分をセカンダリと認識し、上位DNSへ問い合わせます。
組織のDNSは集約されることが多いので、ISPのDNSが利用できる場合などは、上位DNSを指定することで解決を代理依頼する構成が一般的です。

※forwardersを指定するときのもっとも避けるべきは、LAN内のDNSが複雑化しA→B→C→A、のようにDNSサーバ同士の問い合わせがループする事態です。

フォワーディングには二種類があります。

1.上位DNSへ問い合わせを実施し、失敗したらルートDNSへ通常問い合わせを実施する。(デフォルト)

named.conf

options {

  directory "/var/named";
  forwarders { DNS-Addr1; DNS-Addr2;};  //フォワーディングサーバを指定する
  forward first;
};

上位DNSサーバがダウンしていたり、ビジーで有効時間内に応答がなかった場合、「zone "."」の記述通り、あるいはBINDの宿命としてルートサーバを使用してアドレスを解決を試みます。(もちろん、実際にルートサーバへ通信できる必要があります)
※なお、forward firstはforwardersのデフォルトパラメータなので、あってもなくても動作は同じです。

長所
 上位DNSがダウンしている場合でも、ルートヒントへ問い合わせるので解決の可能性がある。
短所
 「存在しないドメイン」を問い合わせた場合は、二重に問い合わせが発生するのでムダがある。
 「sysquery: no addrs found for root NS」エラーが大量に出力されることがある。 


2.上位DNSへ問い合わせを実施し、失敗したら解決失敗を回答する。(onlyモード)

named.conf

options {

  directory "/var/named";
  forwarders { DNS-Addr1; DNS-Addr2;};
  forward only;
};

今度はforward onlyを設定してあるので、上位DNSでの問い合わせに失敗した場合、ルートサーバへの問い合わせは実施しません。名前は解決できなかったことになります。
(つまりzone "."のセクションは使用されいません)

・firstではエラーの出力がある
・余計な問い合わせをルートにしない
・最近は上位のDNSも安定的に運用されている、
ともろもろのことを考えれば、いまどきはforward onlyに設定しておくのが主流のようです。


自分が管理しているゾーンにだけ応答する(インターネットドメインは解決しない)
DNSは外部ドメインの解決という使命を持っているため、デフォルトでインターネットドメインを解決しようとします。
ですが閉じられたネットワークなど、自分が管理しているゾーン以外のドメイン解決を望まない場合は、再帰問い合わせを無効にすることでインターネットドメインの名前解決をしなくなります。

そのためにリカーションを禁止します。

named.conf

options {
   directory "/var/named";
   recursion no;
};

これで再帰問い合わせをしない、つまり自身がホストしているゾーン以外の問い合わせには答えません。
フォワーダを設定してあっても、他のサーバへ問い合わせをしません。


ログファイルの出力
ログ出力の定義はちょっと複雑です。
チャネルを定義し、カテゴリで使用します。

named.conf

logging {
        channel "チャネル名" {
                file "/var/log/ログファイル名.log" versions 3 size 5m;
        };
        category カテゴリ { "チャネル名"; };
};

チャネル名は適当に付けます。チャネルの宣言の中に、どのレベルの情報を出力するか、現在時刻のログ出力などの動作を定義します。
categoryでカテゴリ(detabaseやqueryなどのあらかじめ決められている単語)を選択し、その中でチャネルを指定します。


名前解決クエリーを全てログへ出力する。(ファイルは5MB単位で3世代までローテート)
運用のログではなく、DNSデバッグや攻撃追跡のときに用いるものです。サーバに負荷をかけます。

logging {
        channel "log_queries" {
                file "/var/log/queries.log" versions 3 size 5m;
                severity info;
                print-time yes;
                print-category yes;
        };
        category queries { "log_queries"; };
};


ゾーンの動作情報を標準エラーへ出力する。
標準エラーはBINDでデフォルトで定義されている「default_stderr」を記述します。

logging {
   category database { "default_stderr"; };
};

ログはsyslogを使用することもできますが、設定項目自体タイヘン多岐にわたり、にカテゴリキーワードもチャネルキーワードも複雑になりがちです。それなりに勉強する必要があります。


ACLでクライアント要求を制限する
DNSへ接続してくるクライアントを制限します。
特定ネットワーク内のみ許可、あるいは特定サーバのみ許可、という設定を行います。

ネットワークの制限・ホストの制限
named.conf

options {
   directory "/var/named";
   allow-query { 192.168.1/24;  192.168.2.100; };
};

ACL定義による制限
named.conf

acl "lan" { 192.168.1/24; 192.168.2.100; }

options {

   directory "/var/named";
   allow-query { "lan"; };
};


また、ゾーン単位に制限することもできます。
この場合はexample.com以外のゾーンについて制限はありません。

zone "example.com" {
  type master;
  file "example.com.fwd";
  allow-query { 192.168.1/24; };
};

許可されたクライアント以外から、nslookupで試験を行います。
refusedが表示されれば制限されています。

#nslookup
>server 192.168.1.99
>host1.example.com
*** [192.168.1.99] can't find bind-sv.example.com: Query refused


MXレコード
DNSの重要な役割の一つである「メール基盤」。
ゾーンにMXレコード、プリファレンス、サーバホスト(通常はAレコード)を記述することでメールの送信経路が正しく指定されます。

example.com.zone

$TTL 86400
@    IN   SOA   bind-sv.example.com.   root.example.com. (
    2011070901 //Serial
    3600           //ゾーン転送の間隔 秒
    300             //転送失敗時のリトライ間隔 秒
    360000       //ゾーンファイルの保持時間 秒
    86400   )    //他サーバでキャッシュされる時間 秒

            IN   NS          bind-sv.example.com.
            IN   MX 10     mail1.example.com.
            IN   MX 20     bind-sv.example.com.
bind-sv  IN   A            192.168.1.99
host1    IN   A            192.168.1.100
mail1     IN   A            192.168.1.101
         

BINDをリロードします。
#service named reload

LAN内のクライアントから、nslookupによる試験を行います。

#nslookup
>server 192.168.1.99
>set type=ptr
>example.com
Server:  [192.168.1.99]
Address:  192.168.1.99

example.com     MX preference = 20, mail exchanger = bind-sv.example.com
example.com     MX preference = 10, mail exchanger = mail1.example.com
example.com     nameserver = bind-sv.example.com
mail1.example.com       internet address = 192.168.1.101
bind-sv.example.com     internet address = 192.168.1.99


MXレコードがプリファレンスとともに表示されれば成功です。






prev.gif