内向きDNS(BIND)の構築(Windows編)


おやじ宅へのアクセスは、現在は自宅DynamicDNSにより運用されています。下記は、それ以前にお世話になっていた、ZIONさんのサブドメインで運用していたときのものです。基本的には、現在も変わりありません。

Windowsサーバでも内向きDNSを動かしてみました。おやじと同じように、家庭内でもホスト名でアクセスしたかったり、プロバイダのDNSで頻繁にDNSエラーがでるため、これを少しでも回避したい(つまりキャッシュ)、将来、固定IPにしたときにはDNSを設置するのでDNSの勉強をしたい方は動かしてみるといいでしょう。
以下は、おやじ宅のネットワーク構成での設定です。家庭内だけのDNSですので、インターネットで使われているドメイン名(example.zive.net)をそのまま使用できるようにし、内向きに、example.zive.netでサーバのプライベートアドレスを返すようにしました。
今回は、rndcでBINDを制御できるようにしました。rndcやdigの使い方については、ドキュメントや他のサイトを参照ください。

[参考]
DDNS環境でのインターネット上の名前解決は、正引き(ホスト名:example.zive.net → IPアドレス)はDDNSサービスを提供しているDNSが対応しますが、逆引き(IPアドレス → ホスト名)はプロバイダのDNSが対応しますので、逆引きすると example.zive.net ではなく xxxx.hogehoge.com のようにプロバイダがADSLサービスで設定したホスト名なってしまいます。一般的には逆引きはあまり問題にはなりませんが、アクセスしてきたホストの真偽を確認するため逆引きを利用されたりすると、エラーになってしまうことがあります。

■BINDのインストール

BINDのWindows NT / Windows 2000 Binary Kit をこちらからダウンロードしてきます。おやじが使用したのはBIND9.2.2です。
インストールはいたって簡単で、ダウンロードしてきたBIND9.2.2.zipを適当なディレクトリに置き解凍します。インストールは、解凍してできた「BINDInstall.exe」をクリックして起動するだけです。インストールするTarget Directoryは、特に理由がなければデフォルトの「C:\WINNT\system32\dns」のままとしましょう。(インストールドライブは、システムがインストールされているドライブになる) なお、Optionsでインストール後にサービス起動することができますが、Windows版の場合はconfファイルが全くないので、デフォルトのまま起動しないことでインストールします。

■BINDの設定

Linuxでは、ベースとなるconfファイルがインストール時に作成されますが、Windowsの場合は全くないので、一から作成する必要があります。confファイルはインストール時に作成される、「C:\WINNT\system32\dns\etc」ディレクトリ配下に置きます。

◆事前準備

BIND9系をインストールすると、dig等のコマンドが「C:\WINNT\system32\dns\bin」配下にインストールされ使用できるので、いちいちC:\WINNT\system32\dns\binディレクトリに移動しなくてもいいように下記でPATHを通しておきます。
  1. 「スタート」->「設定」->「コントトロールパネル」でコントロールパネルを開き、「システム」を開く。
  2. 「詳細タブ」->「環境変数」で環境変数のパネルを開く。
  3. 下の「システム環境変数」の「Path」を選択し、「編集」ボタンを押す。
  4. 「変数値」の一番最後に、「;C:\WINNT\system32\dns\bin」(頭のセミコロンを忘れずに)とコマンドがあるディレクトリを追加して、「OK」を3回押してシステムを閉じる
これで、コマンドプロンプトから、ディレクトリを移動せずに「dig ・・・・」等、BINDのコマンドが扱えるようになる。

◆named.confの設定

DNSの基本的な設定は、named.confで行います。下記内容をベースにテキストエディタで編集し、named.confとして「C:\WINNT\system32\dns\etc」ディレクトリ配下に置きます。

// named.conf for example.zive.net

acl localnet {                                    // 'localnet'名でアクセス制御リストを定義
          192.168.0.0/24;                         // サーバゾーンの定義
          192.168.1.0/24;                         // おやじ宅内のゾーンの定義
          127.0.0.1;                              // ローカルホストの定義
};

options {
          directory "C:\WINNT\system32\dns\etc";  // DNSのデータベースディレクトリ
          allow-transfer { localnet; };           // 転送先制限(localnetのみ可)
          allow-query { localnet; };              // 問合せ元制限(localnetのみ可)
};

// rndcで制御可能なホストを指定(localhostのみ可)
controls {
          inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};

// 秘密鍵の読込みパスを指定
include "C:\WINNT\system32\dns\etc\rndc.key";

// ログ関係の設定
logging {
          channel default-log {
              file "C:\var\log\named.log" versions 5 size 1m;
              severity info;
              print-time yes;
              print-category yes;
        }; 

          category lame-servers { null; };
          category default { default-log; }; 
};

// ルートのゾーン設定
zone "." IN {
          type hint;
          file "named.root";
};

// 逆引きのループバックのゾーン設定
zone "0.0.127.in-addr.arpa" IN {
          type master;
          file "named.local";
};

// 正引きのおやじ宅内のゾーン設定
zone "example.zive.net" IN {
          type master;
          file "example.zive.net.zone";
};

// 逆引きのおやじ宅内のゾーン設定
zone "0.168.192.in-addr.arpa" IN {
          type master;
          file "192.168.0.rev";
};

// 逆引きのサーバのゾーン設定
zone "1.168.192.in-addr.arpa" IN {
          type master;
          file "192.168.1.rev";
};
  1. acl(名前:localnetは任意)で、家庭内とローカルホストを定義。
    optionsのallow-query・allow-trasferで、家庭内のみで使用しているドメイン名を外部に出さないように設定。
    directoryは、Windows版ではインストールディレクトリ配下に作成されるetcフォルダがデフォルト。(named.confはここに置くこと)

  2. rndc関係は、次項参照。

  3. ログ関係は、C:\var\log(ディレクトリは作成しておくこと)配下にnamed.logという名前で作成。(ディレクトリはどこでもいいが、作成しておくこと)
    versions 5 size 1mは、1Mbyteのログファイルを 5世代保存するという設定。
    severity info は、最低限のレベルのログ内容を出力する設定。ある程度詳細に採取したければ infoをnoticeに、動作検証時などで非常に詳細なログ内容を出力したければ debugにすればよい。デバッグにすると膨大なログが出力されるので、注意が必要。通常はinfoで十分である。
    print-time yes; print-category yes; でログに時間とカテゴリを出力する。
    category lame-servers { null; } で逆引きのエラーログは捨てる。(apacheで逆引きしており、非常に多くのログが出るので設定した。)

◆rndc関連の設定

BINDには、rndcというコマンドがあり、これによりローカルホスト又はリモートホストからBINDをコマンドラインで管理ができるようになります。今回は、ローカルホストのみ可能(リモートからはSSHで入ればいい)としましたが、rndcでは共有秘密鍵方式でセキュリィティを確保しているので、以下で秘密鍵の作成及び設定を行います。
  1. rndcを使用するためには、named.confファイルにcontrols ステートメントが必要。(上記参照)下記のように記述することにより、ローカルホストから rndcが接続できるようになる。<key-name> は、3項で作成するkeyステートメントファイル内の名称と合わせる必要があり、デフォルトは下記のとおり「rndc-key」である。

    controls {
              inet 127.0.0.1 allow { localhost; } keys { <key-name>; };
    };
    
    [例]
    controls {
              inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
    };

  2. named.confは、すべてが読み込めるファイルであるため、 keyステートメントを別のファイルの中に置いて、includeステートメントを使用して参照するほうが良い。keyステートメントファイルは、次項の操作で、「C:\WINNT\system32\dns\etc」ディレクトリ配下にrndc.keyという名前で作成されるので、<key-file-name>は、「rndc.key」とする。もちろん、整合性をとればどんな名前でもいいので、必要なら変更すればよい。

    include "c:\WINNT\system32\dns\etc\<key-file-name>";
    
    [例]
    include "c:\WINNT\system32\dns\etc\rndc.key";

  3. BINDに付属する以下のコマンド(rndc-confgen)を使用してHMAC-MD5鍵が書かれたkeyステートメントファイルを生成する。今回は、HMAC-MD5鍵の最大長の512bitで作成した。

    rndc-confgen -a -b <bit-length>
    
    [例]
    rndc-confgen -a -b 512
    上記により、「C:\WINNT\system32\dns\etc」ディレクトリ配下にrndc.keyという名前でkeyステートメントファイルが作成される。作成されるkeyステートメントファイルは以下のようなものであり、<key-name> は、named.confに記述したものと同じ名前であることを確認しておく。
    key "<key-name>" {
            algorithm hmac-md5;
            secret "<key-value>";
    };
    [例]
    key "rndc-key" {
            algorithm hmac-md5;
            secret "***********************************";
    };

  4. なお、上記ではrndc.keyが作成されるだけなので、下記の内容を「C:\WINNT\system32\dns\etc」ディレクトリ配下にrndc.confという名前で作成する。

    // rndc の動作の設定
    options {
            default-server  localhost;   // デフォルトサーバ指定(localhost)
            default-key     "rndc-key";  // rndcで使用するキーの指定
    };
    
    // localhost のネームサーバのキーの設定
    server localhost {
            key              "rndc-key";  // サーバアクセス時のキー指定
    };
    
    // 3項と同一内容を記述
    key "rndc-key" {
            algorithm hmac-md5;     // アルゴリズムの設定(hmac-md5のみ可)
            secret "***********************************";
    };

以上で、Bindを起動すれば、同時にrndcがポート953で起動され、ローカルホストでrndcが使用できるようになる。

◆named.rootの設定(ルートゾーン)

このファイルは、ルートゾーンを定義していますが、下記から最新版をダウンロードして、「C:\WINNT\system32\dns\etc」ディレクトリ配下に置きます。
下記のURLを右クリックして「対象をファイルに保存」でダウンロードできます。named.rootとなっているところこらダウンロードすれば大丈夫なはずですが、名前がnamed.rootでなかった場合はrenameしてください。

◆named.localの設定(逆引きのループバックゾーン)

$TTL 86400               (1)                 (2)
@         IN SOA   example.zive.net. oyaji.example.zive.net. (
                        2003072400    ; Serial    (3)
                        3H            ; refresh   (4)
                        15M           ; retry     (4)
                        1W            ; expiry    (4)
                        1H )          ; minimum   (4)
                        
          IN NS    example.zive.net.                (5)

1         IN PTR   localhost.                     (6)

(1) ネームサーバ名(ドメイン名の最後に ' . '(ピリオド)を忘れずに)
(2) サーバ管理者のメールアドレス(' @ 'を ' . 'に変えて指定。最後に ' . '(ピリオド)を忘れずに)
(3) データベースのシリアル番号。(変更するたびに必ず値を増やすこと。年月日+追番がよい)
(4) リフレッシュ・リトライ・有効・生存時間(デフォルトのまま)
(5) ネームサーバ名を指定(サーバ名の最後に ' . '(ピリオド)を忘れずに)
(6) ローカルホストの逆引きデータを指定 (このまま記述。localhost(DNSサーバ)の下1桁を記述)

◆example.zive.net.zoneの設定(正引きの家庭内ゾーン)

$TTL 86400               (1)                 (2)
@         IN SOA   example.zive.net. oyaji.example.zive.net. (
                        2003072400    ; serial    (3)
                        3H            ; refresh   (4)
                        15M           ; retry     (4)
                        1W            ; expiry    (4)
                        1H )          ; minimum   (4)

          IN NS    example.zive.net.                (5)
          IN MX    10 example.zive.net.             (7)

@         IN A     192.168.1.100                  (8)
router1   IN A     192.168.0.1                    (9)
oyaji     IN A     192.168.0.2                    (9)
rina      IN A     192.168.0.3                    (9)
akko      IN A     192.168.0.4                    (9)
printer   IN A     192.168.0.10                   (9)
router2   IN A     192.168.1.1                    (9)
pdns      IN A     192.168.1.100                  (9)
www       IN CNAME pdns                           (10)
mail      IN CNAME pdns                           (10)
ftp       IN CNAME pdns                           (10)
(1)〜(5)は、前述と同一
(1) 家庭内で使用するドメイン名(おやじは、インターネットと同じexample.zive.netを使用)を指定。(最後に ' . '(ピリオド)を忘れずに)
(7) メールエクスチェンジャの指定。(CNAMEは使用しないこと)
(8) example.zive.netでサーバのローカルアドレスを返すための設定。
(9) 各ホストの正引きデータを指定。
(10)別名定義を指定。(おやじは、サーバだけ用途毎の別名を登録した。DNSは、別名定義しないこと。言い換えれば、サーバが1台ならサーバ機はDNS名となる)

◆192.168.0.revの設定(逆引きの家庭内ゾーン)

$TTL 86400               (1)                 (2)
@         IN SOA   example.zive.net. oyaji.example.zive.net. (
                        2003072400    ; serial    (3)
                        3H            ; refresh   (4)
                        15M           ; retry     (4)
                        1W            ; expiry    (4)
                        1H )          ; minimum   (4)

          IN NS    example.zive.net.                (5)
1         IN PTR   router1.example.zive.net.        (9)
2         IN PTR   oyaji.example.zive.net.          (9)
3         IN PTR   rina.example.zive.net.           (9)
4         IN PTR   akko.example.zive.net.           (9)
10        IN PTR   printer.example.zive.net.        (9)
(1)〜(5)は、前述と同一.
(9)は、前項のexample.zive.net.zoneの(9)で指定したホストの逆引きデータを指定。(別名定義したものではない)

◆192.168.1.revの設定(逆引きのサーバゾーン)

$TTL 86400               (1)                 (2)
@         IN SOA   example.zive.net. oyaji.example.zive.net. (
                        2003072400    ; serial    (3)
                        3H            ; refresh   (4)
                        15M           ; retry     (4)
                        1W            ; expiry    (4)
                        1H )          ; minimum   (4)

          IN NS    example.zive.net.                (5)
1         IN PTR   router2.example.zive.net.        (9)
100       IN PTR   pdns.example.zive.net.           (9)
(1)〜(5)は、前述と同一.
(9)は、前項のexample.zive.net.zoneの(9)で指定したホストの逆引きデータを指定。(別名定義したものではない)

■DNSの動作確認

動作確認は、BINDを起動してdigで行いますが、起動に先立ち各設定ファイルに誤りがないか確認しておきます。但し、内容そのものの正常性は確認できず、文法的な問題がないかをテストしてくれるだけなので、後で、内容についてはそれぞれ試験する必要があります。

  1. まず、named.confファイルが正常か確認する。確認には、named-checkconfコマンドを使用するが、単にnamed-checkconfとするだけ。文法的に問題がないかチェックしてくれ、下記は、8行目で認識できないオプションがあり、それはoptionである(正解は、options)と指摘している例である。

    C:\>named-checkconf
    C:\WINNT\system32\dns\etc\named.conf:8: unknown option 'option'
  2. 続いて、named-checkzoneコマンドで各ゾーンファイルが正常か確認します。zone名とファイル名を入力してチェックします。問題がなければ、下記のようにserial番号が表示され、「OK」と表示される。全てのファイルをチェックしておく。

    C:\>cd WINNT\system32\dns\etc
    C:\WINNT\system32\dns\etc\>named-checkzone example.zive.net example.zive.net.zone
    zone example.zive.net/IN: Loaded serial 2003072400
    OK
  3. 設定ファイルでエラーがでなくなったら、BINDを起動する。

    • 「スタート」->「設定」->「コントトロールパネル」でコントロールパネルを開き、「管理ツール」を開く。
    • 「サービス」を起動し、「ISC BIND」のプロパティを右クリック(ダブルクリック)で開く。
    • 「スタートアップの種類」を「自動」にし、「サービスの状態」で「開始」ボタンを押しBINDを起動する。「OK」を押してウインドウを閉じる。

    事前に設定ファイルをテストしているので、正常に起動するはずであり、ログファイル(C:\var\log\named.log)に下記のようなメッセージが出力されているはずである。(infoの場合。debugだと一気に5KByteのログができる。)

    Jul 26 09:24:54.771 general: zone 0.0.127.in-addr.arpa/IN: loaded serial 2003072400
    Jul 26 09:24:54.781 general: zone 1.168.192.in-addr.arpa/IN: loaded serial 2003072400
    Jul 26 09:24:54.781 general: zone localhost/IN: loaded serial 2003072400
    Jul 26 09:24:54.781 general: zone example.zive.net/IN: loaded serial 2003072400
    Jul 26 09:24:54.781 general: running

    一応、netstatでnamed、rndcが起動しているか確認しておきます。TCPでの53番および953番、UDPの53番があれば大丈夫である。

    C:\>netstat-an
    
     Proto Local Address     Foreign Address  State
              :
            (snip)
              :
     TCP   127.0.0.1:53      0.0.0.0:0        LISTENING
     TCP   127.0.0.1:953     0.0.0.0:0        LISTENING
              :
            (snip)
              :
     TCP   192.168.1.100:53  0.0.0.0:0        LISTENING
              :
            (snip)
              :
     UDP   127.0.0.1:53      *:*

  4. 続いて、digで外部のドメイン、アドレスに対する正引き・逆引き、家庭内の各パソコン等の正引き・逆引きをしてチェックしてみましょう。digの使い方については、BIND9.2.2.zipを解凍したディレクトリ内にある「dig.html」や他サイトを参照してください。
    なお、example.zive.netで牽くとサーバのプライベートが返り(example.zive.net.zoneの(8)の設定)、WAN側のグローバルアドレスを牽くことができません。といっても、家庭内からこのドメインを牽いたときにADSLルータのWAN側アドレスが牽けても、一般的なルータではローカル側からWAN側アドレスを指定しても、ping以外は無視されるか、WWWの場合は、ルータの設定画面が表示されてしまうのでほとんど役に経ちません。(自分のグローバルアドレスをCGI等でほしいときなど、不便です。)

Top Pageへ