DNSサーバーを設置しホスト名でアクセス
前のページでキャッシュだけを行うDNSサーバーを構築した。次はLANの中にあるサーバーやクライアントに対して、ホスト名でアクセスできるように設定してみよう。
たとえば、今は自宅サーバーで公開しているウェブページをLANの中から見るために、いちいちプライベートIPアドレスを入力しているはずだ。しかし、DNSサーバーを設置すると分かりやすいホストネームでウェブサイトの確認ができるようになる。また、sshでサーバーにログインするときもホスト名を使えるので、入力の間違いもおきにくい。
正引きとは? 逆引きとは?
DNSサーバーの設定に入る前に、DNSサーバーの仕組みを見ておこう。DNSサーバーといえば、ホスト名をIPアドレスを変換し、そのIPアドレスでアクセスするために利用するものだ。しかし、DNSサーバーにはもうひとつの機能もあり、IPアドレスをホスト名に変換することもできる。これを「逆引き」と呼び、ホスト名をIPアドレスに変換するのを「正引き」と呼ぶ。
Apacheでアクセスログを記録するとき、接続元をIPアドレスではなく、ホスト名で記録することができるが、これはアクセスしてきた端末のIPアドレスをDNSサーバーで逆引きしているためだ。アクセスログにIPアドレスしかなければどういった場所からアクセスされているのかわかりにくいが、ホスト名であればどんな場所から接続してきたのか見当をつけることができる。
DNSサーバーを構築するときも、正引きだけではなく、逆引きの設定も同時に行う必要がある。
ルートサーバーとは?
ユーザーの端末がどこかのウェブサイトにアクセスしようとURLを入力したとき、まずはルートサーバーに問い合わせを行う。ルートサーバーとはインターネットの全体を管理するDNSサーバーの元締めのような存在だ。しかし、ルートサーバーは個々の端末に関する情報を持っているわけではない。
たとえば、www.mydomain.co.jpにアクセスすると仮定してみよう。最初にルートサーバーにアクセスすると、ルートサーバーはjpドメインを管理するDNSサーバーのアドレスを通知する。アドレスを受け取った端末がjpドメインのDNSサーバーにアクセスすると、DNSサーバーは次はco.jpドメインを管理するDNSサーバーのアドレスを通知する。次にco.jpドメインのDNSサーバーにアクセスし、やっとmydomain.co.jpドメインのアドレスを得る。次はmydomain.co.jpのDNSサーバーからwww.mydomain.co.jpのアドレスを入手する。これではじめてww.mydomain.co.jpにたどり着くことができるわけだ。
これから構築しようというのは、この流れの最後の部分。mydomain.co.jpへの問い合わせに対して、www.mydomain.co.jpのアドレスを通知するためのDNSサーバーだ。しかし、セキュリティ上の観点から外部に向かって通知することは避け、LANの内部に対してだけアドレスを通知するDNSサーバーを作ることにしよう。というより、非固定IPアドレスで運用しているときは、自分のDNSサーバーのアドレスも浮動するため、外部に向かって提供するのは難しい。
DNSサーバー構築に必要なファイル
内向きのDNSサーバーを構築するために必要なのは次の6つのファイルだ。それぞれインストール時には作成されないので、下にあるような記述を自分で入力していかなければならない。
/var/namedディレクトリの中に置くファイルは/etc/named.confで指定する。そのため、ファイル名は自分の環境に合わせた分かりやすいものに変えてもいい。たとえば、自分のドメインの正引きデータなら自分のドメイン名をファイルにする。
| /etcディレクトリ | named.conf | BINDの設定ファイル |
| /var/namedディレクトリ | named.ca | ルートサーバーのアドレスを記述 |
| localhost.zone | ローカルホストの正引きデータ | |
| named.local | ローカルホストの逆引きデータ | |
| mydomain.co.jp | 自分のドメインの正引きデータ | |
| 0.168.192.in-addr.arpa | 自分のドメインの逆引きデータ |
ここで構成するLANには次のようなマシンがあって、それぞれホスト名とIPアドレスは次の図のようになっていると仮定して話を進めていこう。また、ドメイン名はmydomain.co.jpという仮の名前を使う。

named.confの記述方法
BINDの設定ファイル/etc/named.confから作成を始めよう。
named.confは2つの部分に分かれている。前半はBINDの動作を設定する「option」、後半は名前解決に使うゾーンファイルを指定する「zone」だ。ほかにも追加でいくつもの要素を指定できるが、自宅サーバーのレベルでは必要ないので無視することにする。
optionの部分では、サーバーのあるLANの中からしか問い合わせに応じないように設定する。また、内部のDNSサーバーで名前解決できないときは、プロバイダーのDNSサーバーへ問い合わせるように設定を行う。別にプロバイダーのDNSサーバーを指定しなくても動作はするのだが、そのときは上で述べたようにルートサーバーから順に問い合わせを行っていくため、名前解決に時間がかかってしまう。つまり、プロバイダーのDNSサーバーをキャッシュのように使うわけだ。
後半のzoneでは、ゾーンの定義と、その設定ファイルの名前を指定する。ゾーンというのは名前解決を行う範囲のことだと考えればいい。ここで作るDNSサーバーでは、ローカルホスト(サーバー自身)と自分が所属するドメインの2つについて正引きと逆引きのゾーンファイルを作成することになる。
ゾーンのタイプとして「master」というキーワードを指定しているが、これはメインとなるDNSサーバーであることを示している。バックアップ用に複数のDNSサーバーを設置するとき、2台目以降のDNSサーバーで「slave」と設定すれば、masterのDNSサーバーとゾーンファイルを同期させることができる。
BINDのファイルを記述するとき、最後のセミコロン「;」を忘れないように。セミコロンがないと設定が有効にならないので注意が必要だ。
options {
directory "/var/named"; ゾーンファイルの保存場所
allow-query { LAN内からの問い合わせのみ応答する
127.0.0.1;
192.168.0.0/24;
};
forwarders { 外部の名前解決に利用するDNSサーバー
202.248.37.74;
202.219.63.253;
};
zone "." IN {
type hint;
file "named.ca"; ルートサーバーの情報
};
zone "localhost" IN {
type master;
file "localhost.zone"; ローカルホストの正引きファイル
};
zone "named.local" IN {
type master;
file "named.local"; ローカルホストの逆引きファイル
};
zone "mydomain.co.jp" IN {
type master;
file "mydomain.co.jp"; ドメインの正引きファイル
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "0.168.192.in-addr.arpa"; ドメインの逆引きファイル
};
named.ca(ルートサーバーの情報)を入手
ルートサーバーのアドレスを記述した最新のファイルを入手し、/var/namedディレクトリに「named.ca」という名前でコピーする。ルートサーバーのゾーンファイルはftp://ftp.rs.internic.net/domain/named.rootで入手できる。
# wget ftp://ftp.rs.internic.net/domain/named.root
ルートサーバーのゾーンファイルをダウンロード
# cp named.root /var/named/named.ca
/var/namedディレクトリにコピー
localhost.zone(ローカルホストの正引きファイル)を作成
ローカルホストとは自分自身のことをあらわす特別なホスト名のこと。ローカルホストのIPアドレスは「127.0.0.1」を使うことが慣習となっている。最初にローカルホストの名前解決を行うゾーンファイルを作成する。
ローカルホストの正引きファイルlocalhost.zoneを/var/namedディレクトリに作成する。注意点の第一がホスト名の最後にあるピリオド「.」を忘れないこと。もうひとつはセミコロン「;」がこんどはコメントを表すことだ。
$TTL 1D(1) (3) (4) @ IN SOA diamond.mydomain.co.jp. root.mydomain.co.jp. ( (2) 2005021401 ; Serial 3H ; Refresh 15M ; Retry (5) 1W ; Expire 1D ) ; Minimum IN NS diamond.mydomain.co.jp. (6) IN A 127.0.0.1 (7)
- TTLは外部のDNSに対して、キャッシュしたデータの有効期限を設定する。外部に公開しないDNSサーバーではあまり意味がない項目だが、とりあえず1D(1日)と指定しておこう。
- SOAレコードはドメインに対する権限を持ったDNSサーバーを指定する部分で、ゾーンファイルの最初に記述しておく必要がある。
- DNSサーバーのホスト名。最後のピリオドを忘れないこと。
- 管理者のメールアドレス。ゾーンファイルの中では「@」がドメイン名を表すため、「root@mydomain.co.jp」というアドレスは「root.mydomain.co.jp」と書くことになっている。
- スレーブ(予備)のDNSサーバーとゾーンファイルをやりとりするときに利用する。マスターのDNSサーバーしか設置しないなら意味のない設定項目なので、上の通りに入力しておけばいい。ちなみに各項目の意味は上からそれぞれ「シリアル番号」「スレーブがマスターに問い合わせる更新の間隔」「問い合わせに失敗したときに再試行する間隔」「更新に失敗したときにスレーブのデータを破棄するまでの期間」「問い合わせに失敗したことを記憶しておくネガティブキャッシュの有効期限」となっている。ひとつめのシリアル番号はどんな数字を入力してもいいので、DNSサーバーを立ち上げた日付に2ケタの数字を追加しておくことにした。
- NSレコードはSOAレコードと似た意味を持っていて、ドメインの中で権限を持ったDNSサーバーのホスト名を指定する。このホスト名も最後にピリオドを付ける。
- Aレコードはホスト名に対応するIPアドレスを指定するもの。ここではローカルホストの名前解決を行うため、ローカルホストのIPアドレス(127.0.0.1)を指定する。
named.local(ローカルホストの逆引きファイル)を作成
次はローカルホストの逆引きを設定する。こちらは127.0.0.1というIPアドレスが与えられたときに、ローカルホストのホスト名(localhost)を返すための設定だ。
前半の設定は上の正引きとまったく同じ。違うのは最後の1行だ。正引きではAレコードを使ったが、逆引きではPTRレコードを使用する。
$TTL 1D
@ IN SOA diamond.mydomain.co.jp. root.mydomain.co.jp. (
2005021401 ; Serial
3H ; Refresh
15M ; Retry
1W ; Expire
1D ) ; Minimum
IN NS diamond.mydomain.co.jp.
127.0.0.1 IN PTR localhost. ←PTRレコード
ドメインの正引きファイルを作成
いよいよLANの中でホスト名を使えるようにする設定だ。たとえば、下の図を例に考えると、「emerald.mydomain.co.jp」と指定すると「192.168.0.201」というIPアドレスが通知されるように設定する。これからはLANの中にあるマシンにアクセスするのにIPアドレスを使う必要はない。
/var/named/mydomain.co.jpに以下の記述を書き込んで保存する。ファイル名は自分のドメインに合わせて変更してもかまわないが、そのときは/etc/named.confの記述と合わせることを忘れないようにしよう。

記述方法は上ですませたローカルホストのやり方と同じ。前半のSOAレコードとNSレコードはどのゾーンファイルでも共通している。最後にホスト名からIPアドレスを導くAレコードを必要な数だけ追加していけばいい。
あと、いっしょに設定しておかなければならないのがMXレコードだ。MXレコードはドメインの中でどのホストが外部からのメールを受信するのかを指定する。「MX 10 ホスト名」とあるが、10とはメールを受信するホストが複数あるときの優先順位を示す。0から65535までの数値を使えるのだが、もっとも優先順位が高いものを10とするのが慣習となっている。
また、CNAMEレコードはエイリアスだ。あるホストに対して別名を定義できる。たとえば、diamondというホストに対して、wwwやmail、ftpといった名前を使ってもアクセスできるように設定できる。
$TTL 1D
@ IN SOA diamond.mydomain.co.jp. root.mydomain.co.jp. (
2005021401 ; Serial
3H ; Refresh
15M ; Retry
1W ; Expire
1D ) ; Minimum
IN NS diamond.mydomain.co.jp.
IN MX 10 diamond.mydomain.co.jp. ←MXレコード
diamond IN A 192.168.0.200 ←Aレコード
emerald IN A 192.168.0.201
perl IN A 192.168.0.10
ruby IN A 192.168.0.11
www IN CNAME diamond ←CNAMEレコード
mail IN CNAME diamond
ftp IN CNAME diamond
ドメインの逆引きファイルを作成
最後に逆引きの設定を行う。上の図の例でいえば、「192.168.0.200」というアドレスが与えられたときに、「diamond」と名前を返せるように設定するわけだ。/var/named/0.168.192.in-addr.arpaに以下の記述を入力して保存する。
設定方法はこれまでのゾーンファイルと前半は共通している。異なるのは最後にホストの数だけPTRレコードを用意することだ。PTRレコードでIPアドレスを指定するとき、IPアドレスの共通分は省略してもかまわない。「192.168.0.200」のかわりに「200」とだけ指定することができる。
$TTL 1D
@ IN SOA diamond.mydomain.co.jp. root.mydomain.co.jp. (
2005021401 ; Serial
3H ; Refresh
15M ; Retry
1W ; Expire
1D ) ; Minimum
IN NS diamond.mydomain.co.jp.
200 IN PTR diamond.mydomain.co.jp. ←PTRレコード
201 IN PTR emerald.mydomain.co.jp.
10 IN PTR perl.mydomain.co.jp.
11 IN PTR ruby.mydomain.co.jp.
hostコマンドで動作を確認する
ここまでのファイルをすべて作成したら、変更を有効にするためにBINDを再起動する。BINDの起動スクリプトは/etc/rc.d/init.d/namedだ。
# /etc/rc.d/init.d/named restart
また、構築したDNSサーバーへ問い合わせを行うように、/etc/resolv.confを編集して、今作成したDNSサーバーを使うように指定する。自分自身に問い合わせを行うわけだからローカルホスト(127.0.0.1)のアドレスを指定する。
nameserver 127.0.0.1
次にhostコマンドを使って、正しく設定ができているかを確認しよう。もしうまく働いていなかったら、これまでの記述のどこかに間違いがあるはずだ。また、BINDが起動しているかもpsコマンドで確認する。
# ps -C named BINDが起動しているか確認 PID TTY TIME CMD 7164 ? 00:00:00 named 7167 ? 00:00:00 named 7168 ? 00:00:00 named 7169 ? 00:00:00 named 7170 ? 00:00:00 named # host localhost ローカルホストへの正引きを確認 localhost has address 127.0.0.1 # host 127.0.0.1 ローカルホストへの逆引きを確認 1.0.0.127.in-addr.arpa domain name pointer localhost. # host diamond.mydomain.co.jp ドメイン内のホストへの正引きを確認 diamond.mydomain.co.jp has address 192.168.0.50 # host 192.168.0.50 ドメイン内のホストへの逆引きを確認 50.0.168.192.in-addr.arpa domain name pointer diamond.mydomain.co.jp. #
うまく働いていることが確認できたら、chkconfigコマンドを使って、BINDが自動起動するように設定しておこう。次からLinuxを起動すると同時にBINDも起動し、DNSサーバーでの名前解決ができるようになる。
# chkconfig named on namedを自動起動するように設定 # chkconfig --list named 自動起動の設定を確認 named 0:off 1:off 2:off 3:on 4:on 5:on 6:off # ↑ここがonになっているか