DNS サーバーでドメインを公開する (CentOS 5.5): Linux の使い方


自分で取得したドメインを公開する

CentOS 5.5 では DNS サーバーとして BIND が採用されています。

DNS サーバーというのは、ドメイン名を IP アドレスに変換する辞書のようなもので、ドメイン名と IP アドレスとを対応付ける辞書そのものと、その辞書を利用してドメイン名や IP アドレスを検索する名前解決と、2 つのものに分類できるかと思います。

これらの 2 つの役割を、DNS サーバーである BIND では行うことができるようになっています。

 

BIND のインストール

自分で取得したドメインを使用する場合には、いわゆる辞書にあたる設定を行うことになります。

CentOS 5.5 では、標準では BIND がインストールされていないようでしたので、次のようにしてインストールを行います。

yum install bind

このようにすることで、平成 22 年 12 月 11 日現在、BIND の 9.3.6-4.P1.el5_4.2 をインストールすることが出来ました。

 

BIND の設定ファイルを用意する

BIND の設定ファイルは、CentOS 5.5 では "/etc/named.conf" に用意する必要があります。

ただ、インストール直後にはこのファイルは用意されないようでしたので、最初は自分で作成する必要があります。

設定ファイルのサンプルが "/usr/share/doc/bind-9.3.6/sample/etc/named.conf" にインストールされていましたが、今回はそれは参考程度に、ゼロから設定ファイルを作成して行こうと思います。

 

まず、最終的に設定ファイル "/etc/named.conf" は次のような感じになりました。

acl localnet

{

192.168.0.0/24;

127.0.0.1;

};

 

acl slave-servers

{

192.168.0.2;

};

 

acl listener

{

192.168.0.1;

127.0.0.1;

};

 

options

{

version "unknown";

directory "/var/named";

 

pid-file "/var/run/named/named.pid";

 

recursion no;

 

allow-query

{

any;

};

 

 allow-transfer

{

slave-servers;

};

 

forwarders

{

};

 

listen-on

{

listener;

};

};

 

zone "domain.xxx.xx.jp"

{

type master;

file "data/domain.xxx.xx.jp.zone";

};

冒頭の "acl" は、設定を分かりやすくするために、特定のホストやネットワークをひとまとめにして名前を付けています。ここでは、ネットワーク "192.168.0.0/24" とホスト "127.0.0.1" (localhost) とをまとめて "localnet" という名前で扱えるようにしています。

次の "acl" では、DNS データの転送を許可するスレーブサーバーを "slave-server" としてまとめておいています。また、もう一つの "acl" では、問い合わせの待ち受けを行う IP アドレスを "listener" としてまとめておいています。

このようにして、具体的な IP アドレスの値は設定ファイルの最初の方に持ってきています。何かの際に IP が変更になった場合に、あちこちに無関係に散らばっているよりも修正しやすくなると思います。

 

その後の "option" からが、DNS サーバーの動作にかかわる設定になります。

version BIND が外部からの問い合わせに対して通知するバージョン情報です。"unknown" を設定して、具体的なバージョン情報を相手に伝えないようにしておきます。
directory ドメインのレコードを記載するゾーンファイルを保存する基底となるディレクトリーです。CentOS 5.5 の BIND では "/var/named" に保存場所が用意されていましたので、それを指定しておくことにしました。
pid-file BIND の起動状態を管理するためのプロセス ID ファイルです。CentOS 5.5 の BIND では "/var/run/named" というディレクトリーが用意されていましたので、それを使って "/var/run/named/named.pid" を使用することにします。
recursion BIND で、自身が管理しているドメイン以外の問い合わせがあった場合に、他の DNS サーバーを使って検索を行うかを設定します。第三者に対して公開してしまうと悪用される恐れがあるので、今回は "no" を設定しておきました。
allow-query 誰に対して DNS 検索を提供するかを指定します。今回は、世界中のだれもが自分のドメインを検索できるように "any" を設定しています。身内だけで使う場合や、"recursion" を "yes" にした場合には、ここで利用可能なクライアントを限定する必要があります。
allow-transfer この DNS に登録されているレコード情報を複製しても良い相手を指定します。上記の例では "slave-servers" (192.168.0.2) を指定していますので、この 192.168.0.2 のサーバーが、このサーバーのスレーブサーバーとなれることを意味しています。
forwarders 検索されたドメインが自分自身に登録されていない場合に、その検索を別の DNS に委ねる場合に指定します。特定のドメインだけ別の DNS にゆだねたい場合には、zone 設定の中で forwards を設定します。
listen-on この DNS サーバーが問い合わせを待ち受ける IP アドレスです。今回の例では "listener" ('192.168.0.1 と 127.0.0.1) が指定されています。指定しない場合には、すべての IP アドレスで問い合わせの待ち受けを行うことになります。

このように DNS の動作に係る設定と合わせて、この "/etc/named.conf" では、どのドメインの情報(レコード)を扱うかといったゾーン情報も併せて登録して行きます。

 

それが上記の例にある "zone" で始まる設定になります。

"zone" に続けて、扱いたいドメインを設定して、その種類やデータファイル名を設定します。上記の例では "DOMAIN.XXX.XX.JP" が扱うドメインということになります。

type ここではこのゾーン情報が原本であるか複製であるかを明示します。今回の例では "master" なので、原本、すなわちマスターサーバーであるということになります。ここを "slave" にすることで、複製、すなわちスレーブサーバーとして動作することになります。
file ドメインのレコードを記載するゾーンファイルを保存するファイル名です。CentOS 5.5 の BIND では "/var/named/data" に保存場所が用意されていました。"options" の設定で既定を "/var/named" としてありますので、そこからの相対パスとして "data/domain.xxx.xx.jp.zone" を指定しています。

通常は、このような形で指定します。

もし、特定のドメインだけを転送したい場合には、"type" を "forward" にして、"forwarders" として転送先の DNS サーバーを指定する感じになります。

ゾーンファイルを用意する

"/etc/named.conf" の中で指定したゾーンファイルの設定も必要になります。

今回は "/var/named/data/domain.xxx.xx.jp.zone" を "domain.xxx.xx.jp" のゾーンファイルとして指定しましたので、そのファイルを作成します。

 

作成の際の注意点としては、FQDN (フルドメイン名) の場合には最後にドット ( "." ) を付けることでしょうか。最後のドットを付けない場合は、その後にこのゾーンが扱うドメイン名が暗黙的に付加されます。また、このゾーンが扱うドメインそのものを示す場合は "@" を指定することになるといったところでしょうか。

あと、各行冒頭のレコード名を省略した場合には、直前のレコード名が指定されたことと同じになるようなので、その辺りも注意が必要かもしれません。

 

この辺りに注意して、例えば一般的な Web とメールの設定をすると、次のような感じになります。

$TTL 3600

 

@    IN SOA    ns1.domain.xxx.xx.jp. admin.domain.xxx.xx.jp. (

2010121201    ; serial

6m    ; refresh

3m    ; retry

4w    ; expiry

1d    ; minimum

)

 

    IN NS    ns1.domain.xxx.xx.jp.

    IN NS    ns2.domain.xxx.xx.jp.

 

ns1    IN A    192.168.0.1

ns2    IN A    192.168.0.2

 

@    IN MX 10    mail

@    IN TXT    "v=spf1 +mx +a ~all"

 

www    IN A    192.168.0.3

 

mail    IN A    192.168.0.3

 

smtp    IN A    192.168.0.3

pop3    IN A    192.168.0.3

冒頭の "$ttl" というのは、ゾーンに登録されている各レコードの寿命を秒で表しています。

このレコードを検索した他のサーバーが、ここで指定された時間を限度にそのレコードを利用するため、IP アドレスを変更した場合など、ここに登録された時間は新しい情報が伝わらない可能性があります。

 

続いて "SOA" レコードの登録です。SOA レコードは、そのドメインの基本的な情報を記載するレコードになります。

冒頭に "@" が指定されていますので、これはドメイン "domain.xxx.xx.jp" に設定されるレコードとなります。

続けて最初に、このドメインを扱うプライマリ DNS サーバーを指定します。通常は、マスターサーバーである自分自身を指定することになると思います。上記の例では FQDN (フルドメイン) での指定となっていますので、最後のドットが肝心です。また、今回はこのゾーンで扱うドメインと同じドメインですので、単に "ns1" という形で指定しても大丈夫です。

そして、このドメインの管理者メールアドレスを指定します。メールアドレスは通常 "admin@domain.xxx.xx.jp" というような形式になりますが、ここでは最初の @ をドットに置き換える必要があることと、フルドメインでの指定の場合は最後にドットを付けるというところが注意です。

その後に括弧を記載しますが、この括弧は同じ行にないとエラーになってしまうようです。自分にとっては不恰好に見えますが、ここは我慢して同じ行の最後に開き括弧を記載しておきます。

括弧内には、次の 5 項目を指定していきます。

serial このゾーンの版番号のようなものを指定します。ゾーン内のレコード情報を追加・削除・更新した場合には、この番号を増加させる必要があります。通常は "YYYYMMDDnn" という形で、西暦年月日 (YYYYMMDD) とその日での通し番号 (nn) にすることで、管理しやすくなると思います。
refresh スレーブサーバーの更新タイミングです。ここでは、スレーブサーバーが更新の有無("serial" 値の増加)を調べる周期の目安を秒単位で指定します。
retry スレーブサーバーが、何らかの通信障害でマスターサーバーからの情報取得に失敗した場合に、何秒後に再度取得を試みるかを指定します。原則として "refresh" の整数分の 1 の値を指定することになるそうです。
expire スレーブサーバーがマスターサーバーから情報を取得できない場合に、スレーブサーバーが保持しているレコード情報を破棄するタイミングを秒単位で指定します。2 から 4 週間くらいが設定の目安になるようです。
minimum このゾーンが扱うレコードの既定の TTL を秒単位で指定します。冒頭の $TTL と用途が被る感じですが、BIND 9.3.6 の環境で調べてみたところ、どうやら $TTL は "SOA" も含めた登録したレコードに優先して設定される生存期間なのに対し、SOA に設定した "minimum" は、登録されていないレコードに対して問い合わせがあった場合に、存在しないことを示す情報の生存期間として使用されるようでした。

このような感じで設定を行います。

また、余談になりますが、もし "serial" 番号を間違って大きな値にしてしまった場合には、次のような手順を踏んで元に戻すといいそうでしたので、備忘録として記しておこうと思います。

  1. 間違った "serial" 値に 2,147,483,647 を加えます。
    加えた値が 4,294,967,296 (符号なし 32 ビット値の最大) を超えた場合は、この 4,294,967,296 を引いた値を使用します。
  2. BIND を再起動します。
  3. "refresh" で指定した時間の 2 倍の時間が経過するのを待ちます。
  4. シリアル番号を適切な状態に戻します。
  5. BIND を再起動します。

 

SOA レコードの次は、"NS" レコードの登録を行っています。

これは、このゾーンに割り当てられたドメインを管轄している DNS サーバーを登録するという意味があります。マスターサーバーはもちろんのこと、スレーブサーバーも使用している場合には、それもここで登録する必要があります。

今回は FQDN で指定していますが、今回のようにゾーンが扱うドメインと同じドメインに所属する DNS サーバーの場合には、それぞれ "ns1" や "ns2" といった形で、ドメイン部分を省略して指定することも可能です。

 

続いて、"A" レコードで "ns1" と "ns2" とを登録しています。

これは、"ns1.domain.xxx.xx.jp" の IP アドレスが "192.168.0.1" であることを登録しています。このように、ドメイン名と IP アドレスとの関連付けを行いたい場合に、この "A" レコードを使用します。

後の方に出てくる "www" や "smtp", "pop3" といったレコードも、その名前と IP アドレスとを関連付けるために登録されています。

 

他に出てくる "MX" と "TXT" レコードですが、こちらはメールサーバーに関するレコードとなります。

"MX" レコードはメールサーバーを運用するために必須なレコードで、このドメイン宛のメールを配信するためのメールサーバーを登録します。ここでは "mail" と指定していますので、このドメイン宛のメールは "mail.domain.xxx.xx.jp" に配信せよという意味になります。

ちなみに、この行の冒頭に "@" が指定されていますので、このドメイン宛のメールというのは "xxxx@domain.xxx.xx.jp" というような宛先のメールということになります。"xxx@post.domain.xxx.xx.jp" といったメールアドレスを使いたい場合には、"@" ではなく "post" に対して MX レコードを登録する運びになります。

 

もう一つの "TXT" レコードについてですが、こちらは必須ではありません。これは "SPF" というメールの出所を主張するための仕組みで使用されるレコードになります。

ここではこのドメイン (FQDN) と同名の "MX" レコードと "A" レコードに記されているサーバーから送信されてきたメールは確かで、それ以外のメールは正しいとは限らないといった意味合いをテキストで登録したものになっています。

これを踏まえて迷惑メールかどうかの判断をするところもありますので、メールの送信元が決まっている場合には、このような TXT レコードも用意しておくと良いかもしれません。

 

BIND を起動する

設定ファイル "/etc/named.conf" やそこに記載したゾーンファイルの準備が完了したら、それらの内容に間違いがないか、次のようにして設定内容が正しいかどうかを確認できます。

service named configtest

これで、何も表示されないか、"zone domain.xxx.xx.xx/IN: loaded serial 2010121201" といった記載が羅列される感じなら、設定が問題なく行えた感じになると思います。

 

設定内容に間違いがなければ、次のようにして DNS サーバーを起動させます。

service named start

今後も Linux 起動時に DNS サーバーを自動起動する場合には、次のようにしておきます。

chkconfig named on

これで DNS サーバーの設定と稼働が整いました。

DNS サーバーは 53/UDP と、時には 53/TCP を使用しますので、iptables 等によるパケットフィルターが有効になっている場合にはその設定を調整する必要があると思います。送信元は任意のポートを使用するので、任意のポートから 53 番への通信を許可する感じになります。