Home » Contents » ウェブサーバの構築と設定 » BIND9によるLAN向けDNSサーバの構築

BIND9によるLAN向けDNSサーバの構築

ウェブサーバは無事に稼動しましたが,LANの中からドメイン名(例えばhttp://ozonet.dip.jpなど)で自宅サーバにアクセスしてもサイトが表示されず,今ひとつ満足感が得られません・・・.症状はこんな感じです.

  • 自宅LANの外からアクセスするとウェブは見える(外部プロキシも含む)
  • ドメイン名でアクセスしても,ルータのログイン画面が表示され,ウェブが見えない
  • ローカルIP(http://192.168.1.22)でアクセスするとウェブが表示される

自宅サーバのローカルIPを直接打てば自宅サイトは見られるわけですが,それでは家族からは超不評なこと間違いなしです (^^;;.まじめな点では,バーチャルホスト機能を使って複数のサイトを稼動させた時に,「同じローカルIPの複数サイトをLANの中からどう見分けるか?」というところで,やはり致命的な問題になります.これを解決するには,LANの中でローカルIPとサーバのドメイン名の関係を結びつけるDNS(Domain Name System)サーバを稼動させる必要があります.そこで,DNSサーバの世界標準ともいえるBIND9を自宅サーバ機に導入し,LAN内部向けのDNSを動かすことにします.

BINDの設定は難しいのか?

難しいです (^^;;.管理人の検索能力では,ウェブ上では平易な解説をしてるページをなかなか見つけられませんでした.英文ドキュメントを読み,ウェブ上の情報をかき集めて取捨選択しつつ,試行錯誤しながらやっとどうにか満足いく動作をさせた,といったところです.

ただ,DNSの概要とBIND9を設定するための知識として,馬場達也氏の月刊NetworkWorld連載『DNSの仕組み完全解説』掲載ページはとても参考になりました.ドキュメントでは理解できなかった設定要素が実例つきで示されており,解説PDFは目を通すだけでなく,ローカルにも保存しておく価値があります.

さておき,苦労はしましたが BIND の導入によって,LAN内外のどこからでもドメイン名でのアクセスが可能になり,とても満足できるサーバ環境が得られました.ここでの記述は「こうすべきだ」という正解ではないと思いますが,自分なりにたどり着いた設定内容と手順です.一通りの設定作業を経験してしまえば,その後はそれほど難しく感じずに取り扱うことができると思います.

  • BIND9 のインストール
  • resolv.conf の設定
  • named.confの設定
  • ゾーンデータの設定
  • 動作確認

bind9のインストール

Debianのetchには,bindのパッケージとしてVersion8とVersion9の2つバージョンが用意されていますが,ここでは新しいVersion9を導入することにしました.パッケージ名は「bind9」,root 権限でインストールします.

~$ sudo apt-get install bind9

resolv.conf の設定

はじめに resolv.conf を設定します.これは,BINDに名前解決の問い合わせをする「リゾルバ」というプログラムに対し,DNSサーバのIPやデフォルトのドメインを設定しておくもので,ファイルの内容はそれほど複雑ではありません.各項目の意味は,JM の Manpage of RESOLV.CONF で概ね理解できると思います.

 

/etc/resolv.conf

nameserver 127.0.0.1  DNSサーバのIPアドレス
domain ozonet.dip.jp  ローカルドメイン名
search ozonet.dip.jp  ホスト検索時のドメインリスト

nameserver にはDNSサーバのIPとして自分自身 (127.0.0.1) を指定します.また,domainsearch には,取得した自分のドメイン名を指定しておけばOKです.例えばLAN内の一つのPCのホスト名をPC1と名づけた場合,LAN上のPC1は PC1.ozonet.dip.jp と認識され,また「PC1」を検索すればDNSサーバの方で「PC1.ozonet.dip.jp」のことと解釈してホストを見つけてくれます.

named.conf の設定

次に,内向きネームサーバを稼動させるための基本の設定ファイルである named.confnamed.conf.options を編集します.一般に,BINDの設定ファイルは named.conf に記述されますが,Debian では全てに共通の設定とゾーン別の設定項目が明確になるよう,設定ファイルを2つに分けた構成にしていると思われます.

/etc/named.conf.options

まずはnamed.conf.options です.BIND導入時の雛形をもとに,/etc/bind/named.conf.options を次のように記述しました.

/etc/bind/named.conf.options

1: // LAN内のIPアドレスグループを localnet と定義
2: acl localnet {
3:        192.168.1.0/24;
4:        127.0.0.1;
5: };
6:
7: // ネームサーバ全体で共通の設定
8: options {
9:         directory "/var/cache/bind";
10:        // LAN内部からの問い合わせのみ許可する
11:        allow-query { localnet; };
12:        // ゾーン転送はしない(セカンダリDNSサーバはないため)
13:        allow-transfer { none; };
14:
15:        // 自宅ドメイン以外の閲覧はルータ(192.168.1.1)へ回送
16:        forwarders {  192.168.1.1;  };
17:        forward only;
18:
19:        auth-nxdomain no;       # conform to RFC1035
20:        listen-on-v6 { any; };  # IPv6も有効にする
21: };

ここでの設定は,およそ次のような意味になっています.

2行目: acl localnet {・・・}; は,LANに属する192.168.1.*** のIPアドレスをまとめて「localnet」という名前で定義します.acl (Access Control List) は,IPアドレスのリストを簡便に定義できる便利な仕組みです.

8行目:options{・・・}; ステートメントはDNSサーバ全体に共通する設定を書き込む部分です.

9行目:directory 文はBINDの作業ディレクトリの指定です.ここではデフォルトのままですが,必要があれば変更します.

11行目:allow-query 文は,BINDが問い合わせを受け付けるIPアドレスを指定します.ここでは,上で定義した「localnet」を指定することで,LAN内からの問い合わせにのみ応答するよう設定されています.LANの外部から問い合わせを受けることはありません.

13行目:allow-transfer 文は,BINDに記述したゾーンの情報をセカンダリネームサーバに転送するか設定します.LAN内に予備のDNSサーバが建ててあればそのIPアドレスを記述しますが,現状は1台のみでの運用なので,ゾーン転送しない(すなわちnone;)設定としています.

16行目:forwarders {・・・} は,自宅ドメイン以外への問い合わせを別のDNSサーバに回送する設定を記述しています.わが家ではインターネットへの出口としてNTTレンタルのルータ(RT200KI)を使っているので,そのIP(192.168.1.1)を指定しています.なお,ルータにはプロバイダ利用時のIDとパスワード,プロバイダ指定のDNSサーバが設定してあります.

17行目:forward only; はプロバイダのDNSが使えない場合,更なる名前解決の試みをしないという設定です.このような状況ではどうあがいてもウェブの閲覧ができないので,無駄な処理はしなくて良いのです.

19行目:auth-nxdomain no; は,BIND9のデフォルトです.様々なドキュメントを見てみましたが,特別な理由がなければnoとしておけばよいようです.

20行目:最後のlisten-on-v6 { any; }; はIPv6を有効にします.フレッツスクエアも最近はIPv6対応が始まっていますので.

/etc/named.conf

/etc/named.conf.options にはBIND9の基本的な設定を記述しましたが,もう一つの /etc/named.conf には,LAN内部のIPアドレスとドメインを結びつける範囲である「ゾーン」の設定を記述します.

具体的には,ホスト名(○○.ozonet.dip.jp)からローカルIPを見つける「正引き」と,ローカルIPからホスト名を見つける「逆引き」を定義するわけですが,わが家のLANの場合はddnsで取得したドメイン「ozonet.dip.jp」が正引きのゾーン名,ローカルIPを192.168.1.x としていることから「1.168.192.in-addr.arpa」が逆引きのゾーン名になっています.

ゾーンの設定については,上述の参考サイト(特に「特集 ~BIND設定のツボを伝授~ DNS快適運用ガイド」や,@ITの連載 BINDで作るDNSサーバ(第2回)を参照するのが良いと思います.

/etc/bind/named.conf

include "/etc/bind/named.conf.options";

1: // VIEW を定義し,LAN内部からの問い合わせに対する処理をまとめる
2: view "local" {
3:
4:      // LAN内からの問い合わせには view "local" に定義した回答をする
5:      match-clients { localnet; };
6:
7:      // 正引き用ゾーン設定
8:      zone "ozonet.dip.jp" {
9:              type master;
10:               file "/etc/bind/ozonet.dip.jp.zone";
11:       };
12:
13:       // 逆引き用ゾーン設定
14:       zone "1.168.192.in-addr.arpa" {
15:               type master;
16:               file "/etc/bind/ozonet.dip.jp.rev";
17:       };
18:
19:       // 以下はBIND9のデフォルト設定
20:       zone "." in {                      // ルートゾーン
21:               type hint;
22:               file "/etc/bind/db.root";
23:       };
24:
25:       zone "localhost" {                 // ループバック正引き(自分自身)
26:               type master;
27:               file "/etc/bind/db.local";
28:       };
29:
30:       zone "127.in-addr.arpa" {          // ループバック逆引き(自分自身)
31:               type master;
32:               file "/etc/bind/db.127";
33:       };
34:
35:       zone "0.in-addr.arpa" {
36:               type master;
37:               file "/etc/bind/db.0";
38:       };
39:
40:       zone "255.in-addr.arpa" {
41:               type master;
42:               file "/etc/bind/db.255";
43:       };
44:
45: };      // VIEWの定義はここまで
46:
47:include "/etc/bind/named.conf.local";

BIND9導入時に用意されているオリジナルの named.conf に対し,自宅LAN用に設定追加した部分は太字の部分です.

2行目:はじめに view ステートメントにより,BINDが名前解決をするゾーンをグループ化しています.もともとLAN内部向けに限定したDNSなので絶対必要な設定ではないですが,問い合わせ元に応じて応答を変えるなど動作が複雑になってきた場合には,設定の対象が明確に区別されてわかり易い記述が可能になります.ここでは,LAN内からの問い合わせに応答するためのzoneをまとめて "local" と名づけています.

5行目: match-client { localnet; }; は,LAN内IPアドレスからの問い合わせだった場合に "local" のビューを適用する,という指定です.

8行目,14行目:ここでのメインとなる「正引き」,「逆引き」の各ゾーンは zone ステートメントで名前を定義します.正引きゾーンは自分のドメイン名 (ozonet.dip.jp),逆引きゾーンはLANに割り振ったローカルIPを逆順に並べ,最後に ".in-addr.arpa" を付けた名前 (192.168.1.0/24 なら "1.168.192.in-addr.arpa") となります.

9行目,15行目:type にはプライマリネームサーバなら master,セカンダリネームサーバならば slave を指定します.うちのネームサーバは1台のみなのでプライマリ,すなわち type master; としています.

10行目,16行目:file には,ゾーンデータを記述したファイル名を指定します.bind の他の設定ファイルと同じ /etc/bind/ ディレクトリに,正引きは "/etc/bind/ozonet.dip.jp.zone",逆引きは "/etc/bind/ozonet.dip.jp.rev" を作成し,設定を記述するものとしました.

ゾーンデータの設定

最後に,正引き・逆引きのゾーンデータファイルを作成します.ゾーンデータの書式については RFC1035 という標準が定められており,ネット上にも設定例が多くあるため,それほど苦労せずに記述できる部分です.

自宅ドメインで名前解決する必要があるホストはおよそ次の通りです.自宅サーバみたいな環境では,1台で全ての機能をこなすことになるので,ウェブもDNSもメールも全て同じマシン,同じIPで運用する設定となります.

ホスト名 役割 IPアドレス
ns.ozonet.dip.jp ネームサーバ(DNSサーバ) 192.168.1.22
ozonet.dip.jp Webサーバ 192.168.1.22
mail.ozonet.dip.jp メールサーバ 192.168.1.22

正引きゾーン

指定されたホスト ( ****.ozonet.dip.jp ) をIPアドレス ( 192.168.1.*** ) に変換するのが正引きです.正引き用のゾーンデータファイルは次の通りです.

/etc/bind/ozonet.dip.jp.zone

1:  $TTL    86400
2:
3:  @       IN      SOA     ns.ozonet.dip.jp. root.ozonet.dip.jp. (
4:                          2007111801      ; Serial シリアル番号(YYYYMMDDNN)
5:                          3600            ; Refresh リフレッシュ間隔 (s)
6:                          900             ; Retry リトライ間隔 (s)
7:                          604800          ; Expire ゾーンデータの有効時間 (s)
8:                          86400           ; Minimum ネガティブキャッシュの有効時間 (s)
9:  )
10:
11:         IN      NS      ns.ozonet.dip.jp.    ; ネームサーバ
12:         IN      MX 10   mail.ozonet.dip.jp.  ; メールサーバ
13:         IN      A       192.168.1.22         ; webサーバ
14: ns      IN      A       192.168.1.22         ; ネームサーバ
15: mail    IN      A       192.168.1.22         ; メールサーバ

1行目:$TTL(Time To Live) には,リソースのキャッシュ有効時間を秒単位で指定します.ここでは24時間としてます.

3行目:@ IN SOA ・・・ には,このゾーンを管理するプライマリネームサーバ(うちではns.ozonet.dip.jp.)と,ゾーン管理者のメールアドレスを記述します.ここで ns.ozonet.dip.jp. のようにドメインを記述する場面では,末尾に "."(ピリオド)をつけます.ピリオドがない場合にはBIND側でドメイン(ここでは ozonet.dip.jp )が付加されるため,間違って ns.ozonet.dip.jp のみの記述をした場合には "ns.ozonet.dip.jp.ozonet.dip.jp" と解釈されてしまいます.また,メールアドレスを記述する部分では,例えば root@ozonet.dip.jp. であれば "@""."(ピリオド)に置き換えて root.ozonet.dip.jp. とすることになっています.

4~8行目:SOA に続く(・・・)の領域には,セカンダリネームサーバが参照するゾーンデータ情報が入ります.今回のように,LAN内部向けに1台のみで運用する場合にはあまり意味を持たない部分なので,Serial にゾーンデータを更新した日付を入れた以外は,とりあえず設定例として見かける一般的な値を入れています.

11行目:IN NS ns.ozonet.dip.jp. は,ネームサーバのホスト名を記述しています.また,IN の前(行の先頭)が空白の場合は,直前に使われた値(ここでは @,サーバ自身)が入っていると見なされます.

12行目:IN MX 10 mail.ozonet.dip.jp. は,メールサーバのホスト名を記述しています.MX の次の 10 は,サーバの優先度を示す数値で,小さいほど優先度大となります.

13行目:IN A 192.168.1.22 はウェブサーバのIPアドレスを定義しています.INの前の空白は11行目と同じ@(すなわちozonet.dip.jp)を指しています.

14,15行目:ネームサーバ,メールサーバのホスト名に対応するIPアドレスを指定しています.ここでは,全て同じ 192.168.1.22 です.各行の ns, mail の後ろには,暗黙的に ".ozonet.dip.jp" が付加され,正確には11,12行目のように "ns.ozonet.dip.jp", "mail.ozonet.dip.jp" を指しています.

逆引きゾーン

逆引きでは,指定されたIPアドレス ( 192.168.1.***,ドメイン名としては ***.1.168.192.in-addr.arpa ) に対応するホスト ( ****.ozonet.dip.jp ) を返します.逆引き用のゾーンデータファイルは次のようになります.

/etc/bind/ozonet.dip.jp.rev

1:  $TTL    86400
2:
3:  @       IN      SOA     ns.ozonet.dip.jp. root.ozonet.dip.jp. (
4:                          2007111301      ; Serial
5:                          3600            ; Refresh
6:                          900             ; Retry
7:                          604800          ; Expire
8:                          3600            ; Minimum TTL 1 hour
9:  )
10: 
11:         IN      NS      ns.ozonet.dip.jp.
12: 22      IN      PTR     ozonet.dip.jp.

1行目,3~9行目は正引きと同じです.また,11行目にあるように,逆引きでもネームサーバは定義しておきます.

12行目:22 IN PTR ozonet.dip.jp. は,逆引きを示す PTR(ポインタ)レコードです.ここでは,ローカルIPの 192.168.1.22 に対応するホスト名を "ozonet.dip.jp" であると定義しています.正引きで定義したように,192.168.1.22 は "ns" も "mail" も "@ (=ozonet.dip.jp)" も重複して使用しています.しかし,逆引きでは同じIPに複数のホスト名を定義できないため,ns, mail については逆引きを記述していません.

動作確認

named.conf,ゾーンデータの定義ができたらBINDを再起動します.root 権限で・・・

~$ sudo /etc/init.d/bind9 restart

あとは,当初の目的どおりに「ドメイン名でのアクセスで自宅ウェブが表示されるか?」確認するのみです.うまく設定できると,普段のWeb利用と変わらない感覚で自宅ウェブが見られます.自宅サーバの楽しさは二の次であろう家族にとっては当たり前 (^^;;なんですが,サーバ建てた本人からすればとてもスゴイことです (^^)/.達成感はありますヨ.