DNSサーバとは・BIND9とは
DNS(Domain Name System)サーバとは、インターネット上のドメイン名(neoluxinc.comなど)をIPアドレス(118.243.116.89など)に変換したり、
逆に、IPアドレスをドメイン名に変換するコンピュータのことです。
BIND(Berkeley Internet Name Domain)とは、その名前の通り、
カリフォルニア大学バークリー校で開発されたDNSサーバ用のフリーソフトウェアであり世界で最も多く利用されているDNSサーバソフトウェアです。
BIND9は、それまでBIND8が抱えていた大きな問題点を解決するため、新たに書き起こされ、2000年からリリース開始されたもので、
セキュリティ、スケーラビリティ、メンテナンス性、IPV6への対応などの点が改良されました。
FreeBSD8.0のアプリケーションをインストールする前にBIND9
FreeBSD8.0のアプリケーションは、portsコレクションからインストールすることもできますし、単独でインストールすることもできます。
portsコレクションからインストールするのは極めて簡単ですので、portsコレクションからインストールすることをお勧めします。
portsコレクションからののインストールでは、fetchコマンドによりインターネットサイトからファイルをダウンロードしますので、
名前解決ができないとエラーになってしまいます。
既にネットワーク内に DNS サーバが少なくとも1台以上ある場合は、FreeBSD8.0をインストールする際に、
"Network Configuration"でネームサーバとして1台目のDNSサーバのIPアドレスを設定(FreeBSDのインストール時に設定)すれば、
portsコレクションから問題なくインストールできます。
しかし、ネットワーク内に DNS サーバが1台もない場合は、ports コレクションからインストールすることはできませんので、
単独でインストールするしかありません。
".com"や".biz"のように、単独のDNSでは登録されないドメインもあります。
2台目以降のDNS(スレーブサーバ)を無料で利用できるサービスもありますが、
固定IPアドレスを2個以上お持ちであれば、自分で複数台のDNSを持つのも良いでしょう。
BIND9のインストール
BIND9を単独でインストールする場合
新規にFreeBSD8.0をインストールした場合は、
BIND9はインストールされていませんので、このアプリケーションだけはports以外の方法でインストールする必要があります。
まずは、
ISC(Internet Systems Consortium)のBINDのサイトから、
最新のBIND9(2010年3月時点ではbind-9.7.0-P1.tar.gz)を、別のPC(例えばWindowsPC)でダウンロードし、FTPでサーバの/usr/srcへ転送します。
FTPは、デフォルトではrootが使用できませんので、あらかじめ/usr/src の所有者をFTPユーザに変更しておく必要があります。
BIND9の展開およびインストールは以下の通り至って簡単です。
表1.1 BIND9の展開とインストール
# cd /usr/src
# gunzip bind-9.7.0-P1.tar.gz
# tar xvf bind-9.7.0-P1.tar
# cd bind-9.7.0-P1
# ./configure
# make
makeでエラーが発生してないことを確認後、
# make install clean
BIND9をports コレクションからインストールする場合
既にネットワーク内に DNS サーバが少なくとも1台以上ある場合は、BIND9 を ports コレクションからインストールすると以下の通り極めて簡単です。
表1.2 BIND9のports コレクションからのインストール
# cd /usr/ports/dns/bind98
# make
"Options for bind98 9.8.0.1" の画面はデフォルト設定のままにしておく
makeでエラーが発生してないことを確認
# make install clean
BIND9の設定 : named.confの設定
BIND9の構成ファイルは、/etc/namedb/named.confです。
ただし、namedb -> /var/named/etc/namedb のようにシンボリックリンクされていますので、
その実体は、/var/named/etc/namedb/named.conf にあります。
この named.confファイルには、以下の設定項目が含まれます。
- key "鍵名称" { ... }(keyステートメント); - 暗号化鍵であり、鍵生成アルゴリズムと秘密鍵が格納されます。
- contorols{ ... }(contorolsステートメント); - rndc(Remote Name Daemon Control)により制御を許可するネットワークおよび暗号化鍵(rndc-key)の設定。
- options{ ... }(optionsステートメント); - 動作するディレクトリ、プロセスID(PID)ファイル、dumpファイル、統計ファイル、ソーン転送許可IPアドレスなどの設定。
- view "internal"{ ... }(内向きviewステートメント); - ローカルネットワークからアクセスした場合の条件設定やドメインに対応するゾーンファイルの設定。
- view "external"{ ... }(外向きviewステートメント); - グローバルネットワークからアクセスした場合の条件設定やドメインに対応するゾーンファイルの設定。
- logging{ ... }(loggingステートメント); - ログ出力条件とファイルの設定。
暗号化鍵の生成とnamed.confへの設定
rndcはネットワークを介して暗号化鍵によりBIND9と安全に通信することができ、
他のサイバーやPCからBIND9の作動状態の確認や、ドメイン設定ファイルのリロードを行うことができます。
最初に、rndc 鍵生成ツール"rndc-confgen"を使用して512bitの暗号化鍵 /etc/namedb/rndc.key を生成します。
表2 "rndc-confgen"による512bitの暗号化鍵の生成
# cd /etc/namedb
# rndc-confgen -a -b 512 -r /dev/urandom -u bind
# chmod 600 rndc.key(暗号化鍵は必ずbindユーザ以外は読めないようにします)
ここで、各オプションの意味は以下の通りです。
- -a:rndc.keyファイルのみ生成する(rndc.confファイルを作らない)。
- -r /dev/urandom:乱数ファイル/dev/urandomの設定。
- -u bind:rndc.keyファイルのユーザをbindに設定。
生成された暗号化鍵ファイルrndc.keyは、BIND9の構成ファイルnamed.confのサブセットであり、
以下に示す通り、暗号化鍵生成アルゴリズム名称と対称鍵(暗号化と復号に同一鍵を用いる暗号方式の鍵)で構成されるkeyステートメントのみを含みます。
表3 暗号化鍵 /etc/namedb/rndc.key の内容
# more rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "Gh6i8CZr3....................................qV0fsCA==";
};
また、この鍵の名称"rndc-key"は、controls ステートメントで使用しますが、
controlsステートメントの項に示す通り、named.conf の中で rndc.key ファイルを"include"することができます。
controls ステートメント
controlsステートメントは、rndcにより制御を許可するネットワークおよび暗号化鍵(rndc-key)を設定します。
例えば、IPアドレスが 192.168.1.100 であるDNSサーバを、
192.168.1.0/24 というネットワークの IP アドレス(192.168.1.1~192.168.1.254)から rndc により制御する場合には、
BIND9の構成ファイル /etc/namedb/named.conf に以下の controls ステートメントを挿入します。
表4 ネットワークを介したrndcによる制御を行う場合のcontrolsステートメント
include "/etc/namedb/rndc.key";
acl localnet{ 192.168.1.0/24;
127.0.0.1;
};
controls { inet 192.168.1.100 allow { localnet; } keys { rndc-key; }; };
ここで、"acl"はアクセスコントロールリストであり、
あらかじめ"localnet"という名称でネットワーク(192.168.1.0/24)と自身(127.0.0.1)を定義し、これをcontrolsステートメントの中で使用しています。
なお、他のサーバやPCからアクセスする必要がない場合には、controlsステートメントは特に指定する必要はありませんが、
将来、ネットワークを介したrndcによる制御を行う可能性を考えて、以下のように設定しておけば良いでしょう。
表5 ネットワークを介したrndcによる制御が不要な場合のcontrolsステートメント
include "/etc/namedb/rndc.key";
controls { inet 127.0.0.1 allow { localhost; } keys { rndc-key; }; };
optionsステートメント
動作するディレクトリ、プロセスID(PID)ファイル、dumpファイル、統計ファイル、ソーン転送許可IPアドレスなどのオプションを以下のように設定します。
表6 optionsステートメントの例
options {
// Relative to the chroot directory, if any
directory "/etc/namedb"; ← BIND9が動作するディレクトリ
pid-file "/var/run/named/pid"; ← プロセスID(PID)ファイル
dump-file "/var/dump/named_dump.db"; ← dumpファイル
statistics-file "/var/stats/named.stats"; ← 統計ファイル
allow-transfer {
195.234.42.1; ← ソーン転送許可IPアドレス(即ちSvlaveネームサーバのIPアドレス:例はns0.xname.org)
・・・
192.168.1.0/24; ← ソーン転送許可ネットワーク
};
};
内向きviewステートメント
内向きviewステートメントは、ローカルネットワーク経由でアクセスした場合の条件設定やドメインに対応するゾーンファイルの設定を行います。
インターネットにアクセスする場合に別のルーターが使える環境であれば、そもそも内向き・外向きviewステートメントに分ける必要はありません。
しかし、WEBサーバを設置しても高速な光回線の下りはわずかな帯域しか使用しませんので、これを有効利用するため、
同じルーターのローカルネットワークにWEBサイト閲覧用のPCを接続するのが効率的でしょう。
この場合、自サイトをグローバルネットワーク経由で見ようとすると、ルータそのものにアクセスすることになりますので、閲覧することができません。
したがって、ローカルネットワーク経由で閲覧する必要が出てくるわけです。
まず、match-clients オプションで、このviewに該当するIPアドレスまたはネットワークを設定します。
ここで設定しているlocalnet は、表4で示した"acl"が該当します。
次に、"recursion yes"により、ローカルネットワーク経由のアクセスに対し、再帰検索を可能にしています。
再帰検索とは、ゾーンのホスト名とIPアドレスの組に関するデータベースを持ち、
このデータベースにない問い合わせが来た時、
rootネームサーバをトップとする階層構造になったネームサーバに順次問い合わせ、名前解決を行うキャッシュサーバの役割を言います。
例えば"yahoo.co.jp"という再帰問い合わせでは、rootネームサーバ → jpドメインネームサーバ → co.jpネームサーバ → yahoo.co.jpネームサーバ、
という具合に順次問い合わせて名前解決を行います。
このため、ローカルネットワークに接続したPCで、このDNSをネームサーバとして登録しておけば、
内および外にあるウェブサイトやメールサーバにアクセスできます。
さらに、このサーバには、3つの内向き正引きmasterゾーンファイル"neoluxusa.com_int.zone", "xn--neo-2w2fm74r9ke.jp_int.zone"(xn--で始まる名称は日本語ドメインです),
"sneo.biz_int.zone"が登録されており、全て/etc/namedb/masterディレクトリに配置されています。
ここでゾーンとは、ネームサーバが管理するドメインを範囲を意味します。
また、内向きviewステートメントでは、必要に応じて逆引きのゾーンファイル(ここでは"168.192.in-addr.arpa.rev")を設定できますが、特に設定しなくても問題ありません。
表7 内向きviewステートメントの例
view "internal"
{
match-clients { localnet; };
recursion yes;
zone "neoluxusa.com" {
type master;
file "master/neoluxusa.com_int.zone";
};
zone "xn--neo-2w2fm74r9ke.jp" {
type master;
file "master/xn--neo-2w2fm74r9ke.jp_int.zone";
};
zone "sneo.biz" {
type master;
file "master/sneo.biz_int.zone";
zone "168.192.in-addr.arpa" {
type master;
file "master/168.192.in-addr.arpa.rev";
};
外向きviewステートメント
外向きviewステートメントは、グローバルネットワーク経由でアクセスした場合の条件設定やドメインに対応するゾーンファイルの設定を行います。
外向きviewステートメントは内向きviewステートメントより下に位置していますので、
match-clients オプションの"any"は、残りのネットワーク経由のアクセスを意味します。
また、グローバルネットワーク経由でアクセスでは、再帰検索を行えないよう設定しています。
これは、不特定多数のマシンにキャッシュサーバとして利用され負荷が増加したり、攻撃の対象となる危険性を排除するためです。
一部のネットワークにのみ再帰検索を可能にしたい場合には allow-recursion オプションが利用できます。
内向きviewステートメントと同様、3つの外向きmasterゾーンファイル"neoluxusa.com_ext.zone", "xn--neo-2w2fm74r9ke.jp_ext.zone", "sneo.biz_ext.zone"が登録されており、
全て/etc/namedb/masterディレクトリに配置されています。
通常、ドメインの逆引きゾーン情報は、プロバイダーが設定するため、外向きviewステートメントでは正引きのゾーンファイルのみ設定することになります。
ゾーンファイルの内容については『ゾーンファイルの書き方』の項で説明します。
表8 外向きviewステートメントの例
view "external"
{
match-clients { any; };
recursion no;
zone "neoluxusa.com" {
type master;
file "master/neoluxusa.com_ext.zone";
};
zone "xn--neo-2w2fm74r9ke.jp" {
type master;
file "master/xn--neo-2w2fm74r9ke.jp_ext.zone";
};
zone "sneo.biz" {
type master;
file "master/sneo.biz_ext.zone";
};
};
その他のゾーン設定
内向きviewステートメント、外向きviewステートメントで指定したゾーン設定以外にも、
オリジナルのnamed.confには以下のようなゾーン設定が記述されています。
表9 その他のゾーン設定
// The traditional root hints mechanism. Use this, OR the slave zones below.
zone "." { type hint; file "named.root"; };
// RFC 1912
zone "localhost" { type master; file "master/localhost-forward.db"; };
zone "127.in-addr.arpa" { type master; file "master/localhost-reverse.db"; };
zone "."は、ルートネームサーバの記述であり、その詳細は/etc/namedb/named.root に記述されています。
また、zone "localhost" および zone "127.in-addr.arpa"は、localhostの正引きおよび逆引きゾーン情報であり、
ゾーンファイルは /etc/namedb/master/localhost-forward.db および /etc/namedb/master/localhost-reverse.db です。
これらは、そのまま残しておきましょう。
loggingステートメント
BIND9の基本的なログは /var/log/messages に出力されます。
しかし、以下に示す通り named.confにloggingステートメントを記述すれば、もう少しきめ細かくログ出力を制御できます。
loggingステートメントの基本的な使い方は、『channel "チャンネル名" {...}』で出力方法を指定するチャンネルを定義し、
『category "カテゴリー名" {"チャンネル名"}』でカテゴリーごとにチャンネル名を指定すれば、チャンネル名の定義の通りログ出力することができます。
表10 loggingステートメントの例
logging {
//channelで出力方法を指定する
channel "log_default" {
file "named.log" versions 3 size 10m; ← named.logファイル:10MBのファイルを3世代までローテーションする
severity info; ← ログレベルinfo以上のログを表示
print-time yes; ← 日時をログに表示
print-category yes; ← カテゴリをログに表示
};
channel "log_security" {
file "security.log" versions 3 size 10m; ← security.logファイル:10MBのファイルを3世代までローテーションする
severity info;
print-time yes;
print-category yes;
};
channel "log_queries" {
file "queries.log" versions 3 size 10m; ← queries.logファイル:10MBのファイルを3世代までローテーションする
severity info;
print-time yes;
print-category yes;
};
//categoryで出力するログを指定する:
category default { "log_default"; }; ← defaultカテゴリー:以下の指定カテゴリー以外のログ
category security { "log_security"; }; ← securityカテゴリー:要求の承認・否認のログ
category client { "log_security"; }; ← clientカテゴリー:クライアント要求処理のログ
category queries { "log_queries"; }; ← queriesカテゴリー:問い合わせクエリのログ
};
ゾーンファイルの書き方
ゾーンファイルには、スレーブサーバのキャッシュの有効期限、WEBサーバやメールサーバのIPアドレスなどを設定します。
ゾーンファイルの基本ルール
ゾーンファイルは、いくつかの基本ルールさえ理解すれば比較的簡単に書くことができます。
以下、その基本的なルールを示します。
- $TTL行、SOAレコード、およびNSレコードの3要素が必要。
- DNSレコード($TTL行以外)は一般的に、
[DNS名] | [TTL] | レコードクラス | レコードタイプ | データ |
の形式で構成される。ここで[ ]付きの項目は省略可能。またTTL(Time To Live)キャッシュの有効期間であり、単位がなければ秒を意味する。
- DNA名『@』は、自ドメインを表す。
- DNS名あるいはTTLが省略された場合、指定された最後の行の値が使用される。
- 様々なレコードクラスがサポートされていますが、使用するのはIN(InterNet)のみ。
- レコードタイプには、SOA(Start Of Authority)レコード、NS(Name Server)レコード、A(Address)レコードPTR(Pointer)レコードおよびMX(Mail Exchanger)レコードで代表される。
- 各行のセミコロン";"以降はコメント。
内向きゾーンファイル
ゾーン"neoluxusa.com"の内向きゾーンファイルの例を表11に示します。
このファイルは、named.conf で指定した通り"/etc/namedb/master/neoluxusa.com_int.zone"というファイルです。
各行の意味は表中に示しますが、以下の点に注意してください。
- マスターサーバ名、管理者連絡先およびDNSサーバ名の最後にはピリオド"."を忘れないで下さい。
これは、ルートネームサーバを意味し、厳密な意味のFQDN(Fully Qualified Domain Name:完全修飾ドメイン名)を指定する必要があります。
- 管理者連絡先の最初のピリオド"."は"@"に置換されます。この例ではpostmaster@neoluxusa.comが管理者連絡先であり、
DNSデータやセキュリティに問題が発生すれば報告メールが送られます。
表11 ゾーン"neoluxusa.com"の内向きゾーンファイルの例
# more neoluxusa.com_int.zone |
$TTL | 86400 | ;24h | ← TTLのデフォルト値 |
@ | IN | SOA | ns1.neoluxusa.com. postmaster.neoluxusa.com. ( ← マスターサーバ名 管理者連絡先 |
| 2010052100 ; Serial ← シリアル番号:年月日+番号のYYYYMMDDNN(10桁)が一般的。 |
| 3600 ; Refresh 1hr ← マスターサーバを確認する間隔 |
| 900 ; Retry 15min ← マスターサーバとの通信に失敗したときのリトライ間隔 |
| 604800 ; Expire 1week ← スレーブサーバの有効期限 |
| 86400 ; Minimum 24hr ← ネガティブキャッシュ(失敗した結果のキャッシュ)有効期間 |
| ) |
| IN | NS | ns1.neoluxusa.com. ← ゾーン"neoluxusa.com"のDNSサーバ名 |
| IN | NS | ns2.neoluxusa.com. ← ゾーン"neoluxusa.com"のセカンダリDNSサーバ名 |
| IN | A | 192.168.1.100 ← ゾーン"neoluxusa.com"のローカルIPアドレス |
; |
ns1 | IN | A | 192.168.1.100 ← DNSサーバ"ns1.neoluxusa.com"のローカルIPアドレス |
ns1 | IN | A | 192.168.1.110 ← セカンダリDNSサーバ"ns2.neoluxusa.com"のローカルIPアドレス |
www | IN | A | 192.168.1.100 ← サブドメイン"www.neoluxusa.com"のローカルIPアドレス |
astrology | IN | A | 192.168.1.110 ← サブドメイン"astrology.neoluxusa.com"のローカルIPアドレス |
外向きゾーンファイル
ゾーン"neoluxusa.com"の外向きゾーンファイル"/etc/namedb/master/neoluxusa.com_ext.zone"の例を表12に示します。
基本的に、内向きゾーンファイルと異なる点はグローバルIPアドレスを設定している点のみです。
表12 ゾーン"neoluxusa.com"の外向きゾーンファイルの例
# more neoluxusa.com_ext.zone |
$TTL | 86400 | ;24h | |
@ | IN | SOA | ns1.neoluxusa.com. postmaster.neoluxusa.com. ( |
| 2010052100 ; Serial |
| 3600 ; Refresh 1hr |
| 900 ; Retry 15min |
| 604800 ; Expire 1week |
| 86400 ; Minimum 24hr |
| ) |
| ) |
| IN | NS | ns1.neoluxusa.com. |
| IN | NS | ns2.neoluxusa.com. |
| IN | A | 118.243.116.89 ← ゾーン"neoluxusa.com"のグローバルIPアドレス |
; |
ns1 | IN | A | 118.243.116.89 ← DNSサーバ"ns1.neoluxusa.com"のグローバルIPアドレス |
ns2 | IN | A | 124.41.68.214 ← セカンダリDNSサーバ"ns2.neoluxusa.com"のグローバルIPアドレス |
www | IN | A | 118.243.116.89 ← サブドメイン"www.neoluxusa.com"のグローバルIPアドレス |
astrology | IN | A | 124.41.68.214 ← サブドメイン"astrology.neoluxusa.com"のグローバルIPアドレス |
BIND9を動かすためのその他の設定
/etc/resolv.confの設定
/etc/resolv.conf は、BIND9 のクライアントソフトであるリゾルバの設定ファイルであり、表13のように書きます。
"domain neoluxinc.com"は完全などメイン名を省略した際のドメイン名であり、"nameserver"は最大3つまで指定できます。
また、"domain neoluxinc.com"の代わりに、"search neoluxinc.com neoluxinc2.com"のように、複数のドメインを指定して、リゾルバに検索させることも可能です。
表13 /etc/resolv.confの設定例
domain neoluxinc.com ← FQDN(完全修飾ドメイン名)を指定しなかった場合に探すドメイン名
nameserver 127.0.0.1 ← ローカルホストがネームサーバとして機能している
nameserver 192.168.1.110 ← ローカルネットワーク内の他のネームサーバのIPアドレス
/etc/host.confの設定確認
/etc/host.confは、名前解決の順序を設定するファイルであり、表14のように書きます。
最初にhostsで名前解決を行い、できなければbindで解決を図ります。
表14 /etc/host.confの設定例
hosts
bind
/etc/mtree/BIND.chroot.distの変更
前項までの設定で、FreeBSDを再起動するかnamedを起動すれば、一応BIND9は動きます。
しかし、BIND9のnamedの起動時に、メッセージ"the working directory is not writable"がコンソールに出力されます。
また、ログファイル /var/log/messages にも以下のように出力されています。
表15 named起動時のエラーメッセージ
#vi /var/log/messages
・・・
Apr 3 19:02:16 NeoLux001 named[2626]: starting BIND 9.6.1-P1 -4 -c /etc/namedb/named.conf -t /var/named -u bind
Apr 3 19:02:16 NeoLux001 named[2626]: built with '--prefix=/usr' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--enable-threads' '--disable-ipv6' '--enable-getifaddrs'
'--disable-linux-caps' '--with-openssl=/usr' '--with-randomdev=/dev/random' '--without-idn' '--without-libxml2'
Apr 3 19:02:16 NeoLux001 named[2626]: command channel listening on 127.0.0.1#953
Apr 3 19:02:16 NeoLux001 named[2626]: running
・・・
また、BIND9のログ出力を設定している場合には、
/etc/named/queries.logと/etc/named/queries.logが作成されず、
以下のメッセージがコンソールと/var/log/messagesに出力されます。
表16 named起動時のログ出力に関するエラーメッセージ
#vi /var/log/messages
・・・
May 13 13:57:54 neolux001 named[732]: logging channel 'log_security' file 'security.log': permission denied
May 13 13:57:54 neolux001 named[732]: logging channel 'log_queries' file 'queries.log': permission denied
・・・
この解決策は
海外のサイト(英語)にありました。
namedの開始時にルートディレクトリが/etc/namedbに変更される過程で、このルートディレクトリの所有者が"root"で、モードが755に変更されるため、
BIND9の実行者"bind"が書き込めないことによるエラーです(多分バグでしょう)。
そこで、ファイル /etc/mtree/BIND.chroot.dist を開き、
/set type=dir uname=root gname=wheel mode=0755"
という行を、
"/set type=dir uname=bind gname=wheel mode=0755"
のように書き換えることで /etc/namedb フォルダの所有者がbindになり、エラーメッセージも出なくなります。
サーバ起動時に BIND9 も起動する方法
サーバ起動時に BIND9 を起動するため、表17の3行を /etc/rc.conf に追加します。
表17 サーバ起動時に BIND9 を起動するために/etc/rc.confに追加する内容
named_program="/usr/local/sbin/named"
named_flags="-4 -c /etc/namedb/named.conf"
named_enable="YES"
BIND9 の停止・起動・再起動コマンド
namedは、表18~表20のコマンドで停止・起動あるいは再起動することができます。
表18 namedの停止コマンド
# /etc/rc.d/named stop
表19 namedの起動コマンド
# /etc/rc.d/named start
表20 namedの停止後再起動コマンド
# /etc/rc.d/named restart
最終更新日:2010年6月9日