BINDのviewを用いた内部向けDNS構築メモ

社内ネットワーク向け DNS サーバを立てたくて、BIND の view を用いて設定を行ってちょっとはまったのでメモを残しておく。

環境

  • BIND 9.3.6 (CentOS 5.5 標準)

viewについて

  • BIND 8 から使用できる、接続条件によって見える情報を変える仕組み。以下のように記述する
view view_name {
  match-clients { list; };
  match-destinations { list; }
  // and other options
}
  • match-clients はリクエスト元のソースIPでマッチを行う。
  • match-destinations はリクエストを受け付けるインターフェースのIPアドレスでマッチを行う。
  • 複数の view にリクエストがマッチする場合は、named.conf の先頭に近い条件が適用される。

実際の記述

  • 内部ネットワークに 192.168.100.0/24 と 192.168.200.0/24 という2つのネットワークがあり、両方から内部 DNS を参照したい場合は acl を設定したほうが楽。
  • 192.168.100.1 に対外ルータがあって、外部 DNS の解決はそちらに投げる。
  • ついでに Google Public DNSも設定してみる。
  • この内部ネットワーク向けDNSサーバでも、内部向けの名前解決を行いたいので、内部向けのゾーンファイルは別ファイルにして、localhost_resolver, internal の2つの view で include している。
acl "internal-acl" {
    127/8;
    192.168.100/24;
    192.168.200/24;  
};
options {
    directory               "/var/named";
    dump-file               "data/cache_dump.db";
    statistics-file         "data/named_stats.txt";
    memstatistics-file      "data/named_mem_stats.txt";

    allow-query { internal-acl; };
    allow-transfer { internal-acl; };

    forwarders {
            192.168.100.1;
            8.8.8.8;
            8.8.4.4;
    };
};
view localhost_resolver {
    match-clients { localhost; };
    match-destinations { localhost; };
    recursion yes;
    include "/etc/named.rfc1912.zones";
    include "/var/named/named.internal.zones";
};
view internal {
    match-clients { internal-acl; };
    match-destinations { localnets; };
    recursion yes;
    include "/etc/named.root.hints";
    include "/var/named/named.internal.zones";
};

デバッグ

  • どの view を参照して応答を返しているのか分からず苦労をしたので、障害時にはqueriesログを残しておくと良い。
logging {
    channel debug {
        file "data/named.debug";
        severity debug;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    category queries { debug; };
};