Rock'n'Hack ブログ

それなりハッカーを目指して、もろもろのメモ。bloggerから引っ越しました。

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 は、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 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