OXY NOTES

BIND DNS サーバの正引き用ゾーンファイルと、逆引き用ゾーンファイルの作成方法

BINDをWebminとコマンド、どちらでも設定できるように解説します

それでは、実際に「BIND DNS サーバ」の設定をしていきます。

これから先は、「ドメインがexample.com」、「IPが192.168.0.1」という仮定で設定していきます。自分のサイトに合わせて適宜、読み替えてください。

また、このサイトではwebminを利用した編集方法と、通常のコマンドを利用した編集方法の2つの方法を併記しています。編集しやすい方法を選んでください。


BINDの主要設定ファイルを作成

ゾーンファイルを作成する前に、BINDの初期設定をします。
Webminにアクセスして左のメニューから「サーバ > BIND DNS サーバ」をクリックしてください。

インターネット ネーム サーバとして設定し、root サーバ情報をダウンロード」を選択し、「主要設定ファイルを作成しネームサーバを起動」ボタンをクリック。

これは世界中にあるルートDNSサーバのリストを更新する作業です。通常はコマンドからリストを取得するスクリプトを実行しますが、Webminならワンクリックでリストを取得できます。
これで「主要設定ファイル(ゾーンファイルなど)」が作成されました。

ちなみにルートゾーンに関する情報は「/etc/db.cache」に保存されています。(chroot化されている場合は/var/named/chroot/etc/db.cache)

コマンドでルートネームサーバの情報を取得する方法

Wgetコマンド」を利用して「こちらのサイト」からルートネームサーバはの情報を取得します。

まずはrootユーザにログインします

※コマンドラインの見方

コマンド」「引数、その他」「コメント」「#(rootユーザ)」「$(一般ユーザ)」

$ su -
パスワード: ←rootユーザのパスワードを求められるので入力

ファイルをダウンロードするディレクトリ「/etc」に移動。(chroot化されている場合は/var/named/chroot/etc)

# cd /etc

wgetでルートネームサーバの情報(db.cache)を取得

# wget ftp://ftp.nic.ad.jp/internet/rs.internic.net/domain/named.cache

named.cache」を「db.cashe」へリネーム

# mv named.cache db.cache

BINDの設定ファイルにdb.cacheのパスを記述

BINDの設定ファイル「/etc/named.conf」を開いて以下のようにパスを記述します。

# vi /etc/named.conf
zone "." {
	type hint;
	file "/etc/db.cache";
	};

1.Webminで正引き用ゾーンファイルの作成

まずはWebminで設定する方法を解説します。
既存の DNS ゾーン」にある文字の「新規のマスターゾーン作成」をクリック。

2.正引き用ゾーンファイルの編集

マスター ゾーンの作成画面で
ゾーンの種類」で「順引き (名前をアドレスに)」にチェック。

ドメイン名 / ネットワーク」に「example.com」を指定(取得したドメイン)

マスター サーバ」に、ネームサーバを表す「ns.」を付けて「ns.example.com」を指定。(マスターサーバとはプライマリネームサーバのことです。)

E メール アドレス」で管理者のE-mailアドレスを入力します。(例:info.example.com.)通常メールアドレスはユーザーネーム後に@を付けますが、ゾーンファイルの書式は「.(ドット)」の点に注意してください。また、理由は後述しますがexample.comの後にも「.(ドット)」が入ります。
他の設定はいじらずに「作成ボタン」をクリック

3.正引き用ゾーンファイルにアドレスレコードを指定

マスター ゾーンの編集画面で「アドレス」をクリック。アドレス レコード画面を出す。

レコード名」に上で作成したネームサーバ「ns.example.com.」を入力。
アドレス」に「192.168.0.1
作成」ボタンをクリック

ここで注意していただきたいのが、ドメインの後ろにある「.(ドット)」です。

これはゾーンファイル独自の書式で、最後に「.(ドット)」を付けない場合、ゾーンのドメイン名が追加されます。つまり「ns.example.com」と入力すると「ns.example.com.example.com」という意味になってしまいます。

逆にこの書式を利用して「ns」だけ入力すれば「ns.example.com.」と入力したのと同じ結果が得られます。全て記載したほうがいいか、省略したほうがいいかは好みで選んでください。当サイトではわかりやすくするため、省略せずに記入していきます。

同じようにして以下の4つを作ってください。

レコード名 アドレス 説明
ns.example.com. 192.168.0.1 上で作成したプライマリネームサーバのドメイン
2nd.example.com. 192.168.0.1 セカンダリネームサーバのドメイン
example.com. 192.168.0.1 サイトのドメイン
mail.example.com. 192.168.0.1 メール用のドメイン

ネームサーバやメールサーバにそれぞれ個別のIPが割り振られている場合は、それぞれに対応するIPを記述します。
今回はVPSから割り当てられたグローバルIPアドレスが1つで、ネームサーバもメールサーバも同じシステムで管理するため、同一IPを指定しています。

上記の記述を追加すると、以下のように表示されます。

4.正引きゾーンファイルにセカンダリネームサーバの追加

再び「マスター ゾーンの編集」画面を開いて、次は「ネーム サーバ」を開きます

ネーム サーバ レコード」を確認してください。先ほど設定した「ns.example.com」があるはずです。これがプライマリネームサーバです。

ここに「セカンダリネームサーバ」を追加します。
ゾーン名」に「example.com.」、「ネーム サーバ名」に「2nd.example.com.」を入力して「作成」ボタンをクリックします。

5.正引きゾーンファイルにメールエクスチェンジレコードの追加

マスター ゾーンの編集」で「メール サーバ」をクリック
メール サーバ レコード」を開く
レコード名」に「example.com.
メール サーバ」に「mail.example.com.
優先度」に「10」を入力します。

メールの優先度について

ここで設定する優先度ですが、負荷の分散のために複数のメールサーバを構築する際に利用します。小さい数字を指定したメールサーバが優先され、1番がプライマリメールサーバの「10」、次がセカンダリメールサーバの「20」、その次が「30」といった具合に指定します。この数字のことを「プリファレンス値」といいます。

6.正引きゾーンファイルにCNAMEレコードの追加

マスター ゾーンの編集」で「ネーム エイリアス」をクリック。wwwが付いたアドレスと、ftp用のアドレスを追加します。
レコード名「www.example.com.」、実名「example.com.
レコード名「ftp.example.com.」、実名「example.com.

CNAMEレコード(キャノニカルネームレコード)について

CNAMEレコードに指定する「ネーム エイリアス」とは「別名」のことです。この例では「www.example.com」でアクセスした場合も、「ftp.example.com」でアクセスした場合も、「example.com」にアクセスしたことになります。

上で「example.com」は「192.168.0.1」と設定したため、「www.example.com」と「ftp.example.com」は「192.168.0.1」という名前解決がされます。


正引きゾーンファイルの設定が正しく行われているかチェック

ゾーンファイルの書式は特殊で、何度も設定するものではないので、おぼろげな記憶で正確に記述することは難しいものです。そのため、BINDには文法のチェックツールが用意されています。
(チェックするのは文法的なエラーのみで、IPやホスト名の間違いはチェックされません。)

Webminでチェックする方法

サーバ > BIND DNSサーバ」にて、各ゾーンファイルをクリック。ページ下部にある「Check Records」というボタンをクリック。

 

下の画像のように「No errors were found in the records file」と表示されれば間違いがありません。

 

コマンドでのチェック方法

書式は「named-checkzone ホスト名 ゾーンファイル」となります。

# named-checkzone example.com /var/named/chroot/var/named/example.com.hosts
zone example.com/IN: loaded serial 1347319070
OK

サイト名を確認して、最後にOKと出ればエラーはありません。

chroot化していない場合のコマンド

chroot化していなければ、ゾーンファイルのパスは以下のようになります。

# named-checkzone example.com /var/named/example.com.hosts

正引きのゾーンファイルの記述例

Webminで設定したゾーンファイルは以下の様な書式で書き出されています。
グローバルIPアドレスが1つの例です。ゾーンファイルでは「;(セミコロン)」の後の記述はコメントとして扱われます。

通常「/var/named」、chroot化していれば「/var/named/chroot/var/nemed」ディレクトリに、「example.com.hosts(ホスト名.hosts)」という名前で保存されています。
Webminを利用せずに、直接viエディタで下記のファイルを作成しても、同じように動作します。

ドメインを省略しない場合の例

$ttl 38400
example.com.	IN	SOA	ns.example.com. info.example.com. (
			1347319069	; シリアル番号
			10800		; リフレッシュ間隔
			3600		; リトライ間隔
			604800		; ゾーンの有効期
			38400 )		; ネガティブキャッシュの有効期間
example.com.		IN	NS	ns.example.com.	 ; このゾーンのプライマリマスタ
example.com.		IN	NS	2nd.example.com.	; このゾーンのセカンダリマスタ
example.com.		IN	MX	10 mail.example.com.	; メール用
ns.example.com.		IN	A	192.168.0.1
example.com.		IN	A	192.168.0.1
2nd.example.com.		IN	A	192.168.0.1
mail.example.com.	IN	A	192.168.0.1
www.example.com.		IN	CNAME	example.com.	; web用エイリアス
ftp.example.com.		IN	CNAME	example.com.	; ftp用エイリアス

ドメインを省略した場合の例

ドメインを省略すると以下のようになります。記述は違いますが、上のゾーンファイルと全く同じ指定になります。
プライマリネームサーバのアドレスレコードを例に出せば、第3レベルドメイン「ns」の後に「.(ドット)」を記述していないため「ns.example.com.」と記述したのと同じ設定になります。

$ttl 38400
example.com.	IN	SOA	ns.example.com. info.example.com. (
			1347319069	; シリアル番号
			10800		; リフレッシュ間隔
			3600		; リトライ間隔
			604800		; ゾーンの有効期
			38400 )		; ネガティブキャッシュの有効期間
		IN	NS	ns.example.com.	 ; このゾーンのプライマリマスタ
		IN	NS	2nd.example.com.	; このゾーンのセカンダリマスタ
		IN	MX	10 mail.example.com.	; メール用
ns		IN	A	192.168.0.1
		IN	A	192.168.0.1
2nd		IN	A	192.168.0.1
mail		IN	A	192.168.0.1
www		IN	CNAME	example.com.	; web用エイリアス
ftp		IN	CNAME	example.com.	; ftp用エイリアス
ドメインを省略した際のMXレコードの記述

どういった具合かはわかりませんが、MXレコードだけドメインを省略すると正しく認識されない場合があります。
その際はMXレコードの値だけ上記の省略していない形式で記述してください。

example.comの例)
example.com.		IN	MX	10 mail.example.com.

ゾーンファイルの「シリアル番号」について

シリアル番号」とはゾーンファイルのバージョンが最新のものか確認するための番号です。
設定ファイルが更新されるごとに「シリアル番号」の数字を上げていく必要があります。
例えば「100」という「シリアル番号」のゾーンファイルを上位DNSサーバや、セカンダリサーバに転送した後に、「99」という「シリアル番号」のゾーンファイル転送しても、各サーバは無視します。

Webminでは各レコードを編集するごとに1つずつシリアル番号が進みます。
また各ゾーンファイルを直接編集する場合、「Increase serial number automatically」という項目にチェックが入っています。このチェックが入った状態で更新された場合も、自動で「シリアル番号」が1つ進められます。

BINDで推奨されているシリアル番号の付け方

BINDにて推奨されている方法は、2012年10月20日という年月日から「20121020」を抜き出し、その後にバージョンを示す「01」を足して「2012102001」とします。同じ日にゾーンファイルを編集したら「01」を「02」にして「2012102002」とします。この書式では、同じ日に99回まで編集が可能です。
もちろん編集するごとに番号さえ増やせば、自由な数字で管理しても構いません。

TTLについて

TTL」とは「Time to live」の頭文字を取ったもので、設定が有効な時間を表します。DNSにおけるTTLとは、「DNSサーバにドメインとIPの関係をキャッシュさせる期間」を指定するものです。

世界中の問い合わせを全てルートネームサーバで処理すれば、すぐにパンクしてしまいます。そのため、1度取得したホスト名とIPの関係を、各DNSサーバはキャッシュとして保存して、応答に利用しています。

キャッシュする期間は、「BIND」のデフォルトだと「38400秒(1日)」に設定されています。つまり、「問い合わせを受けたゾーンファイルの情報が、取得から1日以内ならキャッシュの情報を返し、1日以上経っていたらキャッシュを消して上位DNSサーバに問い合わせる」という設定です。
この「1日以上経っていたら」というのが曲者で、キャッシュされるタイミングはDNSサーバによって異なるため、ゾーンファイルの情報を更新した場合、1時間で反映されることもあれば、しっかりと1日かかることもあります。

そのためIPやドメインの変更が予想される時は、変更の1週間前にはTTLを3600(1時間)に変えておくと、いざ変更があった時に各DNSサーバの反映が早くなります。

特に注意しなくてはならないのはDNSサーバの引越しです。親の権威サーバで引越し先のDNSサーバの指定をしても、引越し元のDNSサーバで古いゾーンデータを提供し続けると、キャッシュの書き換え時に古いゾーンデータで書き換えられてしまいます(権威サーバが重複するため)。そうなるといつまで経っても引越し先のDNSサーバの情報に置き換わりません。

そのため、DNSサーバの引越しの際は、

  1. まず引越し先・引越し元、両方のDNSサーバを運用。
  2. 親の権威サーバで引越し先のDNSサーバの指定。
  3. 引越し元のゾーンデータを引越し先のDNSサーバのものに変更。
  4. キャッシュが置き換わったことを確認後、引越し元のDNSサーバを停止。

という流れで移行するとスムースに引越しできます。

ゾーンデータが世界中のDNSサーバに登録・更新されていく状況を一般に「DNSの伝播(でんぱ)」もしくは「DNSの浸透」といいます。
残念ながら、早く伝播させる方法はないので、反映されるまで気長に待ちましょう。


TTLの変更方法

まずWebminでTTLを変更する方法です。
新規にゾーンファイルを作成するときに適応される、「デフォルトのTTL」を指定します。
BIND DNS サーバ>ゾーン デフォルト>TTL時間のデフォルト」とたどると変更できます。

これは新規に作ったゾーンファイルから有効になるデフォルトの設定で、既にゾーンファイルを作成済みの場合は、この変更は反映されないので注意。

各ゾーンファイル個別のTTLを設定する場合

こちらは各ゾーンファイル個別のTTLを設定する方法です。先ほど設定したBINDデフォルトのTTLよりも、こちらの設定が優先されます。
既に各ゾーンファイルを設定済みの場合は、TTLを変更したいゾーンファイルをクリック。

マスター ゾーンの編集」画面で「ゾーン パラメータの編集」をクリックして編集します。

BINDのTTLはデフォルトで以下の設定になっています

リフレッシュ時間(上位DNSへゾーンの情報を送信する間隔) 10800(3時間)
転送再試行時間(ゾーン情報の送信が失敗した場合の再試行する間隔) 3600(1時間)
ttl(キャッシュファイルの更新間隔) 38400(1日)
期限切れ時間(ゾーン情報が取得できなかった場合の有効期間) 604800(1週間)

逆引きのマスターゾーンを作成する

これから逆引きの設定をしていきますが、VPSや専用サーバの場合には逆引きの権限がホスティング会社から移譲されていないことがほとんどです。
Saasesやさくらの場合はコントロールパネルから逆引きを指定します。会社によっては権限の移譲を依頼する場合もあれば、代理で設定を依頼する場合もあります。そのへんは各社のマニュアルで確認してください。

逆引きの権限が移譲されていなければ、BINDで逆引きを設定しても意味はありません。しかし、特に実害はないので「権限を移譲されて、自分で設定する場合はこのようにする」という感覚で作成してみてください。

SaasesのOsukiniサーバで逆引きを設定する方法

まずはOsukiniサーバのコントロールパネルで「逆引き」を設定する方法を解説します。

ユーザーページから「マイページ」にログイン。「現在ご利用中のサービス」にあるサービス名をクリックします。

ページ下部の「逆引き設定1」にドメインを入力して「登録」ボタンをクリック。

画面が更新されれば設定終了です。


Webminで逆引き用ゾーンファイルを作成

基本的な流れは正引き用のゾーンファイル作成時と同じです。

1.新規逆引き用ゾーンファイルを作成

正引きの時と同じように「新規のマスターゾーンを作成」をクリックして今度は「逆引き (アドレスを名前に)」にチェック。逆引きの場合もホスト名の後に「.(ドット)」を忘れないようにしてください。
ドメイン名 / ネットワーク」に「192.168.0.1」※
マスター サーバ」に「ns.example.com.」(最後に.〈ドット〉を忘れずに)
E メール アドレス」に「info.example.com.

※通常逆引きの時はIPを逆さまにして「1.0.168.192.in-addr.arpa」等と記述しますが、Webminの設定画面では普通に「192.168.0.1」と入力してください。

 

マスター ゾーンの編集」で「逆引きアドレス」をクリック。
この際に注意しなければいけないのが、正引きの場合は「IP 192.168.0.1」に対してexample.comwww.examle.comなど複数のドメインを指定しました。しかし逆引きの場合は仕組み上「1つのIPアドレスに対して設定できるドメインは1つだけ」です。

2.逆引き用ゾーンファイルにPTRレコード(ポインタレコード)の登録

正引きのアドレスレコードは、「レコード名」と「アドレス」を記述しましたが、逆引きのアドレスレコードは「アドレス」と「ホスト名」を入力します。
例)192.168.0.1、ns.example.com.

3.逆引き用ゾーンファイルにネームサーバを指定

ネームサーバも正引きと同じようにプライマリネームサーバセカンダリネームサーバの2つを登録します。
ゾーン名」に「空欄」、「ネーム サーバ名」に「ns.example.com.
ゾーン名」に「空欄」、「ネーム サーバ名」に「2nd.example.com.
とします。

ここで注目して欲しいのが「レコード名」が「1.0.186.192.in-addr.arpa.」と逆になっていますが、これが逆引きの正しい書式です。

正引きの場合、example.comというアドレスを解決するために「comを管理するDNSサーバを探し、次にexample.comを管理するDNSサーバへ」という順番で探します。

逆引きの場合も同じように後ろのブロックから名前を解決していきます。
まず「arpa」というネームサーバを探し、次に「in-addr」、次にIPアドレスの先頭である「192」、次に…という順番で探すため、このような書式になっています。

 

以上で逆引きの設定は終了です。正引きのときと同じように設定のチェックを行なってください。
問題が内容なら「BIND DNS」のウィンドウで「Apply Configuration」をクリックして設定を有効にします。

 

コマンドでBINDの設定を有効にするには再起動を行います。
再起動のコマンドは以下の通りです。

# /etc/init.d/named restart

逆引きのゾーンファイルの例

上で設定したゾーンファイルは以下の書式で書き出されています。
逆引き用ゾーンファイルも、正引き用ゾーンファイルと同じディレクトリで管理されています。通常「/var/named」、chroot化していれば「/var/named/chroot/var/nemed」などに、「192.168.0.1.rev(IPアドレス.rev)」という名前で保存してあります。

$ttl 38400
1.0.168.192.in-addr.arpa.	IN	SOA	ns.example.com. info.example.com. (
			1350036746
			10800
			3600
			604800
			38400 )
1.0.168.192.in-addr.arpa.	IN	NS	ns.example.com.
1.0.168.192.in-addr.arpa.	IN	NS	2nd.example.com.

1.0.168.192.in-addr.arpa.	IN	PTR	ns.example.com.

逆引きも正引きと同じく各リソースレコードの「1.0.168.192.in-addr.arpa.」という記述は省略可能です。

以上で逆引きの設定は終了です。


BIND設定ファイルへの正引き、逆引きゾーンファイルの記述例

コマンドを利用した初期設定時に「/etc/named.conf」にルートゾーンファイルのパスを追加しましたが、正引き、逆引きゾーンファイルの指定方法を解説します。

それぞれ以下のように指定してください。

//ルートネームサーバのパス
zone "." {
        type hint;
        file "/etc/db.cache";
        };

options {
        # ipv6の機能を停止
        listen-on-v6 { none; };
};

//正引きゾーンファイルのパス
zone "example.com" {
        type master;
        file "/var/named/example.com.hosts";
        };

//逆引きゾーンファイルのパス(in-addr.arpa指定時にIPが逆になっている点に注意)
zone "1.0.168.192.in-addr.arpa" {
        type master;
        file "/var/named/192.168.0.1.rev";
        };

これは動作させるのに最低限の設定です。
この設定のまま動作させるのは非常に危険なため、安全なDNSサーバを運用するために「DNS Amp攻撃の解説と、踏み台にされないためのBIND DNSの設定」を参照してください。


サーバ再起動時にBINDが自動起動するように設定

Webサーバを構築する場合はBINDが必ず必要になるため、システムの起動と同時にBINDも立ち上がる設定にします。Windowsでいうスタートアップ項目、Macでいうログイン項目と同じです。

WebminでBINDの自動起動を設定する方法

システム > 起動およびシャットダウン」をクリックする。
アクション」行の「named」にチェックを入れる。
ページ下部の「選択したものをブート時に開始する」ボタンをクリック。

コマンドでBINDの自動起動を設定する方法

rootユーザでログイン
(前ユーザーの環境変数を削除するため-(ハイフン)を付けます)

$ su -
パスワード: ←rootユーザのパスワードを求められるので入力

chkconfigコマンドでランレベルを設定

# chkconfig named on

自動起動が有効になっているか確認します

# chkconfig --list named
named           0:off   1:off   2:on    3:on    4:on    5:on    6:off

3がONになっていれば次回ブート時に自動で起動します。

ランレベルについて補足説明

当サイトで取り上げるのは今回が初めてなので、「ランレベル」について解説します。
ランレベル」とは「動作モード」のことで、OSブート時の動作を指定することができます。ランレベルは上記のように「chkconfigコマンド」で切り替えることができます。

Redhat系のOSにおけるランレベルの定義

0 停止
1 シングルユーザー
2 未使用/ユーザー定義可能
3 マルチユーザー、コンソールログインのみ
4 未使用/ユーザー定義可能
5 ランレベル 3 + Xディスプレイマネージャ起動
6 リブート

35の「コンソールログイン」と「Xディスプレイマネージャ」はわかりにくい表現ですが、「3はCUI(テキストモード)での起動」、「5はGUI(グラフィカルモード)での起動」と考えてください。

お疲れ様です。これでBIND DNSサーバの設定は終了です。
しかし、これだけでは名前の解決はできません。次は「レジストリへの権威ネームサーバの登録と、名前解決に関するネットワークの設定」です。