DNS(BIND)の設定(外向き)


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

おやじは、今までごく一般的な動的なグローバルIPアドレスのサービスを使用してサーバを建てており、ZIONさんのDDNSを使わせてもらってインターネットに当サイトを公開しています。この環境では、インターネットの世界の名前解決は、ZIONさんのDNSに依存することになりますので、家庭内だけのDNSをこちらで動かしていました。
今回、Asahinetの固定IPサービスにも追加加入し、独自ドメインを取得したので、外向きにDNSを動かすことにしました。当初は、自宅サーバなので、回線やサーバが落ちたらどうせアクセスできないのだからセカンダリは不要と考えました。しかし、よく考えると障害時にネガティブキャッシュに落ちてしまう可能性があり、そのため障害が復旧してもすぐにはアクセスできない事態が考えられるので、zoneeditにセカンダリを登録することにしました。
以下は、おやじ宅のネットワーク構成での設定です。

■DNS(BIND)の設定

内向きDNSが既に動作しているなら、外向きのDNSを動かすための設定はそう多くはありません。以下に順を追って説明します。
前提条件は、以下のとおりとします。

◆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 {
    channel default-log {
        file "/var/log/named/named.log" versions 5 size 1m;
        severity info;
        print-time yes;
        print-category yes;
    }; 

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

// 内向きDNSの設定
view "lan" {
    match-clients {
        localnet;
    };

    // ルートのゾーン設定
    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";
    };

    // example.comの正引きのゾーン設定
    zone "example.com" IN {
        type master;
        file "example.com.local";
    };
};

// 外向きDNSの設定
view "wan" {
    match-clients {
        any;
    };
    recursion no;                             // 再帰的検索の禁止
        
    // example.comの正引きのゾーン設定
    zone "example.com" IN {
        type master;
        file "example.com.zone";
        allow-transfer { yyy.yyy.yyy.yyy; };  // セカンダリDNSのIPアドレスを記述(セカンダリDNSのみに転送)
        allow-query { any; };                 // 問合せは全て可
        notify yes;                           // このzone設定に変化があったらnsで定義された
}; // dnsにnotify通知。 };
  1. directoryは、デフォルトのまま。ここで指定したディレクトリに、各zoneファイルを置く。

  2. acl(名前:localnetは任意)で、家庭内とローカルホストのアドレスを定義。

  3. optionsのallow-query・allow-trasferで、デフォルトでは設定情報を外部に出さないように設定。
    外向きの情報は、外向きゾーン設定のところで開放。(optionsでの設定より優先される)

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

  5. ログ関係は、/var/log/named配下にnamed.logという名前で作成。(ディレクトリはどこでもいいが、あらかじめ作成しておきオーナをnamedにしておくこと。)

    # cd /var/log
    # mkdir named
    # chown named:named named

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

  6. view "lan"/view "wan"で、内向きと外向きを分離して設定する。「lan」/「wan」という名称は何でもかまわないので、自分が分かり易い名前をつければよい。但し、問い合わせを受けたとき、viewの記載順にmatch-client で定義されたアドレスとアクセス元アドレスが一致したviewの設定に基づいて返答するので、アドレスが固定できる内向きのviewを必ず先に記述すること。
    match-client は、内向きは2項で設定した「localnet」を、外向きは「any」とする。これにより、家庭内からのアクセス以外は全て外向きのviewが使用される。

  7. 外向きデータは、recursion noとして再帰的な検索を禁止する。yesとするとキャッシュデータ等も検索される。

  8. 外向きゾーンの、allow-transfer { yyy.yyy.yyy.yyy; };  では、セカンダリDNSのみにゾーン転送するよう、セカンダリDNSのIPアドレスを記述する。
    allow-query { any; }; で、 問合せは全てから許可する。これら2つは、optionsでデフォルトはlocalnetのみしか応答しないようにしているため、外部からの問い合わせ等に答えないので、ここで個別に指定する。

  9. 外向きゾーンの、notify yes; は、このzone情報に変化があったことをnsで定義されたdnsにnotify通知するためのもので、これにより、セカンダリへのzoneデータの変更が速やかに行われる。デフォルトでyesなので記述しなくても、マスタでzone設定を変更して再起動すれば、すぐにセカンダリに反映される。(serial番号の変化で見ているので、内容を変更した場合は必ずserial番号を上げることを忘れずに。)

 

◆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名となる)

◆example.com.localの設定(内向きのexample.comの正引きのゾーン)

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

          IN NS    ns1.example.com.               (5)
          IN MX    10 example.com.                (7)
@         IN A     192.168.1.101                  (8)
ns1   IN A  192.168.1.101 (9)
www   IN A  192.168.1.101 (9)
mail   IN A  192.168.1.101 (9)
ftp   IN A  192.168.1.101 (9)
(1) ネームサーバ名(外向きと合わせた)
(2) サーバ管理者のメールアドレス(家庭内はexample.zive.netで統一)
(3)〜(4) 前述と同一
(5) ネームサーバ名を指定(外向きと合わせた)
(7) メールエクスチェンジャの指定。(外向きと合わせた)
(8) example.comでサーバのローカルアドレスを返すための設定。
(9) 各ホスト名をAレコードで定義(CNAMEのほうが簡単であるが)

◆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)は、正引きの(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)
101       IN PTR   ns1.example.com.               (9)
(1)〜(5)は、前述と同一.
(9)は、正引きの(9)で指定したホストの逆引きデータを指定。(別名定義したものではない)

◆example.com.zoneの設定(外向きのexample.comの正引きのゾーン)

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

          IN NS    ns1.example.com.               (11)
          IN NS    nsx.zoneedit.com.              (12)
          IN MX    10 example.com.                (13)
@         IN A     xxx.xxx.xxx.xxx                (14)
ns1       IN A     xxx.xxx.xxx.xxx                (15)
www       IN A     xxx.xxx.xxx.xxx                (15)
mail      IN A     xxx.xxx.xxx.xxx                (15)
ftp       IN A     xxx.xxx.xxx.xxx                (15)
(1)〜(5)は、前述と同一.
(11) プライマリネームサーバ名を指定(レジストラに登録した自分のDNS)
(12) セカンダリネームサーバ名を指定(レジストラに登録したセカンダリDNS。とりあえずはなくても可。)
(13) メールエクスチェンジャの指定。
(14) example.comでサーバのローカルアドレスを返すための設定。
(15) 各ホスト名をAレコードで定義

■ルータ/iptablesの設定

外向きでDNSを建てた場合、ルータやiptablesの設定変更が必要になります。ゾーン転送にはUDPの53番ではなく、TCPの53番を使用してセカンダリDNSからアクセスがあります。従って、WWWサーバ等と同様に、TCPの53番をサーバにポートマッピングしてフィルタを開けてあげる必要があります。このとき、セカンダリDNSのアドレスはわかっているので、アドレス指定を併用し不必要なアクセスは遮断すべきです。なお、セカンダリDNSがゾーンデータの変更チェックを行う時は、UDPの53番を使用します。

ゾーンの転送は、以下のような時に発生します。

■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)に下記のようなメッセージが出力されているはずである。ログの内容は多少違うかもしれませんが、最低限各インタフェースで「listening」が53番ででるはずです。

    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.comで牽くとサーバのプライベートアドレスが返り(example.zive.net.zoneの(8)の設定)、WAN側のグローバルアドレスを牽くことができません。といっても、家庭内からこのドメインを牽いたときにADSLルータのWAN側アドレスが牽けても、一般的なルータではローカル側からWAN側アドレスを指定しても、ping以外は無視されるか、WWWの場合は、ルータの設定画面が表示されてしまうのでほとんど役に経ちません。(自分のグローバルアドレスをCGI等でほしいときなど、不便です。)


Top Pageへ