2011年9月28日水曜日

bind : 単純な権威DNSサーバの設定を行う


久々に普通(?)の投稿。

今回はいつだかに書いた bind の話の続き。


いつも通り、つらつらと設定の経緯を書き連ねます。

前回までの記事で、

インストール~動作確認~ログ出力

まで確認したので、いよいよ設定に入る。

まずは、、、


権威DNSサーバを一台作ってみる。




そもそも権威DNSサーバとは何かというと、
ある特定のドメインの情報を管理しているサーバのこと。

というのも、DNSの構造は、階層構造になっています。

つまり、上位ドメイン(最上位はルート'/')が、下位のドメインの管理を任せている(権限を委譲している)ので、
「権威」という、個人的には大げさかつ今一つピンとこないなぁ、という感じの肩書きがついている。

じゃあ権威DNSサーバと他には何DNSサーバがあるのさ(・。・)

って話になると、それはキャッシュDNSサーバですよってことになる。

DNSが階層構造になってるってことは、名前解決したい時はルートDNSサーバから
順々に辿って行かないといけない。
そうなると、インターネット上を流れる膨大なパケットをルートDNSサーバが
さばかないといけなくなる。※

それは、、、想像しただけで、いや想像出来ないくらいの凄まじさだ。。

そこで、一度名前解決したものは一定時間は保持しておいて、
もろもろ負荷を減らそうぜ、ってことでキャッシュDNSサーバがあります。

※ちなみに有名な話ですが、ルートDNSサーバは世界に13台あります。
(実際に物理的に13台ではないと思いますが。)
じゃあそいつらはどうやって名前解決するんだよ、って話になりますが、
それはヒントファイルとして、事前にダウンロードしておきます。
ちょっと待った、じゃあヒントファイルを落とす時にどうやって名前解決するんだよ、
ってことになるかもしれませんが、、、別に世の中名前解決が全てではないので、、、なんてw

---

で、前置きがすごく長くなってしまいましたが、今回作るのは権威DNSサーバです。

具体的には、example.jp ドメインを管理するDNSサーバを作ります。

構成としては、こんな感じで。


  • ドメイン:example.jp 192.168.1.11
  • 権威DNSサーバ1:ns1.example.jp 192.168.1.79
  • 権威DNSサーバ2:ns2.example.jp 192.168.1.89
  • 名前だけWebサーバ:www.example.jp 192.168.1.81
※特にIPアドレスに意味は無いです。

ごく単純。
あえてあげるならば、DNSサーバは落ちると痛いので、冗長構成にするのが定石らしい。

1をプライマリ、2をセカンダリ

として、1が管理ドメイン(ゾーンファイル)を2に渡す(ゾーン転送する)ようにする。
セカンダリだからといって、2台じゃないといけないわけではない。
なので、マスター・スレーブというもう一つの呼び方の方が頭の弱い自分にはしっくりくる。

では、早速設定していく。

設定の対象となるファイルは下記の通り。

  • named.conf
  • localhost
  • localhost.rev
  • example.jp
  • example.jp.rev

named.conf は、bind の設定ファイル。
localhost は、ローカル用のゾーンファイル。
example.jp は、管理ドメインのゾーンファイル。
.rev となっているのは、逆引き用のゾーンファイル。

まずは、named.conf を設定する。
完成形はこちら。太字が編集した箇所。

named.conf
---
include "/etc/rndc.key";

controls {
      inet 127.0.0.1 port 953
              allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
        version "unknown";
        directory "/var/named";
        allow-query { any; };
        recursion no;
        allow-transfer { none; };
        blackhole {
                bogon;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

zone "localhost" {
        type master;
        file "localhost";
};

zone "127.in-addr.arpa" {
        type master;
        file "localhost.rev";
};

zone "example.jp" {
        type master;
        file "example.jp";
        //allow-transfer { 192.168.1.71; };
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "example.jp.rev";
};

logging {
        channel daemon{
                file "/var/log/daemon.log" versions 10 size 1m;
                print-category yes;
                print-time yes;
        };

        channel query{
                file "/var/log/query.log" versions 10 size 20m;
                print-time yes;
        };

        category xfer-in { daemon; };
        category xfer-out { daemon; };
        category notify { daemon; };
        category config { daemon; };
        category security { daemon; };
        category update { null; };
        category default { daemon; };
        category queries { query; };
};

acl "bogon" {
        0.0.0.0/8;
        169.254.0.0/16;
        192.0.2.0/24;
        224.0.0.0/3;
};
---


それぞれを見てみる。


allow-query { any; }; 名前解決要求をどこからでも受け付ける。
recursion no;     再起問い合わせは行わない。
allow-transfer { none; }; 管理ゾーンファイル全ての一括転送は行わない。
blackhole { bogon の設定。もうちょっと下に超ライトな説明あります。
bogon;
};

zone "example.jp" IN { 管理するゾーン名
type master;  マスターであることを明記
file "example.jp"; ゾーンの設定が書いてあるゾーンファイル名。
//allow-transfer { 192.168.1.71; }; 指定サーバへのゾーン転送を許可。
正しい設定が出来たらあとで許可する。
};

下記設定は必須ではないみたいだが、不正問い合わせを防ぐ目的で設定する。
Bogon(ボーゴン)と読むらしい。
インターネット上で存在し得ないIPアドレスからの問い合わせを拒否する。

acl "bogon" { 
0.0.0.0/8;
169.254.0.0/16;
192.0.2.0/24;
224.0.0.0/3;
};


ネットワークアドレスとか、DHCPのエラーアドレスとか、マルチキャストとかって感じかなぁ。。

ということで、named.conf の設定終わり。

文法チェックをしてくれるコマンドで確認する。

# named-checkconf named.conf

何も出力されなければOK。

では、次にゾーンファイルを各種設定する。

こちらも完成形をどん、と。

localhost
---
$TTL 86400
$ORIGIN localhost.
@               86400 IN SOA    @ root (
                                        1       ; Serial
                                        10800   ; 3h Refresh
                                        900     ; 15m Retry
                                        604800  ; 1w Expire
                                        3600    ; 15m Negative cache TTL
                                        )

                86400 IN NS             @
                86400 IN A              127.0.0.1
---


localhost.rev
---
$TTL 86400
@               86400 IN SOA    localhost. root.localhost. (
                                        1       ; Serial
                                        10800   ; 3h Refresh
                                        900     ; 15m Retry
                                        604800  ; 1w Expire
                                        3600    ; 15m Negative cache TTL
                                        )

                86400 IN NS             localhost.
1.0.0           86400 IN PTR            localhost.
---


example.jp
---
$TTL 3600
@       IN SOA          ns1.example.jp. root.example.jp. (
                        2011081101      ; Serial
                        3600            ; 1h Refresh
                        900             ; 15m Retry
                        604800          ; 1w Expire
                        3600            ; 15m Negative cache TTL
                        )
; example.jp の権威DNSサーバをNSレコードとして登録
        IN NS   ns1
        IN NS   ns2

; ns1.example.jp の A、AAAA レコードを登録
ns1                     IN A            192.168.1.79
                        ;IN AAAA        0:0:0:0

; ns2.example.jp の A、AAAA レコードを登録
ns2                     IN A            192.168.1.89
                        ;IN AAAA        0:0:0:0

; www.example.jp の A、AAAA レコードを登録
www                     IN A            192.168.1.81
                        ;IN AAAA        0:0:0:0
---


example.jp.rev
---
$TTL 86400
@               86400 IN SOA    ns1.example.jp. root.ns1.example.jp. (
                                        1       ; Serial
                                        10800   ; 3h Refresh
                                        900     ; 15m Retry
                                        604800  ; 1w Expire
                                        3600    ; 15m Negative cache TTL
                                        )

                86400 IN NS             ns1.example.jp.
                86400 IN NS             ns2.example.jp.
79              86400 IN PTR            ns1.example.jp.
89              86400 IN PTR            ns2.example.jp.
---

※IPv6 も当初は設定する予定でしたが、bind も IPv6 も両方共あやふやな
知識だったので、今回は見送ってます。。

書式については、コメントを見てもらうなりして頂いて、、、@を使って省略形で書くのがクールみたいです。

こちらも、named.conf 同様、チェックするコマンドがあるのでそれを実施します。

# named-checkzone ゾーン名 ゾーンファイル名

何も出力されなければOK。

余談:
ちなみに、同じコマンドを使用して、省略形ではない形式にゾーンファイルを整形出来るみたいです。
たとえば、作成したゾーンファイル、example.jp を使用すると、、、

# named-checkzone -o example.jp.formated example.jp example.jp

とすると、

# cat example.jp.formated
example.jp. 3600 IN SOA ns1.example.jp. root.example.jp. 2011081101 3600 900 604800 3600
example.jp. 3600 IN NS ns1.example.jp.
example.jp. 3600 IN NS ns2.example.jp.
ns1.example.jp. 3600 IN A 192.168.1.79
ns2.example.jp. 3600 IN A 192.168.1.89
www.example.jp. 3600 IN A 192.168.1.81

というように、省略なしの記法に変換されたファイルが出来ます。

ということで、設定が終わったので、bindを起動します。


# service named start


では、動作確認してみます。
まずは正引きから、、、


# dig @localhost localhost
; <<>> DiG 9.7.1-P2 <<>> @localhost localhost
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46194
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;localhost.                     IN      A

;; ANSWER SECTION:
localhost.              86400   IN      A       127.0.0.1

;; AUTHORITY SECTION:
localhost.              86400   IN      NS      localhost.

;; Query time: 41 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 12 16:54:46 2011
;; MSG SIZE  rcvd: 57


# dig @localhost www.example.jp
; <<>> DiG 9.7.1-P2 <<>> @localhost www.example.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54533
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.example.jp.                        IN      A

;; ANSWER SECTION:
www.example.jp.         3600    IN      A       192.168.1.81

;; AUTHORITY SECTION:
example.jp.             3600    IN      NS      ns2.example.jp.
example.jp.             3600    IN      NS      ns1.example.jp.

;; ADDITIONAL SECTION:
ns1.example.jp.         3600    IN      A       192.168.1.79
ns2.example.jp.         3600    IN      A       192.168.1.89

;; Query time: 7 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 12 16:54:59 2011
;; MSG SIZE  rcvd: 116


うん、大丈夫そう。 では、次に逆引き~、、、


# dig @localhost -x 127.0.0.1
; <<>> DiG 9.7.1-P2 <<>> @localhost -x 127.0.0.1
; <<>> DiG 9.7.1-P2 <<>> @localhost -x 127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44814
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 86400   IN      PTR     localhost.

;; AUTHORITY SECTION:
127.in-addr.arpa.       86400   IN      NS      localhost.

;; ADDITIONAL SECTION:
localhost.              86400   IN      A       127.0.0.1

;; Query time: 8 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 12 16:56:07 2011
;; MSG SIZE  rcvd: 93


# dig @localhost -x 192.168.1.79
; <<>> DiG 9.7.1-P2 <<>> @localhost -x 192.168.1.79
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24364
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;79.1.168.192.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
79.1.168.192.in-addr.arpa. 86400 IN   PTR     ns1.example.jp.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400 IN      NS      ns1.example.jp.
1.168.192.in-addr.arpa. 86400 IN      NS      ns2.example.jp.

;; ADDITIONAL SECTION:
ns1.example.jp.         3600    IN      A       192.168.1.79
ns2.example.jp.         3600    IN      A       192.168.1.89

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 12 16:56:20 2011
;; MSG SIZE  rcvd: 137


こっちも平気そうかな~。

と、いうことで、シンプルな構成の設定完了!

あ、まだセカンダリの設定が残ってるか、、、
それはまた次で。。




おしまい。
こちらの書籍を参考にさせて頂きましたm(_ _)m

  

0 件のコメント:

コメントを投稿