DNS サーバの設定
 Cent OS 4.4 (Linux) 上で DNS サーバを動かし, 順引き、逆引きを行なえる ようにします。
外部向きと内部向きを区別し、内向きにはグローバルIPを持つすべての機器に ついての問い合わせに応じ, 外部向 きには DNSサーバ兼MX, Web サーバについてのみ問い合わせに応じるように 設定します。rndc (Remote Name Daemon Controller) の設定も行ないます. 動作確認まで行ないます。
【関連する外部ページ】: http://www.atmarkit.co.jp/flinux/rensai/bind909/bind909a.html
【関連する外部ページ】: http://www.atmarkit.co.jp/flinux/index/indexfiles/index-linux.html
参考にした Web ページ: http://www.fkimura.com/bind9-3.html(現存しない)
【関連する外部ページ】: http://www.asahi-net.or.jp/~aa4t-nngk/bind93.html
設定内容
設定内容は次の通り、案を定める
- rndc (Remote Name Daemon Controller): 使う
- ルートサーバに関する情報ファイル: named.ca
- ローカルホストのゾーンファイル名: localhost.zone, named.local
- ゾーンファイルの配布における外部向きと内部向きの区別: する
- 内部向きのゾーンファイル名: data/db.zone, data/db.rev
- 外部向きのゾーンファイル名: data/public.zone, data/public.rev
- 外部向きのゾーンファイルに記述するホスト: 「上流の DNS サーバ」, DNSサーバ兼MX, Web サーバの3つのみ
- 統計情報など: data/cache_dump.db, data/named_stats.txt
- ログ出力ファイル: data/named.log, data/security.log
- 上記のファイルが置かれるディレクトリ: /var/named/chroot/var/named
こういう設定にしている理由は「chroot 化に関する補足説明」で説明しています。
ディレクトリは次のようになる
/var/named/chroot +-- dev +-- etc +-- proc +-- var +-- tmp +-- run | +-- named +-- named (*) 設定ファイルの置き場 +-- data +-- slaves
事前に調べておく事項
- DNSサーバ兼MXのホスト名
(以下、ホスト名は「dnsmail」のように書く)
- DNSサーバ兼MXの IP アドレス (以下、「XXX.YYY.ZZZ.160」のように書 く)。
- Web サーバのホスト名
(以下、ホスト名は「www」のように書く)
- Web サーバの IP アドレス (以下、「XXX.YYY.ZZZ.167」のように書 く)。
- DNSサーバ兼MXがある「内部」のネットワークアドレス
(以下、ネットワークアドレスは 「XXX.YYY.ZZZ」のように書く)
- DNS ドメイン名 (NIS ドメイン名とは別物なので勘違いしないこと)
(以下、DNS ドメイン名は「mydomain.hoge.com」と書く)
- 上流の DNS サーバの IP アドレス
(以下、上流の DNS サーバの IP アドレスは「AAA.BBB.CCC.10」と書く)
DNS サーバソフトのインストール
- 時刻あわせ (rdate コマンドを使用)
rdate -s <信頼できるマシンのIPアドレス>
- インストール
yum install bind yum install bind-chroot yum install caching-nameserver
なお、/etc/named.conf は、/var/named/chroot/etc/named.conf へのシンボリックリンクになっているはずなので確認してください(bind-chroot をインストールしたので。参考:下記)
[root@cent01 ~]# ls -la /var/named/chroot/etc/named.conf -rw-r--r-- 1 root root 1564 4月 20 18:59 /var/named/chroot/etc/named.conf [root@cent01 etc]# ls -al /etc/named.conf lrwxrwxrwx 1 root root 32 4月 20 18:29 /etc/named.conf -> /var/named/chroot/etc/named.conf
仮のゾーンファイルの作成とチェック
ここでの手順では、仮のゾーンファイル public.zone, public.rev, db.zone, db.name を作りま す。次に、named.conf を設定して、public.zone, public.rev を使うように します。その後、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。db.zone, db.name を使うような設定は後回しです。
まず, 下記のゾーンファイルのごく簡単なサンプルを作る。 なお、ディレクトリが「/var/named/chroot/var/named/」のようになっている理由は「chroot 化に関する補足説明」で説明しています。
- /var/named/chroot/var/named/data/public.zone
- /var/named/chroot/var/named/data/public.rev
- /var/named/chroot/var/named/data/db.zone
- /var/named/chroot/var/named/data/dbrev.rev
正引き
/var/named/chroot/var/named/data/public.zone, /var/named/chroot/var/named/data/db.zone は仮に次のよ うに設定。 ドメイン名の末尾の「.」は必要(書き間違いではない)。
cd /var/named/chroot/var/named/data vi public.zone # 以下のように設定 ---------------------------------------------------------------------------- $TTL 86400 @ IN SOA dnsmail.mydomain.hoge.com. root.mydomain.hoge.com.( 2006051601 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS dnsmail.mydomain.hoge.com. IN MX 10 dnsmail.mydomain.hoge.com. @ IN A XXX.YYY.ZZZ.160 dnsmail IN A XXX.YYY.ZZZ.160 www IN A XXX.YYY.ZZZ.167 hohoge IN A AAA.BBB.CCC.10 ---------------------------------------------------------------------------- cp public.zone db.zone
逆引き
/var/named/chroot/var/named/data/public.rev, /var/named/chroot/var/named/data/dbrev.rev は仮に次のように設定
cd /var/named/chroot/var/named/data vi public.rev # 以下のように設定 ---------------------------------------------------------------------------- $TTL 86400 @ IN SOA dnsmail.mydomain.hoge.com. root.mydomain.hoge.com.( 2006051601 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS mydomain.hoge.com. 160 IN PTR dnsmail.mydomain.hoge.com. 167 IN PTR www.mydomain.hoge.com. ---------------------------------------------------------------------------- cp public.rev dbrev.rev # 以下のように設定
オーナとパーミッションの設定
chown named:named /var/named/chroot/var/named/data/* chmod 400 /var/named/chroot/var/named/data/public.zone* chmod 400 /var/named/chroot/var/named/data/public.rev* chmod 400 /var/named/chroot/var/named/data/db.zone* chmod 400 /var/named/chroot/var/named/data/dbrev.rev*
もし chown named:named でエラーが出たときは、ユーザとグループを 次の手順で作成する.
Linux の場合
/usr/sbin/groupadd named /usr/sbin/useradd -d /var/named/chroot/var/named -g named -s /sbin/nologin named
FreeBSDの場合
# /etc/passwd に次のような行があることを確認 named:x:53:53:named:/var/named/chroot/var/named:/bin/false # /etc/group に次のような行があることを確認 named:x:53:
チェック
ネットワーク関係の設定ミス, named 等のインストールのミス, public.zone, public.rev の書き間違いを下記の手順でチェックする。
この手順で、仮の DNS サーバが立ち上がることになります。この仮の DNS サー バは、public.zone, public.rev は使うが、db.zone, dbrev.rev は使っていないと いうことに留意しておいてください。
- /etc/resolv.conf のチェック
cat /etc/resolv.conf で、今設定を行なっているマシンの IP アドレスが、 「nameserver」の行に、正しく記述されていることを確認.
cat /etc/resolv.conf
- /var/named/chroot/etc/named.conf
vi /var/named/chroot/etc/named.conf # 次のような 11行を末尾に追加する。 ---------------------------------------------------------------------------- // mydomain.hoge.com <-> XXX.YYY.ZZZ zone "mydomain.hoge.com" IN { type master; file "data/public.zone"; allow-query { any; }; }; zone "ZZZ.YYY.XXX.in-addr.arpa" IN { type master; file "data/public.rev"; allow-query { any; }; };
- チェックツールを使って、named.conf ファイルの内容をチェック
エラーが出たら、named.conf を書き直す。
named-checkconf /var/named/chroot/etc/named.conf
- チェックツールで, public.zone, public.rev をチェック
エラーが出たら、public.zone, public.rev を書き直す。
named-checkzone localhost /var/named/chroot/var/named/data/public.zone named-checkzone 127.0.0.1 /var/named/chroot/var/named/data/public.rev named-checkzone dnsmail /var/named/chroot/var/named/data/public.zone named-checkzone XXX.YYY.ZZZ.160 /var/named/chroot/var/named/data/public.rev named-checkzone www /var/named/chroot/var/named/data/public.zone named-checkzone XXX.YYY.ZZZ.167 /var/named/chroot/var/named/data/public.rev
- DNS サーバの起動の試み
DNS サーバ起動時にエラーが出たら、関係する設定ファイル (ここでは、named.conf, public.zone, public.rev) を見直すとともに、「cat /var/log/messages | grep named 」で エラーメッセージを確認
/etc/rc.d/init.d/named stop /sbin/chkconfig named off pkill named /etc/rc.d/init.d/named start /sbin/chkconfig named on cat /var/log/messages | grep named
named.conf の設定とチェック
ここでの手順では、named.conf を設定して、先ほど作った仮のゾーンファイ ル public.zone, public.rev, db.zone, db.name を4つとも使うようにします。 ここでも、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。
- デフォルトの設定ファイルのバックアップ作成
cp /var/named/chroot/etc/named.conf /var/named/chroot/etc/named.conf.DIST
- named.conf の設定上の留意事項
設定ファイル /var/named/chroot/etc/named.conf の注意事項
- options 内の記述
options 行は複数書けない書けないことに注意. - 「directory "/var/named";」
これが、「/var/named/chroot/var/named」になっていないのは、書き間違いでは無い。 理由は「chroot 化に関する補足説明」で説明しています。 - 「version "unknown";」 bind のバージョンの非表示
- allow-recursion: 外部からの recursive query を抑止するように設定.
- allow-transfer: 外部からのゾーンリクエストパケット(DNS が管理し
ているサーバの一覧の取得)を抑止するうううううように設定。
named.conf ファイルの options 設定の中で
options { (他の設定) allow-recursion { 127.0.0.1; XXX.YYY.ZZZ.0/24; }; (他の設定) };
のように設定する. 外部からのrecursive query が抑止され、自分が提供しているドメイン、およ び既に キャッシュされている情報以外は返さないようになる. つまり、組織の外から「組織の外を検索するような要求」が来 たときに、recursive query の実行を抑止する。 なお、組織の内を検索するような要求に対しては recursive query は関係な い。
- forwarders: フォーワード先 (ルータが代理 DNS サーバの機能を持つと
きはそれを書く. あるいは、上流の DNS サーバの IP アドレスを書く)
- view "internal" で、内部向きのゾーンファイル配布を定め、 view "external" で、外部向きのゾーンファイル配布を定める。
- ZONE "." : キャッシュサーバ用の設定
- options 内の記述
- named.conf を次のように設定する
cd /var/named/chroot/etc vi named.conf # 以下のように設定 # XXX.YYY.ZZZ, ZZZ.YYY.XXX -> DNSサーバ兼MXがある「内部」のネットワークアドレスのこと # AAA.BBB.CCC -> 上流の DNS サーバがあるネットワークアドレスのこと # mydomain.hoge.com -> DNS ドメイン名のこと ---------------------------------------------------------------------------- // // named.conf for Red Hat caching-nameserver // options { directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; pid-file "/var/run/named/named.pid"; version "unknown"; allow-recursion { 127.0.0.1; AAA.BBB.CCC.10/24; }; allow-transfer { 127.0.0.1; AAA.BBB.CCC.10/24; }; forwarders { AAA.BBB.CCC.10; }; /* * If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default. */ // query-source address * port 53; }; // // a caching only nameserver config // controls { inet 127.0.0.1 allow { localhost; } keys { rndckey; }; }; // logging logging { channel namedlog { file "data/named.log"; print-time yes; print-category yes; print-severity yes; severity info; }; channel securitylog { file "data/security.log"; print-time yes; }; category default { default_syslog; namedlog; default_debug; }; category security { default_syslog; securitylog; }; }; view "internal" { match-clients { XXX.YYY.ZZZ.0/24; 127.0.0.1; }; // mydomain.hoge.com <-> XXX.YYY.ZZZ zone "mydomain.hoge.com" IN { type master; file "data/db.zone"; allow-update { none; }; }; zone "ZZZ.YYY.XXX.in-addr.arpa" IN { type master; file "data/dbrev.rev"; allow-update { none; }; }; include "/etc/rndc.key"; }; view "external" { match-clients { any; }; zone "." IN { type hint; file "named.ca"; }; zone "localdomain" IN { type master; file "localdomain.zone"; allow-update { none; }; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; allow-update { none; }; }; zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.ip6.local"; allow-update { none; }; }; zone "255.in-addr.arpa" IN { type master; file "named.broadcast"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.zero"; allow-update { none; }; }; // mydomain.hoge.com <-> XXX.YYY.ZZZ zone "mydomain.hoge.com" IN { type master; file "data/public.zone"; allow-query { any; }; }; zone "ZZZ.YYY.XXX.in-addr.arpa" IN { type master; file "data/public.rev"; allow-query { any; }; }; include "/etc/rndc.key"; }; ----------------------------------------------------------------------------
- チェックツールを使って、named.conf ファイルの内容をチェック
エラーが出たら、named.conf を書き直す。
named-checkconf /var/named/chroot/etc/named.conf
- チェックツールで, db.zone, dbrev.rev をチェック
public.zone, public.rev のチェックは済んでいるので、 db.zone, dbrev.rev のチェックを念のために行なう。 エラーが出たら、db.zone, dbrev.rev を書き直す。
named-checkzone localhost /var/named/chroot/var/named/data/db.zone named-checkzone 127.0.0.1 /var/named/chroot/var/named/data/dbrev.rev named-checkzone dnsmail /var/named/chroot/var/named/data/db.zone named-checkzone XXX.YYY.ZZZ.160 /var/named/chroot/var/named/data/dbrev.rev named-checkzone www /var/named/chroot/var/named/data/db.zone named-checkzone XXX.YYY.ZZZ.167 /var/named/chroot/var/named/data/dbrev.rev
- /var/run/named/named.pid のシンボリックリンク作成
rm -f /var/run/named/named.pid ln -s /var/named/chroot/var/run/named/named.pid /var/run/named/named.pid
- 起動チェック
起動チェックのために、最初は、デバッグモードで起動してみる. (起動の前に named の停止を行ないます).
/etc/rc.d/init.d/named stop /sbin/chkconfig named off pkill named rm -f /var/named/chroot/var/named/data/named.log /usr/sbin/named -u named -t /var/named/chroot -c /etc/named.conf -d 1 cat /var/named/chroot/var/named/data/named.log
「cat /var/named/chroot/var/named/data/named.log」の結果ログが出てきますので、エラー が出ていないことを十分に確認してください。参考:
- -u: namad の実行ユーザ (普通は named にする)
- -t: chroot 先 (任意のディレクトリで良いが、今回は /var/named/chroot にする)
- -c: named.conf の場所 (任意のディレクトリで良いが、今回は /var/named/named.conf にする)
- オーナの設定
chown -R named:named /var/named/chroot
- DNS サーバの起動の試み
下記の手順で、DNS サーバを起動します。起動時にエラーが出たら、関係する設定ファイル (ここでは、named.conf, public.zone, public.rev) を見直して、もう1度、再起動してください。 エラーメッセージは、「cat /var/log/messages | grep named 」で確認します。
/etc/rc.d/init.d/named stop /sbin/chkconfig named off pkill named /etc/rc.d/init.d/named start /sbin/chkconfig named on cat /var/log/messages | grep named
- ログの確認
/var/named/chroot/var/named/data に 2つのログファイル named.log, secutiry.log が出来るので確認する。 named.log の中にエラーが無いことを確認する。
cd /var/named/chroot/var/named/data ls -la *.log tail named.log
- rndc との通信ができていることのチェック
rndc status # エラーが無く、「server is up and running」という行が出てくることを確認
- /etc/hosts.allow の設定
TCP wrapper の設定ファイルである /etc/hosts.allow を確認します。
53/UDP は通常の名前解決に使われ、53/TCP はゾーン転送(プライマリ、セカ ンダリ間)にのみ使われます。 53/TCP のアクセス のアクセスは、XXX.YYY.ZZZ.* のみを許すように設定します。 例えば、次のように設定します。 (ネットワークアドレスの末尾に付ける「.」は忘れないようにしましょう)。
named: 127.0.0.1 named: XXX.YYY.ZZZ.
rndc についての補足説明
rndc には次の2つの設定ファイルが関係する。 bind のインストールの時点で、次の2つのファイルはすでに作られている。 そのまま使う
- /etc/rndc.conf
- /var/named/chroot/etc/rndc.key
chroot 化に関する補足説明
「yum install bind-chroot」を実行して、bind-chroot をインストールした ことによって、DNS サーバプロセス (named) が chroot 化されています。 これは、DNS サーバプロセスの起動時に chroot によって、「DNS サーバプロ セス (named) から見えるルートディレクトリ「/」が、実際には、設定された サブディレクトリになっている」というものです。
見方を変えて、説明します。「cd /var/named; ls -al 」で分かる通り、 設定ファイルの実体は、/var/named で無くて、/var/named/chroot/var/named にあります。 DNS サーバプロセス (named) の起動時には、chroot によって、 DNS サーバプロセス (named)から見えるルートディレクトリが /var/mamed/chroot に設定されます。 つまり、DNS サーバプロセス (named)は /var/named/hogehoge を使っているつもりでも、 実際には /var/named/chroot/var/named/hogehoge が使われています。
このような設定をしている理由はセキュリティです。 named が乗っ取られるというケースは意外に多く報告されています。そうした場合に、named 関係以外のファイルが盗まれないように、このような設定をしているわけです。
クライアント側の設定 (記述中)
- /etc/resolv.conf
DNS がうまく動かないと思った時は、クライアント側の /etc/resolv.conf も 確認すること。
- /etc/nsswitch.conf
次のように、hosts の行に「dns」を含むこと。
hosts: files nis dns
-
/etc/host.conf
order hosts,bind
上記の設定後、 MX, Web サーバの順引き、逆引きができることを確実に確認する(下記「演習 項目」を見て下さい)
演習項目
nslookup, dig の使い方の練習
nslookup
- 下記の手順で、ゾーンファイルに記述したホスト名とIPとの対応をテストする
# nslookup <--nslookupを起動 > server <DNSサーバのIPアドレス> <--問い合わせるDNSサーバを指定 //正引きのテスト方法 > <ホスト名> <--db.zoneに記述したホスト名 Server: <DNSサーバのIPアドレス> Address: <DNSサーバのIPアドレス>#<ポート番号> Name: <ゾーンファイルに記述したホスト名> Address: <対応するIPアドレス> <--db.zoneに記述したIPが返れば良い
- 下記の手順で、逆引きをテストする
> <IPアドレス> <--dbrev.revに記述したIP Server: DNSサーバのIPアドレス Address: DNSサーバのIPアドレス#ポート番号 <IPアドレスの逆順>.in-addr.arpa name=<対応するホスト名> <--dbrev.revに記述 したホスト名がFQDN形式で返れば良い
nslookup は exit で終了する。
dig
- 下記の手順で、正引きをテストする
dig @<DNSサーバのIPアドレスr> <調べたいホスト名>
- 下記の手順で、逆引きをテストする
# dig @<DNSサーバのIPアドレス> -x <調べたいIP> ptr
-
チェック項目
;; ->>HEADER<<-の部分で ・status:がNOERROR である status:ではサーバからの応答の状態を表す NOERROR:DNSサーバが正常に応答した NXDOMAIN:問い合わせたドメインは存在しない SERVFAIL:DNSサーバが正しく応答しなかった ・flags:にqr,aaがあるのか,内部マシンからdigをした場合raもあるはず flags:には以下の5つがある。 qr:クエリの回答 aa:回答は権限のある回答 tc:回答が長くて切り捨てられた ra:サーバが再帰可能 rd:再帰希望 ・ANSWER:が1以上であるか ANSWER:では問い合わせに対する回答の数を示す ;;ANSWER SECTION:がゾーンファイルに設定した通りであるかどうか
ゾーンファイル db.zone, dbrev.rev のメンテナンス
ゾーンファイルdb.zone, dbrev.revのメンテナンス手順は以下の通り (グローバルIPを持つマシンの追加・削除する場合)。
- ゾーンファイルに変更を加える前に、バックアップを取っておく
# cd /var/named/chroot/var/named/data # cp db.zone db.zone.back060426 <--その日の日付 # cp dbrev.rev dbrev.rev.back060426 <--その日の日付
- db.zoneのAレコードを追加・削除
//Aレコードの記述例 hostname IN A XXX.YYY.ZZZ.200
-
dbrev.revのPTRレコードを追加・削除
//PTRレコードの記述例 200 IN PTR hostname.mydomain.hoge.com.
-
SOAレコードのシリアル番号を更新する.
シリアル番号は
2006042601 "更新した年月日+その日の更新回数"
のようにする. -
ゾーンファイルの変更を反映させるためにnamedの再起動を行う
# kill -HUP `cat /var/named/chroot/var/run/named/named.pid`
rndc 関係
- 設定ファイルとゾーンファイルを再読み込みする
ただしキャッシュデータは保持される
rndc reload # ログファイルを見てエラーが無いことを確認する tail /var/named/chroot/var/named/data/named.log
- キャッシュをファイルにダンプする
出力先はnamed.confのoptions中のdump-fileで定義する
出力先を定義していない場合はワークディレクトリの cache_dump.dbに出力される
rndc dumpdb # 出力結果を確認 cat /var/named/chroot/var/named/data/cache_dump.db
- キャッシュをすべてフラッシュする
rndc flush # キャッシュをファイルに出力してクリアされたことを確認する rndc dumpdb cat /var/named/chroot/var/named/data/cache_dump.db
- サーバの統計情報をファイルにダンプする
出力先はnamed.confのoptions中のstatistics-fileで定義する
出力先を定義していない場合はワークディレクトリのnamed.statsに出力される
rndc stats # 出力結果を確認 cat /var/named/chroot/var/named/data/named_stats.txt
出力結果の意味
success 問い合わせに成功したクエリー数 referral 問い合わせに対し参照となったクエリー数 nxrrset 問い合わせに対するレコード型が存在しなかったクエリー数 nxdomain 問い合わせに対するドメイン名やホスト名が存在しなかったクエリー数 recursion 再帰問い合わせを行ったクエリー数 failure エラーとなったクエリー数
内部向けのゾーンファイルと、外部向けのゾーンファイルが正しく動いていることを bind のコマンドで確認
この項目は「後回し」とする
以上の演習が済んだら、仮に設定されたゾーンファイルを本格的なものに書き換える。その後、DNS 管理コマ ンドについての練習及び DNS サーバの動作確認を再度行なう。
db.zone, public.zone などでの NSレコードは次のように書くこと(セキュリティ上の理由)
(修正前) (修正後) IN NS hoge1 → IN NS hoge1.db.is.kyushu-u.ac.jp. IN NS hoge2 → IN NS hoge2.db.is.kyushu-u.ac.jp. IN NS hoge3 → IN NS hoge3.db.is.kyushu-u.ac.jp.
詳細は、検討中