はじめての DNS サーバ

会社や自宅内等の LAN でテストや検証をする場合に,IP アドレスでサーバへアクセスするよりも FQDN で指定でアクセスした方が便利な場合がよくあります.

必須ではないですが,例えば LDAP や証明書をあつかう場合等です.
また,オープンソースの Web アプリの場合でも IP アドレスではなくて FQDN を使用した例でチュートリアルが作成されている場合をよく見かけるので,とりあえず試したい場合でも,DNS サーバをあらかじめ立てておくと便利だと思います.

そこで,自宅内部のでのみ使用する DNS サーバを立ててみました.

環境

OS: CentOS 6.0

構成

  • DNS サーバに設定した FQDN の場合は問い合わせに対して,すぐに応答を返す.(権威 DNS サーバ)
  • DNS サーバに設定していない FQDN の問い合わせの場合は,DNS サーバを立てる前と同様に外へ問い合わせる.(キャッシュ DNS サーバ)
構成図(DNS サーバ導入後)

f:id:Hexa:20120304025100j:plain

インストール

下記の 2 つをインストールします.

# 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

設定できているようです.