社内などに自前ルートDNSサーバを作ってみる
LANのなかにBINDで自前のルートDNSサーバを作って、そこを参照してJPドメインなども参照するようにする設定をする。
クエリの動きは以下のような感じにする。
Windowsクライアント → ローカルDNSサーバ(192.168.10.178) → ルートDNSサーバ(192.168.10.179) → jpドメインサーバ(192.168.10.173)
BINDのデフォルトの動作的には、
zone "." IN { type hint; file "ルートヒントファイル名"; };
という記述が /etc/named.conf にある場合はそれに従ってルートDNSサーバを探しにいく。
無い場合はデフォルトで内部にバイナリコードで埋め込まれたルートDNSサーバを参照しに行く。
という動作になる。
BINDのデフォルトの動作 参考
http://d.hatena.ne.jp/happs/20100304/1267706787
なのでローカルDNSサーバに別のルートヒントファイルを用意して、
そこから自前で作ったルートDNSサーバを参照しに行くようにする。
ローカルDNSサーバを作成(Windowsクライアントが参照する用)
このIPアドレスは 192.168.10.178
.(ルート)ドメインを管理するサーバの/etc/named.confに以下の設定を記述する
# vi /etc/named.conf //zone "." IN { ←こっちはコメントアウトする // type hint; // file "named.ca"; //}; zone "." IN { type hint; file "root.ca"; };
ローカルDNSサーバの/var/named以下のゾーンファイルに以下のような設定を記述する
自前のルートヒントファイルを用意する。
# vi /var/named/root.ca ; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420 ;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 518400 IN NS test.root.net. ;; ADDITIONAL SECTION: test.root.net. 3600000 IN A 192.168.10.179 ;; Query time: 147 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Mon Feb 18 13:29:18 2008 ;; MSG SIZE rcvd: 615
ルートヒントファイルは特殊なファイルなので書き方が異なる。
SOAレコードなどは必要ない。
またルートヒントファイルのアクセス権も適切にしなければいけない。
この場合は /var/named/root.ca のアクセス権をもともとあった named.ca というルートヒントファイルのようにあわせる必要がある。
そうしないと named が起動しない
# ls -l /var/named -rw-r-----. 1 root named 1892 10月 23 11:28 2013 named.ca -rw-r--r--. 1 root root 605 10月 23 11:42 2013 root.ca
ルートヒントのオーナーグループを named にする。
# chgrp named /var/named/root.ca
ルートヒントのアクセス権を 640 にする。
# chmod 640 /var/named/root.ca
# ls -l /var/named -rw-r-----. 1 root named 1892 10月 23 11:28 2013 named.ca -rw-r-----. 1 root named 605 10月 23 11:42 2013 root.ca
named の再起動
# /etc/init.d/named restart
.(ルート)ドメインを管理するサーバを作成
このIPアドレスは 192.168.10.179
.(ルート)ドメインを管理するサーバの/etc/named.confに以下の設定を記述する
# vi /etc/named.conf //zone "." IN { ←こっちはコメントアウトする // type hint; // file "named.ca"; //}; zone "." IN { type master; //type をマスターにする。 file "root.root"; };
.(ルート)ドメインを管理するサーバの/var/named以下のゾーンファイルに以下のような設定を記述する
# vi /var/named/root.root # cat /var/named/root.root $TTL 3600S @ IN SOA dns root ( 2013101701 60S 120S 360S 120S ) IN NS dns dns IN A 192.168.10.179 jp IN NS dns.jp dns.jp IN A 192.168.10.173
named の再起動
# /etc/init.d/named restart
JPドメインを管理するサーバを作成
このIPアドレスは 192.168.100.173
JPドメインを管理するサーバの/etc/named.confに以下の設定を記述する
# vi /etc/named.conf zone "jp" { type master; file "jp"; };
※このサーバは /etc/named.conf に以下の設定が入っていても入っていなくても大丈夫
zone "." IN { type hint; file "named.ca"; };
JPドメインを管理するサーバの/var/named以下のゾーンファイルに以下のような設定を記述する
# vi /var/named/jp $TTL 3600S @ IN SOA dns root ( 2013101701 60S 120S 240S 360S ) IN NS dns dns IN A 192.168.10.173 co IN NS dns.co //さらにサブドメインを定義する場合 dns.co IN A 192.168.10.150 //さらにサブドメインを定義する場合 ac IN NS dns.ac //さらにサブドメインを定義する場合 dns.ac IN A 192.168.10.151 //さらにサブドメインを定義する場合 jp. IN MX 100 1.1.1.1 //MXレコードを定義する場合 aaa IN A 10.1.1.10 //Aレコードを定義する場合
named の再起動
# /etc/init.d/named restart
確認
WindowsクライアントなどのDNSの参照を 192.168.10.178 (ローカルDNSサーバ用)にする。
クライアントからローカルDNSサーバに対して以下のようなクエリを投げるとIPが引けることが分かる。
C:Usersadmin>nslookup aaa.jp サーバー: UnKnown Address: 192.168.10.178 権限のない回答: 名前: aaa.jp Address: 10.1.1.10
クエリの動き
Windowsクライアント → ローカルDNSサーバ(192.168.10.178) → ルートDNSサーバ(192.168.10.179) → jpドメインサーバ(192.168.10.173)
BINDサーバ上にネガティブキャッシュなどが残っているとうまく名前が引けないことがあるので、
ローカルDNSサーバ、ルートDNSサーバ、jpドメインサーバ上のキャッシュを以下のコマンドでクリアにしてから試すと良い。
# rndc flush
またこの場合外部のインターネットなどにある本物の jpドメインなどにはクエリが飛ばなくなる。
BINDはルートヒントファイルや他のゾーンファイルなどがある場合は、/etc/named.conf にしたがってそこを見に行き、
無い場合は内蔵されたバイナリのルートヒントの情報を参照してインターネットに抜けるからである。