< Top / Next >

2章 DNSサーバの構築

本章では、インターネット用DNSを自サイトに構築する手順と、DNSサーバソフトのbindを使ったDNSサーバ構築例を説明します。

1.DNSの公開までの手順

インターネットにサーバを公開するために、インターネット上のDNSに公開したいサーバを登録する必要があります。 登録の方法としては、
  1. プロパイダなどが用意しているDNSに登録してもらう。
  2. 自分の組織用DNSを用意して、ゾーン名を取得してそれをインターネット上のDNS名を管理しているNIC(Network Information Center)に登録する。
の2つの方法が考えられます。 会社などで公開するサーバがある程度の数がある場合には、商標とおなじように予めDNSのゾーン名を確保しておきたい場合にはⅱの方法でNICへドメイン名を登録する必要があります。
DNSのドメイン名を取得するには、DNS名を管理・維持・販売をしているレジストラという会社か利用プロパイダを使って登録を行います。(レジストラ会社の例: "お名前.com"、"GoDaddy")
また、登録後、DNSサーバのIPアドレスも指定する必要があります。このため、インターネット上にDNSサーバを公開するにあたり必要な手順は、大凡、次の手順となります。
  1. プロパイダと契約
    プロパイダと契約してインターネットへ接続できるようにします。
    このとき、接続に固定IPアドレスを複数利用できる契約を行ってください。(IP8とかIP16とかの契約)
    固定IPアドレスの数が1個または0でも構築する方法が無い訳ではありませんが手間がかかるのと、将来IPv6などの利用時などで正しい動作のDNSの構築ができない可能性があるので、ある程度の規模の組織であれば、IP8以上で契約した方が良いでしょう。
    ここで取得した固定IPアドレスのうちの1つを、DNSサーバ用のIPアドレスとして使います。
  2. NIC(Network Infomation Center)へDNSサーバ情報の登録
    利用したいドメイン名を取得して、NICへ登録します。
    NICへの登録はプロパイダが代行してくれるので、詳しい申請方法はプロパイダに相談すると良いでしょう。もちろん、プロパイダを使わずに、上で説明したようなレジストラからユーザ自身が取得・登録することも可能です。レジストラを使うメリットは、登録・管理料が安いことと、多くのトップレベルドメイン名(ex. "example.com"、"example.org"、"example.jp"等)が登録できることです。
  3. DNSサーバの構築
    ドメイン名が決まったらインターネットに公開するDNSサーバをインストールします。 このとき、DNSサーバ用のソフトには BIND というソフトを利用する事をお勧めします。 BIND は古くからあるフリーのDNSサーバソフトで、信頼性が高く、またその情報が多く存在するので困った時に安心です。
    BIND以外にもMS-DNSとかソフトなども存在しますが、インターネット公開用のDNSとしては少し問題があるのでここは素直にBINDを利用する方が得策です。
    BINDは 各種Unix,Linux, SunOS, Mac, そしてWindows用があるので、自分が利用したいOS環境のものを入手すれば良いでしょう。
    一般的なUnixやLinuxではOSにはじめからBINDが入っているのでそれをインストールしますが、WindowsなどはISC(Internet Systems Consortium, Inc.)のダウンロードサイトから入手すれば良いでしょう。 インストールおよび設定手順は後ほど詳しく説明します。
  4. DNSサーバの公開
    DNSサーバの構築が終わったなら、そのDNSをインターネットに公開します。
    公開するには、上位のDNSサーバに登録してもらう必要があるので、プロパイダまたはレジストラの管理画面を呼び出して、ⅲで構築したDNSを登録します。

2.BINDのインストール手順

BIND(Berkeley Internet Name Domain)は、インターネット上で運用されているDNS(Domain Name System)サーバとして一番有名なものでしょう。 
本ページでは、BINDに関する一般的な情報や構築の仕方について説明しています。 なお、説明にあたり構成するDNSの条件として、次のような例として説明を行うものとします。
なお、BINDのインストールにはディストリビューションが用意してあるパッケージを使う方法と、ソースファイルをコンパイルしてインストールを行う方法がありますが、メンテナンスや運用が楽なパッケージによる方法を以下では説明します。
最新のソースを常に追っていけるのであればソースファイルをコンパイルする方法もありかも知れませんが、通常の運用者には少し運用がきついのでパッケージの利用をお勧めします。
取得したIPアドレスの範囲  202.xxx.yyy.0 - 202.xxx.yyy.15
 DNSサーバに割り当てる固定IPアドレス  202.xxx.yyy.2
 NICから取得したドメイン名  正引き  example.co.jp
 逆引き  16.yyy.xxx.202.in-addr.arpa
 NICに申請したDNSサーバの正式(FQDN)名  ns.example.co.jp
 DNSに登録する自社のメールサーバ名  mx.example.co.jp
 メールサーバのIPアドレス  202.xxx.yyy.5
プロパイダのDNS dns1.isp.ne.jp (210.200.xxx.5)
dns2.isp.ne.jp (210.200.xxx.6)
ファイアーウォールのWAN側アドレス 202.xxx.yyy.14

なお、BINDの設定に使う設定ファイルは利用するOS毎に違うので、以下ではOS毎の設定に分けて説明を行います。


3.DNS登録情報の有効時間

設定例でも指定を行っていますが、DNSの設定情報にはその登録されている情報の有効期間が定義されています。 有効期間は「SOAレコード」という部分で定義されており、BINDでは次のような形で定義しています。

$TTL    3600
@       IN      soa     ns.example.co.jp. root.example.co.jp. (
                        2009030900   ; Serial
                        3H              ; Refresh(3 hour)
                        15M             ; Retry(15 minutes)
                        1W              ; Expire(1 week)
                        3600 )          ; Negative Cache TTL(1 hour)
;

ここで、SOAに登録している情報の意味は以下の通りとなります。
項目 設定例 設定目的
シリアル番号(Seria) 2009030900 DNSの情報に変更を加えたら数値を大きくする。数値が大きくなったことを他のDNSが認識すると、古い情報を破棄して新しい情報を取得するようになる。
セカンダリDNSサーバがデータをプライマリDNSサーバからリロードするための基準として使われます。
設定する値は、どこから初めても数字であれば構いませんが、前よりも小さな値を設定することは出来ません。(0は例外的に、リセット用の値として使えます)
混乱しないために、一般的は日付と枝番(2桁)での形式が良く利用されます。(yyyy+mm+dd+No)
リフレッシュ期間(Refresh) 3H, 10800 セカンダリサーバが、再度、プライマリサーバから最新の情報を確認しに行くまでの時間。
リトライ間隔(Retry) 15M, 900 セカンダリがRefreshのタイミングで最新情報を入手できなかった時に、ここで指定された時間が経過後、再度、情報を入手する。
廃棄時間(Expire) 1W, 604800 プライマリDNSから最新データを入手できなくなった場合、最後のリフレッシュから何時間、データを維持するかを指定。この時間を経過すると、データは廃棄される。
ネガティブキャッシュの生存時間(Negative Cache TTL) 3600 DNSは存在しないドメイン情報もネガティブキャッシュとして、ここで指定された時間だけ保持します。
キャッシュの生存時間($TTL) 3600 SOAレコードではありませんが、ネガティブキャッシュではなく正常なキャッシュ情報の保持時間をここで指定します。
ここで指定された時間内は、キャッシュされた情報を利用します。

4.DNS(bind)の設定例


4-1. Redhat ES5(CentOS 5)の場合

  1. BINDのインストール方法
    # yum install bind  bind-utils

  2. BINDで利用する設定ファイル
    Redhat(CentOS)では、デフォルトでセキュリティ強化の為にBINDの動作はchroot環境化(通称、牢獄環境)にて実行されるようになりました。 このため、BINDに関する各種設定ファイルは従来の場所ではなく /var/named/chroot 下の各ディレクトリに置かれたものを使うようになっています。
    目的 保存場所 従来の場所
    BINDの動作に関する基本の設定ファイル /var/named/chroot/etc/named.conf /etc/named.conf
    DNSのゾーン定義ファイルの保存場所 /var/named/chroot/var/named/* /var/named/*
    正引きファイル db.example.co.jp
    逆引きファイル db.202.xxx.yyy
    ログファイルの場所 /var/log/messages /var/log/messages

  3. 設定ファイルの編集

    (/var/named/chroot/etc/named.confの内容)

    //
    options
    {
            // Those options should be used carefully because they disable port
            // randomization
            // query-source    port 53;
            // query-source-v6 port 53;

            // Put files that named is allowed to write in the data/ directory:
            directory               "/var/named"; // the default
            dump-file             "data/cache_dump.db";
            statistics-fil           "data/named_stats.txt";
            memstatistics-file  "data/named_mem_stats.txt";

            // listen-on-v6 { any; };
            auth-nxdomain no;    # conform to RFC1035

            allow-transfer {
                  localnets ;
            };

    //        forwarders { # forwardersの設定は、DNSが直接ルートDNSに参照にいけない場合設定する
    //              210.200.xxx.5 ;
    //              210.200.xxx.6 ;
    //        };

    };

    //
    logging
    {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };

    //key ddns_key
    //{
    //      algorithm hmac-md5;
    //      secret "use /usr/sbin/dns-keygen to generate TSIG keys";
    //};

    view    "external"
    {
    //      match-clients           { !localnets; !localhost; };
    //      match-destinations      { !localnets; !localhost; };
            match-clients           { any; };
            match-destinations      { any; };
            recursion no;

            // all views must contain the root hints zone:
            include "/etc/named.root.hints";

            zone "example.co.jp" {
                    type master;
                    allow-query { any; };
                    file "db.example.co.jp";
            };
            zone "16.yyy.xxx.202.in-addr.arpa" {
                    type master;
                    allow-query { any; };
                    file "db.202.xxx.yyy";
            };
    };
     


    (/var/named/chroot/var/named/db.example.co.jpの内容)

    $TTL    3600
    @       IN      soa     ns.example.co.jp. root.example.co.jp. (
                            2009030900      ; Serial
                            3H              ; Refresh(3 hour)
                            15M             ; Retry(15 minutes)
                            1W              ; Expire(1 week)
                            3600 )          ; Negative Cache TTL(1 hour)
    ;
    @                             IN      NS        ns.example.co.jp.
    @                             IN      MX 10   mx.example.co.jp.
    *.example.co.jp.        IN      MX 10   mx.example.co.jp.

    ;
    ns              IN A            202.xxx.yyy.2
    mx             IN A            202.xxx.yyy.5
    fw              IN A            202.xxx.yyy.14

    ;


    (/var/named/chroot/var/named/db.202.xxx.yyyの内容)

    $TTL    3600
    @       IN      soa     ns.example.co.jp. root.example.co.jp. (
                            2009030900      ; Serial
                            3H              ; Refresh(3 hour)
                            15M             ; Retry(15 minutes)
                            1W              ; Expire(1 week)
                            3600 )          ; Negative Cache TTL(1 hour)
    ;
    @                             IN      NS        ns.example.co.jp.

    ;
    2                IN PTR        ns.example.co.jp.
    5                IN PTR        mx.example.co.jp.
    14              IN PTR        fw.example.co.jp. # FW経由のアクセスで相手側サーバがアドレスチェックを実施している可能性あるので、FWのアドレスを定義しておく。

    ;


  4. BINDをシステム起動時に自動的に起動する
    # chkconfig named on 

4-2. Debian 4.x(Ubuntu 8.x)の場合

  1. BINDのインストール方法
    $ sudo apt-get install bind9 bind9utils

  2. BINDで利用する設定ファイル

    目的 保存場所 従来の場所
    BINDの動作に関する基本の設定ファイル /etc/bind/named.conf ←同
    named.confにおけるoptin部 /etc/bind/named.conf.options ←同
    named.confにおけるゾーン定義部 /etc/bind/named.conf.local ←同
    DNSのゾーン定義ファイルの保存場所 /var/cache/bind/* ←同
    正引きファイル db.example.co.jp
    逆引きファイル db.202.xxx.yyy
    ログファイルの場所 /var/log/syslog ←同

  3. 設定ファイルの編集

    (/etc/bind/named.conf の内容)

    // This is the primary configuration file for the BIND DNS server named.
    //
    // Please read /usr/share/doc/bind9/README.Debian.gz for information on the
    // structure of BIND configuration files in Debian, *BEFORE* you customize
    // this configuration file.
    //
    // If you are just adding zones, please do that in /etc/bind/named.conf.local

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


    (/etc/bind/named.conf.options の内容)
    options {
            directory "/var/cache/bind";

            auth-nxdomain no;    # conform to RFC1035

            allow-query { any; };
            allow-transfer {
                    localnets ;
            };

    //        forwarders { # forwardersの設定は、DNSが直接ルートDNSに参照にいけない場合設定する
    //              210.200.xxx.5 ;
    //              210.200.xxx.6 ;
    //        };

    };




     (/etc/bind/named.conf.local の内容)

    //
    match-clients { any; } ;
    recursion no;

    zone "example.co.jp" {
            type master;
            allow-query { any; };
            file "db.example.co.jp";
    };

    zone "16.yyy.xxx.202.in-addr.arpa" {
            type master;
            allow-query { any; };
             file "db.202.xxx.yyy";
    };


    (/var/cache/bind/db.example.co.jpの内容)

    $TTL    3600
    @       IN      soa     ns.example.co.jp. root.example.co.jp. (
                            2009030900      ; Serial
                            3H              ; Refresh(3 hour)
                            15M             ; Retry(15 minutes)
                            1W              ; Expire(1 week)
                            3600 )          ; Negative Cache TTL(1 hour)
    ;
    @                             IN      NS        ns.example.co.jp.
    @                             IN      MX 10   mx.example.co.jp.
    *.example.co.jp.        IN      MX 10   mx.example.co.jp.

    ;
    ns              IN A            202.xxx.yyy.2
    mx             IN A            202.xxx.yyy.5
    fw              IN A            202.xxx.yyy.14

     


    (/var/cache/bind/db.202.xxx.yyyの内容)

    $TTL    3600
    @       IN      soa     ns.example.co.jp. root.example.co.jp. (
                            2009030900      ; Serial
                            3H              ; Refresh(3 hour)
                            15M             ; Retry(15 minutes)
                            1W              ; Expire(1 week)
                            3600 )          ; Negative Cache TTL(1 hour)
    ;
    @                             IN      NS        ns.example.co.jp.

    ;
    2                IN PTR        ns.example.co.jp.
    5                IN PTR        mx.example.co.jp.
    ;
    14              IN PTR        fw.example.co.jp. # FW経由のアクセスで相手側サーバがアドレスチェックを実施している可能性あるので、FWのアドレスを定義しておく。


     

4-3. Windows 2000/2003の場合

  1. BINDのインストール方法
    ISC(Internet Systems Consortium, Inc.)のダウンロードサイトか ら入手したzip形式のファイルを解凍してください。 解凍すると 「BINDInstall.exe」という実行ファイルがあるのでこれを実行します。 実行すると、bindをインストールするディレクトリ(デフォル ト: c:\windows\system32\dns)と、実行時のアカウント(デフォルト:named)とそのパスワードを求めてきます。 ユーザアカウン トはセキュリティの為に管理者権限以外のアカウント使う必要があるのでそのまま"named"としてパスワードを指定します。 ここでnamedのアカウ ントがWindowsに登録されていなければ指定したパスワードとともにWindowsに登録されます。
    また、セキュリティ保護のためにファイルへのアクセス権が必要なのでBINDをインストールするファイルシステムはNTFSとなっている必要があります。

  2. BINDで利用する設定ファイル
    Windows版のBINDをインストールしても、各種の設定ファイルは自動的に構成されません。 このため、1からファイル作成する必要がありますが、 記述方法自体はLinuxと変わりありません。 また、基本の設定ファイルであるnamed.confのファイル名が決まっているだけなので、それ以外の ファイル名についてはLinuxなどと合わせておくと混乱が少ないと思います。(なお、ファイルの内容について同じような記述が複数のファイルにあります が、間違いではありません)
    目的 保存場所 従来の場所
    BINDの動作に関する基本の設定ファイル c:\windows\system32\etc\named.conf
    DNSのゾーン定義ファイルの保存場所 c:\windows\system32\etc\*
      ルートキャッシュファイル named.root.txt
    ローカルゾーン設定ファイル named.rfc1912.zones.txt
    「localdomain」ゾーン定義ファイル localdomain.zone.txt
    「localhost」正引き定義ファイル localhost.zone.txt
    「localhost」逆引き定義ファイル named.local.txt
    「localhost」ipv6逆引き定義ファイル named.ip6.local.txt
    ローカルブロードキャスト定義ファイル named.broadcast.txt
    ローカルネット定義ファイル named.zero.txt
    正引きファイル db.example.co.jp
    逆引きファイル db.202.xxx.yyy
    ログファイルの場所 イベントログ

  3. ルートキャッシュファイル作成
    インターネットが利用できる環境で以下のコマンドを実行します。 このコマンドを実行することで最新のルートDNSの情報が取得できます。
    C:\> cd \Windows\system32\dns
    C:\> bin\dig @a.root-servers.net . ns > etc/named.root.txt
  4. 設定ファイルの編集

    (c:\windows\system32\etc\named.confの内容)

    //
    options
    {
            // Those options should be used carefully because they disable port
            // randomization
            // query-source    port 53;
            // query-source-v6 port 53;

            directory              "C:\Windows\system32\dns\etc"; // the default

            // dump-file            "cache_dump.db";
            // statistics-fil       "named_stats.txt";
            // memstatistics-file   "named_mem_stats.txt";

            // listen-on-v6 { any; };
            auth-nxdomain no;    # conform to RFC1035

            allow-transfer {
                  localnets ;
            };

    //        forwarders { # forwardersの設定は、DNSが直接ルートDNSに参照にいけない場合設定する
    //              210.200.xxx.5 ;
    //              210.200.xxx.6 ;
    //        };


            empty-zones-enable no;
    };

    //
    logging
    {
            channel default_debug {
                    file "named.run";
                    severity dynamic;
            };
    };

    //key ddns_key
    //{
    //      algorithm hmac-md5;
    //      secret "use /usr/sbin/dns-keygen to generate TSIG keys";
    //};

    view    "external"
    {
            match-clients           { any; };
            match-destinations      { any; };
            recursion no;

            // all views must contain the root hints zone:
            zone "." IN {
                    type hint;
                    file "named.root.txt";
           };
            include "named.rfc1912.zones.txt";

            zone "example.co.jp" {
                    type master;
                    allow-query { any; };
                    file "db.example.co.jp.txt";
            };
            zone "16.yyy.xxx.202.in-addr.arpa" {
                    type master;
                    allow-query { any; };
                    file "db.202.xxx.yyy.txt";
            };
    };


    (C:\Windows\system32\dns\etc\named.rfc1912.zones.txt の内容)
    // named.rfc1912.zones:
    //
    // ISC BIND named zone configuration for zones recommended by
    // RFC 1912 section 4.1 : localhost TLDs and address zones
    //
    zone "localdomain" IN {
            type master;
            file "localdomain.zone.txt";
            allow-update { none; };
    };

    zone "localhost" IN {
            type master;
            file "localhost.zone.txt";
            allow-update { none; };
    };

    zone "0.0.127.in-addr.arpa" IN {
            type master;
            file "named.local.txt";
            allow-update { none; };
    };

    zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
            type master;
            file "named.ip6.local.txt";
            allow-update { none; };
    };

    zone "255.in-addr.arpa" IN {
            type master;
            file "named.broadcast.txt";
            allow-update { none; };
    };

    zone "0.in-addr.arpa" IN {
            type master;
            file "named.zero.txt";
            allow-update { none; };
    };


    (C:\Windows\system32\dns\etc\localdomain.zone.txt の内容)
    $TTL    86400
    @               IN SOA  localhost root (
                                            42              ; serial (d. adams)
                                            3H              ; refresh
                                            15M             ; retry
                                            1W              ; expiry
                                            1D )            ; minimum
                    IN NS           localhost
    localhost       IN A            127.0.0.1


    (C:\Windows\system32\dns\etc\localhost.zone.txt の内容)
    $TTL    86400
    @               IN SOA  @       root (
                                            42              ; serial (d. adams)
                                            3H              ; refresh
                                            15M             ; retry
                                            1W              ; expiry
                                            1D )            ; minimum

                    IN NS           @
                    IN A            127.0.0.1
                    IN AAAA         ::1


    (C:\Windows\system32\dns\etc\named.local.txt の内容)
    $TTL    86400
    @       IN      SOA     localhost. root.localhost.  (
                                          1997022700 ; Serial
                                          28800      ; Refresh
                                          14400      ; Retry
                                          3600000    ; Expire
                                          86400 )    ; Minimum
            IN      NS      localhost.
    1       IN      PTR     localhost.


    (C:\Windows\system32\dns\etc\named.ip6.local.txt の内容)
    $TTL    86400
    @       IN      SOA     localhost. root.localhost.  (
                                          1997022700 ; Serial
                                          28800      ; Refresh
                                          14400      ; Retry
                                          3600000    ; Expire
                                          86400 )    ; Minimum
           IN      NS      localhost.
    1      IN      PTR     localhost.


    (C:\Windows\system32\dns\etc\named.broadcast.txt の内容)
    $TTL    86400
    @               IN SOA  localhost.      root.localhost. (
                                            42              ; serial (d. adams)
                                            3H              ; refresh
                                            15M             ; retry
                                            1W              ; expiry
                                            1D )            ; minimum
            IN      NS      localhost.


    (C:\Windows\system32\dns\etc\named.zero.txt の内容)
    $TTL    86400
    @               IN SOA  localhost.      root.localhost. (
                                            42              ; serial (d. adams)
                                            3H              ; refresh
                                            15M             ; retry
                                            1W              ; expiry
                                            1D )            ; minimum
            IN      NS      localhost.


    (/var/named/chroot/var/named/db.example.co.jp.txt の内容)

    $TTL    3600
    @       IN      soa     ns.example.co.jp. root.example.co.jp. (
                            2009030900      ; Serial
                            3H              ; Refresh(3 hour)
                            15M             ; Retry(15 minutes)
                            1W              ; Expire(1 week)
                            3600 )          ; Negative Cache TTL(1 hour)
    ;
    @                             IN      NS        ns.example.co.jp.
    @                             IN      MX 10   mx.example.co.jp.
    *.example.co.jp.        IN      MX 10   mx.example.co.jp.

    ;
    ns              IN A            202.xxx.yyy.2
    mx             IN A            202.xxx.yyy.5
    fw              IN A            202.xxx.yyy.5

    ;


    (/var/named/chroot/var/named/db.202.xxx.yyy.txt の内容)

    $TTL    3600
    @       IN      soa     ns.example.co.jp. root.example.co.jp. (
                            2009030900      ; Serial
                            3H              ; Refresh(3 hour)
                            15M             ; Retry(15 minutes)
                            1W              ; Expire(1 week)
                            3600 )          ; Negative Cache TTL(1 hour)
    ;
    @                             IN      NS        ns.example.co.jp.

    ;
    2                IN PTR        ns.example.co.jp.
    5                IN PTR        mx.example.co.jp.
    14              IN PTR        fw.example.co.jp. # FW経由のアクセスで相手側サーバがアドレスチェックを実施している可能性あるので、FWのアドレスを定義しておく。

    ;



【MS-DNSの外部ドメイン名/内部ドメイン名】

MSの資料などを読むと、DNSの設計で外部(公開用)DNSと内部(組織内)DNSでドメインを違う名前として構成する資料を良く目にします。(例: (外部) example.co.jp,  (内部) example.local )
しかし、このようなドメイン設計は個人的には違和感を感じます。 本来ドメイン名は組織単位や地域を表現するもので外部であろうと内部であれと同じ組織や地域なら単一のドメイン名とした方が論理的だというのが個人的な思いです。 
上記のような場合、本来はすべて「example.co.jp」として設計するのが正しいと思うのですが如何でしょうか?
どうしても外部と内部のドメイン名を分けるなら、外部を「example.co.jp または public.example.co.jp」、内部を「ad-domain.example.co.jp」というよな感じで設計するのがすっきりすると思うのですが。。。 
それとも、MSの資料のような設計の方が論理的なのでしょうか? なんとなく、MSの方法はMS独自の実装による問題を回避するための苦肉の策のような気がしてなりません。
もちろん、技術的な整合性のためにMSの方法をつかう事は否定はしませんけど、なんとなくすっきりしないという個人的な感情ですけどね。


< Top / Next >


Copyright© 1998-2011 ROBATA.ORG