DNS(BIND)の設定


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

おやじは、ごく一般的な動的なグローバルIPアドレスのADSLサービスを使用してサーバを建てています。従って、おやじ宅には、インターネットの世界のドメイン名解決のためのDNSは設置できませんので、ZIONさんのDDNSを使わせてもらっています。言い換えれば、インターネットの世界の名前解決は動的なグローバルIPアドレス環境下ではどうしようもなく、ZIONさんのサービスしだいと言うことになります。
では、何故おやじサーバでDNSかというと、おやじの加入しているプロバイダのDNSが非常に負荷が重く、テレホタイムには頻繁にDNSエラーがでるため、これを少しでも回避したかった(つまりキャッシュ)のと、DNSの勉強をかねて家庭内だけでもDNSを動かしてみようと考えたからです。
以下は、おやじ宅のネットワーク構成での設定です。家庭内だけのDNSですので、インターネットで使われているドメイン名(example.zive.net)をそのまま使用できるようにし、内向きにexample.zive.netでサーバのプライベートアドレスを返すようにしました。

[ワンポイント]
上記のように、同じHPを異なるサーバ名でアクセスしますので、おやじは、CGIの書き方にチョット工夫をしています。(と、言うほどのこともありませんが) CGIを使わせていただくと、よく、トップページへのリンク等を http;// から記述するように記載されています。しかし、これではインターネットからと家庭内からでアクセス方法が異なるおやじのHPは、どちらか一方からは見えなくなってしまいます。従って、必ず相対表現(./xxxや ../等)で記述しています。これにより、サーバ指定の部分が異なっても同じように見ることができます。

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

■DNS(BIND)の設定

RedHat 8.0には、デフォルトでBIND9.2.1がインストールされていますので、これを使いました。なお、bindconfというBINDの設定ツールもインストールされていますが、以下、手動でconfファイルを編集、追加しますので起動しないようにしなければなりません。起動、保存すると設定が壊れますので注意が必要です。キャッシュだけならこのツールで設定できるようですが。
以下に、おやじの設定を示しますが、各位で十分検討の上、動作させるようにお願いします。また、下記は説明上の仮のアドレスで記述していますので、まかり間違ってもコピペして動作させたりしないでください。
おやじは、セキュリティ対策とマルチホーミング(2つのISPに加入)の関係で上記のようにルータのVLAN機能とポリシールーティング機能で、サーバとクライアントを異なるセグメントにしていますが、一般的には、上図のサーバがクライアントと同一のセグメント上にあるネットワーク形態と思いますので、その場合は、以下のサーバゾーンに関する記述を無視すれば良いでしょう。

◆named.confの設定

DNSの基本的な設定を、/etc/named.confで行います。

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

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

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

// rndc秘密鍵の読込みパスを指定
include "/etc/rndc.key";

// 逆引きのエラーをログらないようにするための設定
logging {
        category lame-servers { null; };
};

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

// 逆引きのループバックのゾーン設定
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は、デフォルトのまま。ここで指定したディレクトリに、各zoneファイルを置く。

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

  3. ログ関係は、デフォルトのままなら何も設定は不要だが、apacheで逆引きしており、非常に多くの「lame server ・・・・」というログが出るので、category lame-servers { null; } で逆引きのエラーログは捨てるようにした。

◆rndc関連の設定

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

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

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

    include "/etc/<key-file-name>";
    
    [例]
    include "/etc/rndc.key";

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

    # rndc-confgen -a -b <bit-length> -k <key-name>

    [例]
    # rndc-confgen -a -b 512 -k rndckey
    上記により、「/etc」ディレクトリ配下にrndc.keyという名前でkeyステートメントファイルが作成される。作成されるkeyステートメントファイルは以下のようなものであり、<key-name> は、named.confに記述したものと同じ名前であることを確認しておく。
    key "<key-name>" {
            algorithm hmac-md5;
            secret "<key-value>";
    };
    
    [例]
    key "rndckey" {
            algorithm hmac-md5;
            secret "***********************************";
    };
  4. なお、上記ではrndc.keyが作成されるだけなので、デフォルトのrndc.confにrndc.keyからキーをコピーしておく。

    /* $Id: rndc.conf,v 1.7 2001/01/09 21:40:45 bwelling Exp $ */
    
    /*
     * Sample rndc configuration file.
     */
    
    options {
            default-server  localhost;
            default-key     "rndckey";
    };
    
    server localhost {
            key     "rndckey";
    };
    
    key "rndckey" {
            algorithm       hmac-md5;
            secret "***********************************";  // rndc.keyからコピー
    };


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

◆named.caの設定(ルートゾーン: /var/named/named.ca)

このファイルはルートゾーンを定義しており、時々変更になるので、その場合はアップデートが必要になります。変更は数年に1回で、最近では2002年11月、2004年1月に変更になり、2007年11月に変更が予定されています。新しいルートヒントファイルは、以下のURLから入手できます。

変更は手動または自動でできますが、手動で変更する場合は以下のようにやればよいでしょう。

# cd /var/named
# wget -O named.ca.new ftp://ftp.internic.net/domain/named.root
# mv named.ca.new named.ca

ルートヒントファイルの変更にあたっては一般的に猶予期間が半年ほどありますが、おやじは変更漏れがないように簡単なスクリプトを書いて対応することにしました。
適当なディレクトリ(おやじは、 /usr/local/bin 配下)に、こちらのスクリプトを適当な名前で設置し、設定を適宜行い(ディレクトリとファイル名の変更は必須)実行権限を変更しておきます。

# cd /usr/local/bin
# wget http://www.aconus.com/~oyaji/dns/root.hint.check
# chmod 755 root.hint.check

後は、cronで適当なタイミングで実行すればよいだけです。/etc/crontab に下記を追記する。(下記は、毎週土曜日の1:23に実行する例である。)
# root.hintファイルの更新チェック
23 1 * * 5 root /usr/local/bin/root.hint.check

◆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)と指摘している例である。

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

    # cd /var/named
    # named-checkzone example.zive.net example.zive.net.zone
    zone example.zive.net/IN: Loaded serial 2003072400
    OK
  3. 設定ファイルでエラーがでなくなったら、下記でBINDを起動する。

    # /etc/rc.d/init.d/named start

    事前に設定ファイルをテストしているので、正常に起動するはずであり、ログファイル(/var/log/messages)に下記のようなメッセージが出力されているはずである。

    Jul 28 20:08:14 server named[1253]: starting BIND 9.2.1 -u named
    Jul 28 20:08:14 server named[1253]: using 1 CPU
    Jul 28 20:08:14 server named[1255]: loading configuration from '/etc/named.conf'
    Jul 28 20:08:14 server named[1255]: no IPv6 interfaces found
    Jul 28 20:08:14 server named[1255]: listening on IPv4 interface lo, 127.0.0.1#53
    Jul 28 20:08:14 server named[1255]: listening on IPv4 interface eth0, 192.168.1.100#53
    Jul 28 20:08:14 server named[1255]: command channel listening on 127.0.0.1#953
    Jul 28 20:08:14 server named[1255]: zone 0.0.127.in-addr.arpa/IN: loaded serial 2003072400
    Jul 28 20:08:14 server named[1255]: zone 0.168.192.in-addr.arpa/IN: loaded serial 2003072400
    Jul 28 20:08:14 server named[1255]: zone 1.168.192.in-addr.arpa/IN: loaded serial 2003072400
    Jul 28 20:08:14 server named[1255]: zone localhost/IN: loaded serial 2003072400
    Jul 28 20:08:14 server named[1255]: zone example.zive.net/IN: loaded serial 2003072400
    Jul 28 20:08:14 server named[1255]: running
    Jul 26 09:24:54.771 general: zone 0.0.127.in-addr.arpa/IN: loaded serial

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

    # netstat -ln
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
           :
         (snip)
           :
    tcp        0      0 192.168.1.100:53        0.0.0.0:*               LISTEN
    tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
           :
         (snip)
           :
    tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN
           :
         (snip)
           :
    udp        0      0 192.168.1.100:53        0.0.0.0:*
    udp        0      0 127.0.0.1:53            0.0.0.0:*

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

Top Pageへ