bind9 設定

$Id: bind9.html,v 1.14 2009/01/28 07:33:00 candy Exp candy $
このページの内容は無保証です。
bind9 で DNS サーバを構築する。 OS は FreeBSD 6.0〜7.1 あたりを想定している。

最新トピック


  1. bind9 のインストール
  2. bind9 の基本設定
  3. bind9 で外向けと内向けの DNS を設定
  4. bind9 で dynamic update DNS を設定
  5. FAQ
    1. Can't find server name for address?
    2. rndc: connect failed: connection refused?
    3. RRset already exists?
    4. ログの時刻がずれてますが?
    5. bind9 が遅いみたいですが?
    6. too many timeouts, disabling EDNS0?
    7. bind9 のマニュアルはないの?
    8. dhcpd: clock skew too great?
    9. 再帰検索を禁止したいのですが?
    10. './NS/IN' て? 新種 DDoS 攻撃って??
    11. 何やら連続的に大量にクエリーが来ます!!

  1. bind9 のインストール

    インストールはソースを展開して、
    	# tar xzf bind-9.3.0.tar.gz
    	# cd bind-9.3.0
    	# CFLAGS='-O -pipe' ./configure --enable-ipv6
    	注意:IPv6 で外と繋がっていないなら必ず
    	--disable-ipv6 すること (2004.10.08 追記)
    	# make
    	# make install
    	# make clean
    
    これで /usr/local/sbin/named 等ができる。

    IPv6 で繋がっていない場合の注意

    IPv6 でインターネットに繋がっていない場合は、必ず --disable-ipv6 すること。 そうでないと jp ドメインの名前解決が遅くなってしまう。 正確には
    1. IPv6 による query 機能が enable されている。 (見分け方: config.h に `#define WANT_IPV6 1' があれば enable)
    2. IPv6 address を持つネットワークインタフェースがある。 (loopback (::1) や link local (fe80:) も含む。)
    3. IPv6 でインターネットに繋がらない。
    という条件が揃っている場合に、 AAAA レコードを持つネームサーバに問い合わせると、 解決に非常に時間がかかってしまう(2 秒〜8秒)。

    JP ドメインのネームサーバは 2004.07.21 から IPv6に完全対応 し、AAAA レコードを持っている。 そのため JP ドメインの名前解決が遅くなるのだ。

    特に FreeBSD の場合、デフォルトで 1 〜 2 が真になってしまうので、要注意。

    NS が AAAA を持っている場合、 --enable-ipv6 な bind9 はまず IPv6 UDP で query を出し、 それがタイムアウトしてから IPv4 で query を出す。 IPv6 で外部と繋がっていない場合、 IPv6 による send(2) は EHOSTUNREACH ですぐエラーになるのだが、 どうやら bind9 はそれを見ていないっぽい。


  2. bind9 の基本設定

    まずは単なるキャッシュサーバを設定する。 これが動けば、あとはゾーンの設定を追加するだけなのだ。
    1. ユーザ

      DNS サーバデーモン named(8) はユーザ "bind" の権限で動かすので、 bind というユーザを作っておくこと。 同様に bind というグループも作っておく。 FreeBSD は最初から入っている。
      	# grep bind /etc/group /etc/passwd 
      	/etc/group:bind:*:53:
      	/etc/passwd:bind:*:53:53:Bind Sandbox:/:/sbin/nologin
      
    2. レイアウト

      設定ファイルのデフォルトは /etc/namedb/named.conf だが、 /etc は OS のバージョンアップで上書きされたりするので、 極力いじりたくない。 よって設定ファイルは /usr/local/etc/namedb/ に置く。 またせっかく chroot(2) 機能があるので、chroot 環境で動かす。 chroot しない設定も併記した。 chroot する・しないは管理者の判断だ。 chroot した方がセキュリティ的に安全ではある。
      • ワークディレクトリと、その下に、 書き込み用ディレクトリ s とキーディレクトリ key と dev/random を作る。
        	# mkdir -p /usr/local/etc/namedb
        	# cd /usr/local/etc/namedb
        	# mkdir s; chown bind:bind s; chmod 755 s
        	# mkdir key
        	以下は chroot 環境でのみ必要になる。
        	# grep -w random /dev/MAKEDEV  # random デバイスファイルの作り方を確認。
        		mknod random    c 2 3;                  chmod 644 random
        	上記のコマンドを dev ディレクトリ下で実行する。	
        	# mkdir dev; (cd dev; mknod random c 2 3; chmod 644 random)
        	タイムゾーン情報をコピーする。
        	# mkdir etc; cp /etc/localtime etc/
        
        chroot するためには、 OS によってはダイナミックリンクライブラリ等が必要になるかも。
    3. 基本ゾーンファイル

      root server のリスト named.root と、 localhost の逆引きゾーンファイルをコピーする。
      	# cd /etc/namedb
      	# sh make-localhost  # localhost-v6.rev と localhost.rev ができる。
      	# cp -p named.root localhost-v6.rev localhost.rev /usr/local/etc/namedb
      	# cd /usr/local/etc/namedb
      
    4. rndc.key の作成

      古い bind で使っていた named.reload や named.restart コマンドは、それぞれ
      	# /usr/local/sbin/rndc reload
      	# /usr/local/sbin/rndc restart
      
      で置き換えられた。 named と rndc は、秘密キーを共有することでアクセス制限を行う。 (因みに rndc と named はネットワーク経由で通信するので、 キー(とアクセス制限)さえ合っていれば、 どのホストからでも rndc による制御が可能だ。)
      1. まず制御用秘密キーを作成する。
        	# (cd key; /usr/local/sbin/dnssec-keygen -a HMAC-MD5 -b 512 -n USER RNDC)
        	# ls -l key
        	-rw-------  1 root  wheel  111 Aug 21 16:06:42 2002 Krndc.+157+29591.key
        	-rw-------  1 root  wheel  145 Aug 21 16:06:42 2002 Krndc.+157+29591.private
        
        
        dnssec-keygen は /dev/random を読むのだけど、 FreeBSD 4 だと待ちに入っちゃったりするんで、 キーを叩いたり、別のプロセスで /dev/random を読んだりしてあげる。 もしくは
        	# for i in `jot 15`; do rndcontrol -s $i; done
        
        のように割込みを設定してあげる。
      2. 作成したキーから rndc.key を作り、 オーナ bind だけ読めるようにしておく。
        	# touch rndc.key; chown bind:bind rndc.key; chmod 600 rndc.key
        	# sed -n 's/Key: \(.*\)/secret "\1";/p' key/Krndc.*.private > rndc.key
        	# vi rndc.key # secret 以外の行を編集する。
        	key RNDC {
        		algorithm "HMAC-MD5";
        		secret "EpVhLs1ObitpLQEL6gbKCb+b7B7V+sdlJa4l7PWD08OaU/xqeAKdesPgIoU6H9OcCQIXtocIdfP7ISQpXH8Lmg==";
        	};
        
        なお、rndd.key を作ってしまえば、key/Krndc.* は削除しても構わない。
    5. named.conf の作成

      named.conf を作る。 オーナは root でも bind でもよい。 (bind にしといても、ci(1) co(1) すると root になっちゃうし)
      # named.conf
      options {
      	# ワークディレクトリ。
      	# chroot 環境なので "/" は /usr/local/etc/namedb のこと。
      	# chroot しないなら、"/usr/local/etc/namedb" とする。
      	directory "/";
      	# directory "/usr/local/etc/namedb";
      	pid-file "s/named.pid"; # ワークディレクトリからの相対パス
      	# listne-on { 127.0.0.1; 10.0.0.1; }; # マルチホームで listen するアドレスを制限したい時
              listen-on-v6 { any; }; # IPv6 での query を受け付ける。
      	# 自分からだけ再帰検索を許可する (外向け専用の場合)
      	# allow-recursion { 127.0.0.1; ::1; };
      	# version "BIND 0.8088"; # バージョン番号を変えることもできる。
      };
      
      # 秘密キーを読む。
      # ワークディレクトリからの相対パス
      include "rndc.key";
      
      # rndc で制御可能なホストを設定する。
      # localhost (127.0.0.1 または ::1) のみ許可。
      controls {
      	inet 127.0.0.1 allow { 127.0.0.1; } keys { RNDC; };
      	inet ::1 allow { ::1; } keys { RNDC; };
      };
      
      # lame-server のログは取らない。(これは私の趣味)
      logging {
      	category lame-servers { null; };
      };
      
      # root サーバのリスト
      zone "." {
      	type hint;
      	file "named.root";
      };
      # 127.0.0.? の逆引き
      zone "0.0.127.in-addr.arpa" {
      	type master;
      	file "localhost.rev";
      };
      # ::1 の逆引き
      zone "1.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.int" {
      	type master;
      	file "localhost-v6.rev";
      };
      
    6. rndc.conf の作成

      rndc の設定ファイル
      # rndc.conf
      include "/usr/local/etc/namedb/rndc.key";
      
      options {
      	default-server 127.0.0.1; # または ::1 または localhost
      	default-key RNDC;
      };
      
      
    7. 動作確認

      以上で設定は終り。ここまでの内容は、↓こんな感じ。
      # ls -lFTR
      drwxr-xr-x  2 root   wheel   512 Aug 20 15:08:15 2002 dev/
      drwx------  2 root   wheel   512 Aug 20 14:57:24 2002 key/
      -rw-r--r--  1 root   wheel   451 Aug 21 08:49:54 2002 localhost-v6.rev
      -rw-r--r--  1 root   wheel   447 Aug 21 08:49:54 2002 localhost.rev
      -rw-r--r--  1 root   wheel  1265 Aug 21 09:37:39 2002 named.conf
      -rw-r--r--  1 root   wheel  2843 Sep 19 02:30:49 2001 named.root
      -rw-r--r--  1 root   wheel   118 Aug 20 15:06:33 2002 rndc.conf
      -rw-------  1 bind   bind    141 Aug 20 15:03:43 2002 rndc.key
      drwxr-xr-x  2 bind   bind    512 Aug 21 09:37:40 2002 s/
      
      ./dev:
      crw-r--r--  1 root  wheel    2,   3 Aug 20 15:08:15 2002 random
      
      ./key:
      
      ./s:
      
      動作確認の詳細はこちら
    8. /etc/rc.conf 変更

      named_program="/usr/local/sbin/named"
      named_flags="-u bind -t /usr/local/etc/namedb -c /named.conf" # chroot する場合
      named_flags="-u bind -c /usr/local/etc/namedb/named.conf" # chroot しない場合
      
    9. /etc/resolv.conf 変更

      domain example.com
      dnsserver 127.0.0.1
      

  3. bind9 で外向けと内向けの DNS を設定

    外向けの DNS と内向けの DNS を一台のサーバで運用する。 bind8 では named を二つ起動して、 listen-on で振り分けるという方法で実現していたが、 bind9 では view の導入により、一つのプロセスで実現できるようになった。 これで管理がどんなに楽になるかは、 二つの named で運用している人にはよくわかるだろう。
    1. example.com ドメインの構成

      example.com は、 FreeBSD box 1 台でルータ(NAT)と DNS サーバと WWW サーバとメールサーバを運用している。 グローバル IP アドレスは 10.0.0.1/28 で、 プライベートアドレスは 192.168.0.1/24 を使っている。
      The Internet
             |
        (10.0.0.1)
       ns.example.com
       (192.168.0.1)
             |
         o---+----- ...
      
    2. ゾーンファイル

      ゾーンファイルは今まで同様外向けと内向けの 2 つが必要だ。
      • 外向け

        ●外向け正引き -- ファイル名 example.com
        ; example.com
        $TTL	3600
        @	IN	SOA	ns.example.com. root.ns.example.com.  (
        		1	; Serial
        		3600	; Refresh
        		900	; Retry
        		3600000	; Expire
        		3600 )	; Minimum
        	IN	NS	ns.example.com.
        	IN	NS	ns2.example.com. ; セカンダリ
        	IN	MX	10	mail.example.com.
        localhost	IN	A	127.0.0.1
        ns	IN	A	10.0.0.1
        ns2	IN	A	172.16.0.1 ; セカンダリは他のサイトかも
        mail	IN	A	10.0.0.1
        www	IN	A	10.0.0.1
        
        ●外向け逆引き -- ファイル名 0.0.0.10.in-addr.arpa
        クラス C 以下の逆引きの場合、ドメイン名は ISP によってまちまちだ。 OCN だとネットワークアドレスをひっくり返してドメイン名にする。 DION も OCN 同様だが、最初の要素に "h" をつける。 例えば 1.0.0.10.in-addr.arpa は
        • OCN だと CNAME で 1.0.0.0.10.in-addr.arpa を指す。
        • DION だと CNAME で 1.0h.0.0.10.in-addr.arpa を指す。
        ここでは OCN 方式を仮定する。
        ; 0.0.0.10.in-addr.arpa
        $TTL	3600
        @	IN	SOA	ns.example.com. root.ns.example.com.  (
        		1	; Serial
        		3600	; Refresh
        		900	; Retry
        		3600000	; Expire
        		3600 )	; Minimum
        	IN	NS	ns.example.com.
        	IN	NS	ns2.example.com.
        1	IN	PTR	ns.example.com.
        
        
      • 内向け

        ●内向け正引き -- ファイル名 example.com-priv
        ; example.com-priv
        $TTL	3600
        @	IN	SOA	ns.example.com. root.ns.example.com.  (
        		1	; Serial
        		3600	; Refresh
        		900	; Retry
        		3600000	; Expire
        		3600 )	; Minimum
        	IN	NS	ns.example.com.
        	IN	MX	10	mail.example.com.
        localhost	IN	A	127.0.0.1
        ns	IN	A	192.168.0.1
        mail	IN	A	192.168.0.1
        www	IN	A	192.168.0.1
        
        ●内向け逆引き -- ファイル名 0.168.192.in-addr.arpa
        ; 0.168.192.in-addr.arpa
        $TTL	3600
        @	IN	SOA	ns.example.com. root.ns.example.com.  (
        		1	; Serial
        		3600	; Refresh
        		900	; Retry
        		3600000	; Expire
        		3600 )	; Minimum
        	IN	NS	ns.example.com.
        1	IN	PTR	ns.example.com.
        
    3. named.conf の設定

      まず基本の設定はきちんと押えておくこと。 ここでの設定も logging までは同じ。

      view "internal" と view "external" を定義するが、 必ず "internal" を先に記述すること。 named は問い合わせを受け取ると、 各 view をそれが定義された順に検索し、 それぞれの match-client と比較し、 最初に適合した view の内容を使って返答する。

      # named.conf
      options {
      	directory "/";
      	# directory "/usr/local/etc/namedb";
      	pid-file "s/named.pid";
              listen-on-v6 { any; };
      };
      
      include "rndc.key";
      
      controls {
      	inet 127.0.0.1 allow { 127.0.0.1; } keys { RNDC; };
      	inet ::1 allow { ::1; } keys { RNDC; };
      };
      
      logging {
      	category lame-servers { null; };
      };
      
      # ゾーン転送を許可するホスト
      acl "SERVERS" {
      	::1;
      	127.0.0.1;
      	10.0.0.1; # me!
      	172.16.0.1; # secondary
      };
      
      # 内向けの view
      view "internal" {
      	# この view は次のネットワークからの要求に対してのみ使用される
      	match-clients {
      		::1/32; # localhost
      		127.0.0.0/8; # localhost
      		192.168.0.0/24; # 内側のネットワーク
      	};
      	# 以下ゾーンの設定
      	# 最初の 3 つは基本設定での内容と同じ
      	zone "." {
      		type hint;
      		file "named.root";
      	};
      	zone "0.0.127.in-addr.arpa" {
      		type master;
      		file "localhost.rev";
      	};
      	zone "1.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.int" {
      		type master;
      		file "localhost-v6.rev";
      	};
      	zone "example.com" {
      		type master;
      		file "example.com-priv";
      	};
      	zone "0.168.192.in-addr.arpa" {
      		type master;
      		file "0.168.192.in-addr.arpa";
      	};
      };
      
      # 外向けの view
      view "external" {
      	# view "internal" の match-clients にマッチしない場合は、
      	# この view が使われる。
      	match-clients { any; };
      	recursion no; # 再帰検索しない
      	zone "." {
      		type hint;
      		file "named.root";
      	};
      	zone "0.0.127.in-addr.arpa" {
      		type master;
      		file "localhost.rev";
      	};
      	zone "1.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.int" {
      		type master;
      		file "localhost-v6.rev";
      	};
      	zone "example.com" {
      		type master;
      		file "example.com";
      		allow-transfer { SERVERS; }; # ゾーン転送の制限
      	};
      	zone "0.0.0.10.in-addr.arpa" {
      		type master;
      		file "0.0.0.10.in-addr.arpa";
      		allow-transfer { SERVERS; }; # ゾーン転送の制限
      	};
      };
      
    4. 動作確認

      内側・外側から、それぞれの view が使用されることを確認する。 詳細はこちら

  4. bind9 で dynamic update DNS を設定

    まず dynamic update DNS (ddns) を設定する。 次に ISC DHCP サーバ と連動して、ホスト名を自動で更新する DNS サーバにする。
    1. ddns.key 作成

      rndc.key 同様に、ddns.key を作成する。 これが更新用の秘密キーとなる。 nsupdate(8) で使うので、キーファイルを削除しないこと。
      # cd /usr/local/etc/namedb/
      # (cd key; /usr/local/sbin/dnssec-keygen -a HMAC-MD5 -b 512 -n USER DDNS)
      # touch ddns.key; chown bind:bind ddns.key; chmod 600 ddns.key
      # sed -n 's/Key: \(.*\)/secret "\1";/p' key/Kddns.*.private > ddns.key
      # vi ddns.key
      key DDNS {
      	algorithm HMAC-MD5;	# "" で囲んではだめ。
      	secret "52eFerRriXE2aZUo0DmNnIQ2vEmYmdlEpOr0yjpkuYzR8h2zEqnWNAKEVIT0FKdMTz7hKunHgAlwJqhbB+0RDw==";
      };
      
      ddns.key の key の名前は、 dnssec-keygen に与えた名前 (DDNS) と同じにすること。
    2. ゾーンファイル

      ゾーンファイルは 上で作った example.com と 0.168.192.in-addr.arpa をそのまま使う。 ただし、オーナは bind にして、 ディレクトリ s の下に置く。
    3. named.conf 作成

      # named.conf
      options {
      	directory "/";
      	pid-file "s/named.pid"; # ワークディレクトリからの相対パス
              listen-on-v6 { any; }; # IPv6 での query を受け付ける。
      };
      
      include "rndc.key";
      include "ddns.key";
      
      controls {
      	inet 127.0.0.1 allow { 127.0.0.1; } keys { RNDC; };
      	inet ::1 allow { ::1; } keys { RNDC; };
      };
      
      logging {
      	category lame-servers { null; };
      };
      
      zone "." {
      	type hint;
      	file "named.root";
      };
      zone "0.0.127.in-addr.arpa" {
      	type master;
      	file "localhost.rev";
      };
      zone "1.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.int" {
      	type master;
      	file "localhost-v6.rev";
      };
      zone "example.com" {
      	type master;
      	file "s/example.com-priv";
      	allow-update { key DDNS; };
      };
      zone "0.168.192.in-addr.arpa" {
      	type master;
      	file "s/0.168.192.in-addr.arpa";
      	allow-update { key DDNS; };
      };
      
    4. 動作確認

      nsupdate(8) で、レコードを更新できることを確認する。 詳細はこちら
    5. ゾーンファイルの管理

      • ダイナミックアップデートにする場合、 ゾーンファイルは直接編集はしない。 レコードの更新は、全て nsupdate で行う。 どうしても編集したいときは、
        1. rndc stop で named を止めて
        2. example.com-priv.jnl を削除して
        3. example.com-priv を編集して
        4. named を再起動
        する。
      • example.com-priv はリアルタイムには更新されない。 ゾーンのリストを取りたいときは、
        # /usr/local/bin/dig @127.0.0.1 example.com. axfr
        
        とする。

    6. isc-dhcp-3.0 の設定

      1. インストール

        FreeBSD なら ports を使うのがよい。 (他の OS の場合は自分で頑張ってくれ。) 一箇所バグってるのでパッチを当てる。 また、RFC1035 にそぐわないホスト名を強引に矯正するパッチも当てる。
        # cd /usr/ports/net/isc-dhcp3
        # ln -s dhcp3-common-dnc.c.diff files/patch-ja
        # ln -s dhcp3-common-options.c.diff files/patch-jb
        # make && make install && make clean
        # cp /usr/local/etc/rc.d/isc-dhcpd.sh.sample /usr/local/etc/rc.d/isc-dhcpd.sh
        インターフェースを限定したい時は、 rc.isc-dhcpd.conf を編集する。
        # vi /usr/local/etc/rc.isc-dhcpd.conf
        dhcpd_ifaces=fxp1  # 内側のインターフェース
        
      2. dhcpd.conf 作成

        # dhcpd.conf
        authoritative;
        option domain-name "example.com";
        option domain-name-servers ns.example.com;
        
        ddns-update-style interim; # 更新方法の指定(必須)
        ignore client-updates;
        
        include "/usr/local/etc/namedb/ddns.key";
        zone example.com. { # "" で囲んではだめ。最後の . を忘れずに。
        	primary 127.0.0.1;
        	key DDNS;
        }
        zone 0.168.192.in-addr.arpa. {
        	primary 127.0.0.1;
        	key DDNS;
        }
        
        subnet 192.168.0.0 netmask 255.255.255.0 {
        	option routers 192.168.0.1; # デフォルトルータ
        	# option netbios-name-servers ntserver.example.com; # WINS サーバ
        	pool {
        		range 192.168.0.10 192.168.0.15;
        		# DHCP が動いている環境でテストするには、
        		# クライアントを限定するとよい。
        		# 本稼働時にはコメントアウトする。
        		allow known clients;
        	}
        }
        
        # known clients のリスト
        host hoge { hardware ethernet 00:a0:24:a5:10:4b; ddns-hostname "pc1"; }
        
        
    7. 動作確認

      dhcpd を起動し、連動がうまくいくか確認する。 詳細はこちら
    8. 起動スクリプト

      dhcpd の起動スクリプトを作成する。
      # cp /usr/local/etc/rc.d/isc-dhcpd.sh.sample /usr/local/etc/rc.d/isc-dhcpd.sh
      
    参考:
  5. FAQ

    1. Can't find server name for address?

      Q. nslookup したら、
      	$ nslookup
      	*** Can't find server name for address 192.168.0.1: Non-existent host/domain
      	*** Default servers are not available
      
      と怒られましたが?

      A. nslookup は腐っている。 dig を使いなさい。

      	# dig [@192.168.0.1] [-t type] foo.example.com.
      	127.0.0.1 は DNS サーバ名または IP/IPv6 アドレス。
      	type は A, PTR, AXFR など。
      
      	# dig [@192.168.0.1] -x 192.168.0.1  # 逆引き
      	dig [@192.168.0.1] -t ptr 1.0.168.192.in-addr.arpa.
      	と同じ
      
      	# dig [@192.168.0.1] -t axfr example.com.
      	nslookup の `ls -d example.com' と同じ。
      
      質問の症状を説明すると、 nslookup はまず DNS サーバの IP アドレスを逆引きしようとする。 逆引きに失敗すると、 その時点で Q のエラーメッセージ (言われなきゃどういう意味なのかほとんど推測不可能な内容ですな) を吐いて終了してしまう。 どうしても nslookup を使いたければ、 まず逆引き可能なDNSサーバの IP アドレスを指定し、 server コマンドで、テストしたいサーバを指定する。
      	$ nslookup - 172.16.0.1
      	Default Server:  ns.example.com
      	Address:  172.16.0.1
      
      	> server 192.168.0.1	
      	Default Server:  [192.168.0.1]
      	Address:  192.168.0.1
      
    2. rndc: connect failed: connection refused?

      Q. ここのサンプル通りに rndc.conf を書いて、 rndc を起動したらエラーメッセージがでて失敗しますが?

      A. rndc.conf の

      	default-server localhost;
      
      	default-server 127.0.0.1;
      
      としなさい。

      localhost でもいいのだが、IPv6 環境だっりすると、 localhost を引くと ::1 が返って来てたりして、 ::1 に接続しようとする。 named 側で ::1 からの制御を許可してれば問題ないが、 127.0.0.1 のみ許可だと、上記エラーが出る。

    3. RRset already exists?

      Q. dhcpd と bind9 でダイナミックアップデートな DNS システムができました。 しかし、ときどき更新できない場合がありますが?

      A. nsupdate で A と TXT を消しなさい。

      	# nsupdate -k /usr/local/etc/namedb/key/Kdhcp_updater.+xxx+xxxxxx.private
      	> update delete A foo.example.com.[enter]
      	> update delete TXT foo.example.com.[enter]
      	> [enter]
      
      dhcpd は A と TXT を登録するが、 クライアント OS を変えたりとかで、 何かの拍子に TXT が変わってしまうと、 A の更新に失敗するようになる。 (これまたエラーメッセージが意味不明ですな。)
    4. ログの時刻がずれますが?

      Q. chroot 環境で動かしたらログの時刻が 9 時間ずれてますが?

      A. /etc/localtime をコピーするの忘れてた。スマン。 (本文は 2002.11.27 修正済)

      	# mkdir /usr/local/etc/namedb/etc; cp /etc/localtime /usr/local/etc/namedb/etc/
      
    5. bind9 が遅いみたいですが?

      Q. ネームサーバを bind9 にしたら、名前解決が遅くなりました。 bind8 より遅いとは聞いていましたが、あんまりです。 .JP ドメインが特に遅いです。 .COM ドメインや .ORG ドメインは普通です。

      A. ./configure --disable-ipv6 しなさい。 詳しくは インストール 参照。

    6. too many timeouts, disabling EDNS0?

      Q. 名前解決がなんだか遅いので -d 3 でログを調べたら、 上記のメッセージが出ていました。 EDNS0 って何?

      A. EDNS0 (EDNS) は RFC2761 で拡張された DNS の仕様。 このエラーが出るネームサーバ (12.34.56.78) があるのなら、named.conf に

      server 12.34.56.78 {
      	edns no;
      }
      
      と書けばそのサーバに対しては EDNS0 を使用しなくなる。

      それでも解決しない場合は、IPv6 が原因かもしれないので、 Q.5 を参考にしなさい。

    7. bind9 のマニュアルはないの?

      Q. 私の bind9 にはマニュアルが付いていませんでしたが?

      A. bind9 のソースを展開して、 bind-9.x.x/doc/arm/Bv9ARM.html をウェブブラウザで見なさい。 印刷用マニュアルは、 bind9.3 のページからたどれる BIND 9 Administrator Reference Manual(bind9arm.pdf) をダウンロードしなさい。

    8. dhcpd: clock skew too great?

      Q. DNS サーバと DHCP サーバを別のホストで DDNS システムを組みましたが、 名前を DNS に登録してくれません。 dhcpd のログには "clock skew too great" とありますが?

      A. DNS サーバと DHCP サーバの時計を合わせなさい (5 分以上ずれていると上記エラーが出る)。 ただし、時計を合わせて一時的に解決しても、 時間が経つとまた双方の時計がずれてエラーが再発するので、 DNS サーバと DHCP サーバで、ntpd(8) を動かすようにして、 恒久的に解決しなさい。 (参考: ntpd 設定)

    9. 再帰検索を禁止したいのですが?

      Q. インターネットからの再帰検索を許可していると、 DDoS 攻撃の踏台にされると聞きました。 自分はそんなもの許可した覚えはないのですが、 もし許可しているとしたら、 再帰検索を禁止するにはどうすればいいのですか?

      A. bind は、デフォルトではどこからでも再帰検索を許可するようになっている。 これを制限するには、 named.conf の options に allow-recursion を追加しなさい。

      再帰検索を全面的に禁止するには、 named.conf の options に 「recursion no;」と書けばよい。 ただしそうすると、 localhost を含む、全てのクライアントからの再帰検索を行わなくなる。 もし DNS サーバを動かしているホスト自身の DNS サーバが、 自分自身(localhost)になっていると、 そのホストは名前解決ができなくなってしまう。

      そこで、クライアントによって再帰検索を許可するか禁止するかを制御するには、 named.conf の options に allow-recursion を追加して、 再帰検索を許可するホスト、サブネットを列挙すればよい。

      options {
      	:
      	allow-recursion {
      		127.0.0.1; # localhost (IPv4) からは許可
      		::1; # localhost (IPv6) からは許可
      		192.168.0.0/24; # 内側のネットワークからは許可
      	};
      	:
      };
      

      もしあなたの bind9 が内向け・外向けを兼用している場合は、 bind9 で外向けと内向けの DNS を設定 のように、 view で内向けと外向けを分離し、 それぞれの options に「recursion yes;」「recursion no;」を設定すればよい。

      参考

    10. './NS/IN' て? 新種 DDoS 攻撃って??

      Q. ログに query (cache) './NS/IN' というのが大量に残ってますが? 新種 の DDoS 攻撃というやつを受けているのでしょうか??

      A. ログに './NS/IN' denied とあれば問題ない。 不安ならば 何やら連続的に大量にクエリーが来ます!! に進みなさい。

    11. 何やら連続的に大量にクエリーが来ます!!

      Q. クエリーを監視していたら、 . IN NS という問い合わせが大量に来ています!! `tcpdump -n udp and port 53' で監視していたら、 NS? . という問い合わせが殺到しています!!

      A. 新種の DDoS 攻撃かもしれない。 Internet SecurityDNS Test - isc を使って、自分の DNS サーバをテストしなさい。 注意: 再帰検索を禁止 していても、不十分な場合があるので、きちんと確認すること! (例えば bind 9.3 系列では問題が発生することがある)

      dnstest ページに、計算問題の答えと、 テストしたい DNS サーバの IP address を入力してボタンをクリックせよ。

      Good. your name server refused the query
      
      と出たならば問題ない。 無視しなさい。
      BAD, your name server responded to the query
      
      と出たら bind を 9.5.1 以上にバージョンアップしなさい。

      解説: 多くの DNS サーバは root サーバのリストを cache または hint として保持している。 ". IN NS" というクエリーは、その root servers を問い合わせるものである。 このクエリーに対して当該リスト (A.ROOT-SERVERS.NET. B.ROOT.SERVERS.NET 等) を返すと、DDoS (Distibuted Denial of Service) 攻撃に加担することになる (クエリーパケットサイズに対してリプライパケットサイズが数十倍になるので、 ネットワークトラフィックの増幅器として機能してしまう)。 ". IN NS" の問い合わせに対して、Refuse パケットを返すと、 これはパケットサイズがクエリーよりも小さいので、 少なくとも root servers のリストを返すよりはましなのである。


  6. おしまい