DNSサーバ

パッケージ確認

taskselでどのパッケージがインストールされているか確認。

$ tasksel --task-packages dns-server
bind9-doc #BINDのドキュメント
bind9utils #BINDのメンテナンス用ユーティリティ
bind9 #BIND本体

シンプルにBIND関係のパッケージのみらしい。

プライマリDNSの設定

chroot仕様のCentOSと違って、Ubuntuは通常のディレクトリ構成になっているので、設定ファイルは/etc/bindにフラットに配置されている。

設定ファイルのnamed.confは事実上空っぽで、以下の三ファイルをインクルードする仕様。一つのファイルにいくつもの設定をごちゃごちゃ書くよりもわかりやすい。

・named.conf.options # BINDの基本設定
・named.conf.default-zones # ルートサーバやローカルなどデフォルトのゾーン設定
・named.conf.local # ユーザーが追加するゾーンの設定

named.conf

各種設定ファイルをインクルードしているだけなのでほとんど変更点はないが、viewを使う都合上、named.conf.default-zonesはコメントアウト。これはnamed.conf.localのview内で読み込む。

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
//include "/etc/bind/named.conf.default-zones";
named.conf.options

BIND全体のオプションを設定。

options {
        directory "/var/cache/bind";
        allow-transfer { none;}; # 転送を基本禁止。ゾーンごとに許可する
        version ""; # バナー変更
};

ゾーン転送は個々のゾーンごとに許可する転送先を設定するので、基本は一律禁止する。
ついでにバナーを変更して、BINDのバージョンを隠す。こんなところで設定さらしてるくせに、ささやかなクラック対策。

BINDはバージョン9.4.1-P1以降、再起問い合わせとキャッシュの返答を、デフォルトでlocalhostとlocalnetsに限定するようになったらしい。なのでallow-query,allow-recursion,allow-query-cacheは特に設定しなかった。

named.conf.local

各ゾーンの設定。

// localnetの定義
acl "localnet" {
        192.168.1.0/24;
        127.0.0.1;
};

// seocondary_dnsの定義
acl "secondary_dns" {
        202.157.182.142; # ns.twisted4life.com 外部セカンダリDNS
        192.168.1.xxx;  # ns1.aerialline.com 内部セカンダリDNS
};

// 内部ネットワークからのリクエスト向け定義
view "inside" {
        match-clients { localnet; };

        // 標準でインストールされているローカルのゾーンを読み込み
        include "/etc/bind/named.conf.default-zones";

        // 正引き
        zone "aerialline.com"  {
                type master;
                file "/etc/bind/db.aerialline.com.local";
                allow-transfer { localnet; }; # 内部のセカンダリDNSにのみ転送許可
                notify yes;
        };

        // 逆引き
        zone "1.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/db.1.168.192";
                allow-transfer { localnet; }; # 内部のセカンダリDNSにのみ転送許可
        };
};

//  外部ネットワークからのリクエスト向け定義
view "outside" {
        match-clients { any; };

        // 正引き
        zone "aerialline.com" {
                type master;
                file "/etc/bind/db.aerialline.com";
                allow-transfer { secondary_dns; }; # 指定のセカンダリDNSに転送許可
                notify yes;

        };

        zone "seotch.net" {
                type master;
                file "/etc/bind/db.aerialline.com"; # aerialline.comと同じゾーン設定
                allow-transfer { secondary_dns; }; # 指定のセカンダリDNSに転送許可

        };

        // 逆引き
        zone "104.5.211.in-addr.arpa" {
                type master;
                file "/etc/bind/db.104.5.211";
                allow-transfer { secondary_dns; }; # 指定のセカンダリDNSに転送許可
        };


};

// rndc.keyのインクルード
include "/etc/bind/rndc.key";

db.aerialline.com

外部ネットワーク向け、公開サーバの正引き定義。
外部からのアクセスはルーターでポートごとに振り分けているので、ほとんどgwの仮名(CNAME)になっている。

$TTL 86400
@               IN      SOA     dns.aerialline.com.     seo.aerialline.com. (
                2009112001      ; serial        YearMonthDayNumber
                3600            ; refresh       1 Hour
                900             ; retry         15 Min
                1728000         ; expire        20 Days
                86400           ; min           24 Hour
)

                IN      NS      dns.aerialline.com.     ; Primary
                IN      NS      ns1.twisted4life.com.   ; Secondery

                IN      MX      10      mail.aerialline.com.

                IN      A       211.5.104.xxx
dns             IN      A       211.5.104.xxx
mail            IN      A       211.5.104.xxx
gw              IN      A       211.5.104.xxx

www             IN      CNAME   gw
ftp             IN      CNAME   gw
wiki            IN      CNAME   gw
phpmyadmin      IN      CNAME   gw
sns             IN      CNAME   gw
project         IN      CNAME   gw
blog            IN      CNAME   gw
seotch          IN      CNAME   gw
ubunchu         IN      CNAME   gw

db.aerialline.com.local

内部ネットワーク向け、LAN内ホストと公開サーバの正引き定義。
ゾーン転送禁止の意味ないだろ! とツッコミがきそうだが、たいしたネットワークじゃないのでキニシナイ。内部ネットワークのホストには漫画「うぶんちゅ!」のキャラ名がついていたりする。

$TTL 86400
@               IN      SOA     dns.aerialline.com.     seo.aerialline.com. (
                2010071601      ; serial        YearMonthDayNumber
                3600            ; refresh       1 Hour
                900             ; retry         15 Min
                1728000         ; expire        20 Days
                86400           ; min           24 Hour
)

                IN      NS      dns.aerialline.com.     ; Primary
                IN      NS      ns1.aerialline.com.     ; Secondery

                IN      MX      10      mail.aerialline.com.

                IN      A       192.168.0.1
dns             IN      A       192.168.0.32
ns1             IN      A       192.168.0.1

router          IN      A       192.168.0.1
lisa            IN      A       192.168.0.31
akane           IN      A       192.168.0.32

www             IN      CNAME   akane
mail            IN      CNAME   akane
ftp             IN      CNAME   akane
phpmyadmin      IN      CNAME   akane
ubunchu         IN      CNAME   akane
db.104.5.211

外部ネットワーク向け、公開サーバの逆引き定義

$TTL 1H
@       IN      SOA     dns.aerialline.com.      seo.aerialline.com. (
                2009112001      ; serial        YearMonthDayNumber
                3600            ; refresh       1 Hour
                900             ; retry         15 Min
                1728000         ; expire        20 Days
                86400           ; min           24 Hour
)
        IN      NS      dns.aerialline.com.     ; Primary
        IN      NS      ns1.twisted4life.com.   ; Secondery
180     IN      PTR     gw.aerialline.com.
db.1.168.192

内部ネットワーク向け、LAN内ホストの逆引き定義

$TTL 1H
@       IN      SOA     dns.aerialline.com.      seo.aerialline.com. (
                2009112001      ; serial        YearMonthDayNumber
                3600            ; refresh       1 Hour
                900             ; retry         15 Min
                1728000         ; expire        20 Days
                86400           ; min           24 Hour
)
        IN      NS      dns.aerialline.com.     ; Primary
        IN      NS      ns1.aerialline.com.     ; Secondery
xxx     IN      PTR     gw.aerialline.com.
xxx     IN      PTR     akane.aerialline.com.
xxx     IN      PTR     lisa.aerialline.com.

設定のテスト

named.confとそのインクルードファイルの書式が正しいかテスト。

$ sudo named-checkconf

各ゾーン定義ファイルの書式が正しいかもチェック。ここでは例としてaerialline.comゾーンの定義をするdb.aerialline.comを表示。

$ named-checkzone aerialline.com db.aerialline.com
zone aerialline.com/IN: loaded serial 2009112001
OK

全てエラーが出なければOK。

サーバ再起動

設定を読み込ませて、サーバ再起動。

$ sudo /etc/init.d/bind9 restart

セカンダリDNSの設定

内部セカンダリCentOSなので省略するが、ゾーン転送でプライマリの設定をミラーしている。
外部セカンダリには、http://www.twisted4life.com/のサービスを利用。

課題

/var/log/syslogを見ると、network unreachable resolvingなエラーが頻繁にはき出されている。最近のBINDではIPv6を最初に見に行くので、そこで失敗しているらしい。今のところIPv6は使わないので-4スイッチでBINDを起動して無効にしてしまってもいいのだが……と思いつつしばらく様子見。