Login

オンライン中

We have 13 guests and no members online

eagle1jp

DNSサーバ(bind)の構築

以下では、インターネット上へ公開するDNSサーバの公開までの一般的な手順を示します。

1.DNSの公開までの手順 (インターネットにDNSを公開する場合の手順)

  • プロパイダとの契約
    はじめに、当たり前ですがインターネットプロパイダと契約して ください。 このとき、プロパイダに固定IPを複数利用できる契約を行ってください。(IP8とかIP16とかの契約)
    固 定IPの数が1個または0でも構築する方法が無い訳ではありませんが手間がかかるのと正しい動作のDNSの構築ができないので、ある程度の規模の組織であ ればIP8以上で契約した方が良いでしょう。 取得した固定IPのうちの1つをDNSサーバ用のIPアドレスとして使います。
  •  NIC(Network Infomation Center)へDNSサーバ情報の登録
    DNSサーバの構築が完了したなら、DNSを上位のDNSサーバに登録する申請を行います。申請の際に利用したいドメイン名とマスタとなるDNSサーバの IPアドレス(上記で決定したアドレス)で申し込みを行います。 なおNICへの登録はプロパイダが代行してくれるので、詳しい申請方法はプロパイダに相 談すると良いでしょう。
    (プロパイダを使わずに「お名前.com」のようなレジストラに直接申し込む方法でも可能です)
  •  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.)のダウンロードサイトから入手すれば良いでしょう。 インストールおよび設定手順は後ほど詳しく説明します。

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

以下ではBINDのインストール手順および設定手順を詳しく説明します。 なお、説明にあたり構成するDNSの条件として次のような例として説明を行うものとします。
なお、BINDのインストールにはディストリビューションが用意してあるパッケージを使う方法と、ソースファイルをコンパイルしてインストールを行う方法がありますが、メンテナンスや運用が楽なパッケージによる方法を以下では説明します。
最新のソースを常に追っていけるのであればソースファイルをコンパイルする方法もありかも知れませんが、通常の運用者には少し運用がきついのでパッケージの利用をお勧めします。

 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(NIC)のIPアドレス 210.200.zzz.11
 DNSに登録する自社のメールサーバのサーバ名 mx.example.co.jp
 メールサーバのIPアドレス
 202.xxx.yyy.5

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


【Redhat ES5(CentOS 5)の場合

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

  • 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/*
 ログファイルの場所 /var/log/messages /var/log/messages
 
  • 設定ファイルの編集
    (/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 ;
              202.200.zzz.11 ;
        };

        // forwarders {
        //      202.200.zzz.11;
        // };
};

//
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

;

 

(/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.

;

 

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

【Debian 4(Ubuntu 8)の場合

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

  • 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/* ー
 ログファイルの場所 /var/log/syslog ー

  • 設定ファイルの編集
    (/etc/bind/named.conf の内容)

//
include "/etc/bind/named.conf.options";

// prime the server with knowledge of the root servers
zone "." {
        type hint;
        file "/etc/bind/db.root";
};

// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

include "/etc/bind/named.conf.local";

 

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

options {
        directory "/var/cache/bind";

        auth-nxdomain no;    # conform to RFC1035

        allow-query { any; };
        allow-transfer {
                localnet ;
                210.200.zzz.11 ;
        };
//        forwarders {
//                210.200.zzz.11 ;
//        };
};



 

(/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

;

 

 

(/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.

;

 


【Windows2000/2003の場合

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

  • 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
 ログファイルの場所 イベントログ

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

        // forwarders {
        //      202.200.zzz.11;
        // };      
        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           { !localnets; !localhost; };
//      match-destinations      { !localnets; !localhost; };
        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

;

 

(/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.

;

 

DNSサーバ

インターネットのコア技術の1つにDNS(Domain Name System)があります。 インターネット利用者は例えばメールであれば、"name@ドメイン名"といったアドレスによって簡単にメールのやりとりができていると思いますが、ここで使われている『ドメイン名』こそが、インターネットの可能性を広げてくれた基礎技術と云えます。 本章ではDNSサーバソフトの BIND(Berkeley Internet Name Domain)というソフトを使ったDNSサーバの構築について述べます。  

1.DNSの動作の仕組み

DNSの出現以前から、すでに米国内を中心にインターネットは出現していました。(勿論、今のような高速で使いやすいネットワークではありませんでしたが..) このネットワークに使うIPアドレスは現在のようにドメイン名を使うものではなく、ホスト名とIPアドレスと対応させた hosts ファイルというテキストファイルにすべて記述していくといったものでした。 ホスト名は単に「mail-server」「ftp-server」といったようなワードでしかなく、これは例えば大学内だけといったような小さなエリア内だけのネットワークワークであればさほどは問題がありませんでしたが、ネットワークの規模が大きくなるにつれて、同じ名前が別の組織で使われていたりすると hosts ファイルの維持が難しくなっていくのは容易に想像できるかと思います。 
勿論、それでも当初は hosts ファイルを集中的に管理する組織が一元管理するようにするなどして、なんとかやりくりしていましたが、そのうち人為的なミスやますます広がるネットワークに耐えられないことは自明でした。
そのような中で DNSは「ゾーン概念の導入による分散管理」「階層構造によるデータ管理の委任」という概念を取り入れることで、 hosts ファイルではない方法によるIPアドレスの管理を実現させたのです。 DNSの概念はそれ程難しいものでは無く、

  • DNSのトップレベル(ルートという)を管理するトップレベルDNSのトップレベルサーバを構築する。 これはルートを表す記号であるドット(.)で表現する。
  • ルートのDNSは一階層下(ゾーンという)のレベルのドメイン名を管理するDNSサーバを知っている。 例えばルートサーバは”jp"のゾーンを管理しているDNSサーバのIPアドレスを知ってる。
  • 一階層下のレベルのDNSは自分より一つ下の階層のDNSサーバ(’例えば "co.jp.")を知っている。 以後、その下の階層のDNSは常に自分より1つ下の階層にあるDNSサーバのアドレスを知っている。というルールで構築される。
というように常にルートのDNSサーバから辿ればどの階層のDNSサーバの存在であっても求めることができるようになっています。
これによって、例えば"robata.org"を管理するDNSサーバを知りたいなら ".", "org", "robata"の順でそれぞれの階層の管理するDNAサーバを見つけ出す事ができるようになっています。 また、これによってゾーンが違っていれば同じホスト名が使われても構わないようになりました。
こうすることで、最終的に"robata.org."のDNSサーバにたどり着くことでそこに登録されている"www.robata.org"や"ms.robata.org"といった名前に対応したIPアドレスを知ることが出来る訳です。 DNSのルートサーバは全世界の13カ所(A~Mサーバ)に点在しており、それぞれの箇所で冗長化された構成とすることで大量のDNSリクエストに応えられるように構成されています。 

 DNSの仕組み

(実は上図は少し説明をはしょってます。 実際にはクライアントPCから直接ルートDNSに検索する訳ではなくクライアントPCで設定されているDNSサーバを経由して検索が行われます)

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

MSの資料などを読むと、DNSの設計で外部(公開用)DNSと内部(組織内)DNSでドメインを違う名前として構成する資料を良く目にします。(例: (外部) example.co.jp, (内部) example.local )
しかし、このようなドメイン設計は個人的には違和感を感じます。 本来ドメイン名は組織単位や地域を表現するもので外部であろうと内部であれと同じ組織や地域なら単一のドメイン名であるべきだと云うのが個人的な思いです。 上記のような場合、本来はすべて「example.co.jp」として設計するのが正しいと思うのですが如何でしょうか?
どうしても外部と内部のドメイン名を分けるなら、外部を「public.example.co.jp」, 内部を「local.example.co.jp」というよな感じで設計するのがすっきりすると思うのですが。。。 それとも、MSの資料のような設計の方が論理的なのでしょうか?

 > 【DNSサーバの構築に続く】

 

セキュリティ情報

JVN サイト新着ならびに更新情報

広告