はじめての DNS サーバ
会社や自宅内等の LAN でテストや検証をする場合に,IP アドレスでサーバへアクセスするよりも FQDN で指定でアクセスした方が便利な場合がよくあります.
必須ではないですが,例えば LDAP や証明書をあつかう場合等です.
また,オープンソースの Web アプリの場合でも IP アドレスではなくて FQDN を使用した例でチュートリアルが作成されている場合をよく見かけるので,とりあえず試したい場合でも,DNS サーバをあらかじめ立てておくと便利だと思います.
そこで,自宅内部のでのみ使用する DNS サーバを立ててみました.
環境
OS: CentOS 6.0
構成
- DNS サーバに設定した FQDN の場合は問い合わせに対して,すぐに応答を返す.(権威 DNS サーバ)
- DNS サーバに設定していない FQDN の問い合わせの場合は,DNS サーバを立てる前と同様に外へ問い合わせる.(キャッシュ DNS サーバ)
構成図(DNS サーバ導入後)
インストール
下記の 2 つをインストールします.
- bind
- bind-chroot
# yum install bind bind-chroot
/etc/named.conf の編集
# ACL を定義 acl localnet { 192.168.0.0/24; 127.0.0.1; }; # 共通設定 options { # listen-on port 53 { 127.0.0.1; }; # listen-on-v6 port 53 { ::1; }; version "unknown"; # bind 設定用ディレクトリの指定 directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; # 許可する問い合わせ元の IP Address または ACL 指定 allow-query { localnet; }; # ACL で指定したネットワークからの問い合わせ時にキャッシュがあれば応答する allow-query-cache { localnet; }; # zone 転送 allow-transfer { none; }; # 再帰検索の受付可否 recursion yes; # 内部ドメイン以外の名前解決先 # ISP の DNS を指定してあるルータや ISP の DNS の IP Address の指定 # これがないと直接、ルート DNS へ問い合わせに行ってしまう forwarders { 192.168.0.1; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; view "internal" { # 問い合わせ元の IP アドレス またはネットワーク(下記では ACL のネットワークを指定) match-clients { localnet; }; # 正引きゾーンの設定 zone "hexa.diary" IN { type master; file "db.hexa.diary"; }; # 逆引きゾーンの設定 zone "0.168.192.in-addr.arpa" IN { type master; file "db.192.168.0"; }; # 逆引きゾーンの設定 zone "0.0.127.in-addr.arpa" IN { type master; file "db.127.0.0"; }; # ルートゾーンの設定 zone "." IN { type hint; file "named.ca"; }; };
zone ファイル
/etc/named.conf で指定したファイルを /var/named/chroot/var/named/ 以下に作成します.
- db.hexa.diary
; TTL の指定 $TTL 1h @ IN SOA ns1.hexa.diary. hexa.diary.gmail.com. ( 1 ; シリアル番号 3h ; リフレッシュ時間 1h ; リトライ時間 1w ; 期限 1h ) ; ネガティブキャッシュの TTL ; ネームサーバ IN NS ns1.hexa.diary. ; アドレスとの対応の指定 localhost.hexa.diary. IN A 127.0.0.1 ns1.hexa.diary. IN A 192.168.0.5 ns2.hexa.diary. IN A 192.168.0.4 test.hexa.diary. IN A 192.168.0.3 ; 別名から正規名の対応 name1.hexa.diary. IN CNAME ns1.hexa.diary. a.hexa.diary. IN CNAME test.hexa.diary.
- db.192.168.0
$TTL 3h 0.168.192.in-addr.arpa. IN SOA ns1.hexa.diary. hexa.diary.gmail.com ( 1 3h 1h 1w 1h ) 0.168.192.in-addr.arpa. IN NS ns1.hexa.diary. 5 IN PTR ns1.hexa.diary. 4 IN PTR ns2.hexa.diary. 3 IN PTR test.hexa.diary.
- db.127.0.0
$TTL 3h 0.0.127.in-addr.arpa. IN SOA ns1.hexa.diary. hexa.diary.gmail.com. ( 1 3h 1h 1w 1h ) 0.0.127.in-addr.arpa. IN NS ns1.hexa.diary. 1.0.0.127.in-addr.arpa. IN PTR localhost.
/etc/resolv.conf の編集
/etc/resolv.conf を編集して,今構築している DNS サーバに問い合わせるように IP アドレスを変更します.
nameserver 192.168.0.5
確認
dig を使って確認してみます.
正引き
$ dig ns1.hexa.diary ns2.hexa.diary a IN ; <<>> DiG 9.6-ESV-R4-P3 <<>> ns1.hexa.diary ns2.hexa.diary a IN ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49924 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;ns1.hexa.diary. IN A ;; ANSWER SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; Query time: 11 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Thu Mar 1 01:20:23 2012 ;; MSG SIZE rcvd: 62 ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39468 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;ns2.hexa.diary. IN A ;; ANSWER SECTION: ns2.hexa.diary. 3600 IN A 192.168.0.4 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; ADDITIONAL SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; Query time: 0 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Thu Mar 1 01:20:23 2012 ;; MSG SIZE rcvd: 82
逆引き
$ dig -x 192.168.0.4 ; <<>> DiG 9.6-ESV-R4-P3 <<>> -x 192.168.0.4 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14957 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;4.0.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 4.0.168.192.in-addr.arpa. 10800 IN PTR ns2.hexa.diary. ;; AUTHORITY SECTION: 0.168.192.in-addr.arpa. 10800 IN NS ns1.hexa.diary. ;; ADDITIONAL SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; Query time: 13 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Thu Mar 1 01:24:49 2012 ;; MSG SIZE rcvd: 106
CNAME
$ dig ns1.hexa.diary name1.hexa.diary a IN ; <<>> DiG 9.6-ESV-R4-P3 <<>> ns1.hexa.diary name1.hexa.diary a IN ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45116 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;ns1.hexa.diary. IN A ;; ANSWER SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; Query time: 11 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Sun Mar 4 03:02:57 2012 ;; MSG SIZE rcvd: 62 ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27833 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;name1.hexa.diary. IN A ;; ANSWER SECTION: name1.hexa.diary. 3600 IN CNAME ns1.hexa.diary. ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; Query time: 0 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Sun Mar 4 03:02:57 2012 ;; MSG SIZE rcvd: 82
設定できているようです.