最新トピック
# 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 等ができる。
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 はそれを見ていないっぽい。
# grep bind /etc/group /etc/passwd /etc/group:bind:*:53: /etc/passwd:bind:*:53:53:Bind Sandbox:/:/sbin/nologin
# 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 によってはダイナミックリンクライブラリ等が必要になるかも。
# 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
# /usr/local/sbin/rndc reload # /usr/local/sbin/rndc restartで置き換えられた。 named と rndc は、秘密キーを共有することでアクセス制限を行う。 (因みに rndc と named はネットワーク経由で通信するので、 キー(とアクセス制限)さえ合っていれば、 どのホストからでも rndc による制御が可能だ。)
# (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.privatednssec-keygen は /dev/random を読むのだけど、 FreeBSD 4 だと待ちに入っちゃったりするんで、 キーを叩いたり、別のプロセスで /dev/random を読んだりしてあげる。 もしくは
# for i in `jot 15`; do rndcontrol -s $i; doneのように割込みを設定してあげる。
# 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.* は削除しても構わない。
# 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";
};
# rndc.conf
include "/usr/local/etc/namedb/rndc.key";
options {
default-server 127.0.0.1; # または ::1 または localhost
default-key RNDC;
};
# 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:動作確認の詳細はこちら。
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 しない場合
domain example.com dnsserver 127.0.0.1
The Internet
|
(10.0.0.1)
ns.example.com
(192.168.0.1)
|
o---+----- ...
; 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
; 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 $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.
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; }; # ゾーン転送の制限
};
};
# 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) と同じにすること。
# 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; };
};
# /usr/local/bin/dig @127.0.0.1 example.com. axfrとする。
# 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 # 内側のインターフェース
# 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"; }
# cp /usr/local/etc/rc.d/isc-dhcpd.sh.sample /usr/local/etc/rc.d/isc-dhcpd.sh
$ 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
A. rndc.conf の
default-server localhost;を
default-server 127.0.0.1;としなさい。
localhost でもいいのだが、IPv6 環境だっりすると、 localhost を引くと ::1 が返って来てたりして、 ::1 に接続しようとする。 named 側で ::1 からの制御を許可してれば問題ないが、 127.0.0.1 のみ許可だと、上記エラーが出る。
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 の更新に失敗するようになる。 (これまたエラーメッセージが意味不明ですな。)
A. /etc/localtime をコピーするの忘れてた。スマン。 (本文は 2002.11.27 修正済)
# mkdir /usr/local/etc/namedb/etc; cp /etc/localtime /usr/local/etc/namedb/etc/
A. ./configure --disable-ipv6 しなさい。 詳しくは インストール 参照。
A. EDNS0 (EDNS) は RFC2761 で拡張された DNS の仕様。 このエラーが出るネームサーバ (12.34.56.78) があるのなら、named.conf に
server 12.34.56.78 {
edns no;
}
と書けばそのサーバに対しては EDNS0 を使用しなくなる。
それでも解決しない場合は、IPv6 が原因かもしれないので、 Q.5 を参考にしなさい。
A. bind9 のソースを展開して、 bind-9.x.x/doc/arm/Bv9ARM.html をウェブブラウザで見なさい。 印刷用マニュアルは、 bind9.3 のページからたどれる BIND 9 Administrator Reference Manual(bind9arm.pdf) をダウンロードしなさい。
A. DNS サーバと DHCP サーバの時計を合わせなさい (5 分以上ずれていると上記エラーが出る)。 ただし、時計を合わせて一時的に解決しても、 時間が経つとまた双方の時計がずれてエラーが再発するので、 DNS サーバと DHCP サーバで、ntpd(8) を動かすようにして、 恒久的に解決しなさい。 (参考: ntpd 設定)
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;」を設定すればよい。
参考
A. ログに './NS/IN' denied とあれば問題ない。 不安ならば 何やら連続的に大量にクエリーが来ます!! に進みなさい。
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 のリストを返すよりはましなのである。