Solaris で DNS サーバ
Solaris 上で DNS サーバを動かし, 順引き、逆引きを行なえる ようにします。
外部向きと内部向きを区別し、内向きにはグローバルIPを持つすべての機器に ついての問い合わせに応じ, 外部向 きには DNSサーバ兼MX, Web サーバについてのみ問い合わせに応じるように 設定します。rndc (Remote Name Daemon Controller) の設定も行ないます. 動作確認まで行ないます。
【関連する外部ページ】: 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
事前に調べておく事項
- 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」と書く)
インストール
「Solaris で bind バージョンアップ」の Web ページなどを参考に、最新の bind をインストールします。
ユーザ bind とグループ bind の追加
次の手順で作成する.
/usr/sbin/groupadd -g 53 named /usr/sbin/useradd -u 53 -d /var/named -g named named
その後、vipw で bind ユーザについては、パスワードなし、シェルなしに設 定
- vipw において、シェル(「/bin/sh」のようになっている)を、 /nologin のように書き換える
- shadow password の編集において、パスワードの欄を NP に書き換える
ディレクトリの作成
# /var/run/named は named.pid ファイルが入る mkdir /var/run/named # /var/named は各種データファイルファイルが入る (named.conf は # /etc/named.conf に作る) mkdir /var/named mkdir /var/named/data chown named:named /var/run/named chown named:named /var/named chown named:named /var/named/data
仮のゾーンファイルの作成とチェック
ここでの手順では、仮のゾーンファイル public.zone, public.rev, db.zone, db.name を作りま す。次に、named.conf を設定して、public.zone, public.rev を使うように します。その後、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。db.zone, db.name を使うような設定は後回しです。
まず, 下記のゾーンファイルのごく簡単なサンプルを作る。
- /var/named/data/public.zone
- /var/named/data/public.rev
- /var/named/data/db.zone
- /var/named/data/dbrev.rev
正引き
/var/named/data/public.zone, /var/named/data/db.zone は仮に次のよ うに設定。 ドメイン名の末尾の「.」は必要(書き間違いではない)。
cd /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/data/public.rev, /var/named/data/dbrev.rev は仮に次のように設定
cd /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/data/* chmod 400 /var/named/data/public.zone* chmod 400 /var/named/data/public.rev* chmod 400 /var/named/data/db.zone* chmod 400 /var/named/data/dbrev.rev*
チェック
ネットワーク関係の設定ミス, 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
- /etc/named.conf
vi /etc/named.conf # 仮に、次のようなファイルを作る ---------------------------------------------------------------------------- options { directory "/var/named"; pid-file "/var/run/named/named.pid"; }; // 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 を書き直す。
/usr/local/sbin/named-checkconf /etc/named.conf
- チェックツールで, public.zone, public.rev をチェック
エラーが出たら、public.zone, public.rev を書き直す。
/usr/local/sbin/named-checkzone localhost /var/named/data/public.zone /usr/local/sbin/named-checkzone 127.0.0.1 /var/named/data/public.rev /usr/local/sbin/named-checkzone dnsmail /var/named/data/public.zone /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.160 /var/named/data/public.rev /usr/local/sbin/named-checkzone www /var/named/data/public.zone /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.167 /var/named/data/public.rev
- DNS サーバの起動の試み
DNS サーバ起動時にエラーが出たら、関係する設定ファイル (ここでは、named.conf, public.zone, public.rev) を見直すとともに、「cat /var/adm/messages | grep named 」で エラーメッセージを確認
pkill named /usr/sbin/named -u named -c /etc/named.conf -d 1 cat /var/adm/messages | grep named
named.conf の設定とチェック
ここでの手順では、named.conf を設定して、先ほど作った仮のゾーンファイ ル public.zone, public.rev, db.zone, db.name を4つとも使うようにします。 ここでも、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。
- named.conf の設定上の留意事項
設定ファイル /etc/named.conf の注意事項
- options 内の記述
options 行は複数書けない書けないことに注意. - 「directory "/var/named";」
- 「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 /etc vi named.conf # 以下のように設定 # XXX.YYY.ZZZ, ZZZ.YYY.XXX -> DNSサーバ兼MXがある「内部」のネットワークアドレスのこと # AAA.BBB.CCC -> 上流の DNS サーバがあるネットワークアドレスのこと # mydomain.hoge.com -> DNS ドメイン名のこと ---------------------------------------------------------------------------- // // named.conf // 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 を書き直す。
/usr/local/sbin/named-checkconf /etc/named.conf
- チェックツールで, db.zone, dbrev.rev をチェック
public.zone, public.rev のチェックは済んでいるので、 db.zone, dbrev.rev のチェックを念のために行なう。 エラーが出たら、db.zone, dbrev.rev を書き直す。
/usr/local/sbin/named-checkzone localhost /var/named/data/db.zone /usr/local/sbin/named-checkzone 127.0.0.1 /var/named/data/dbrev.rev /usr/local/sbin/named-checkzone dnsmail /var/named/data/db.zone /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.160 /var/named/data/dbrev.rev /usr/local/sbin/named-checkzone www /var/named/data/db.zone /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.167 /var/named/data/dbrev.rev
- named.cache, localhost.zone, localhost.rev の設定
- 起動チェック
起動チェックのために、最初は、デバッグモードで起動してみる. (起動の前に named の停止を行ないます).
pkill named /usr/sbin/named -u named -c /etc/named.conf -d 1 cat /var/adm/messages | grep named cat /var/named/data/named.log
「cat /var/named/data/named.log」の結果ログが出てきますので、エラー が出ていないことを十分に確認してください。参考:
- -u: namad の実行ユーザ (普通は named にする)
- -c: named.conf の場所 (任意のディレクトリで良いが、今回は /var/named/named.conf にする)
- 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
演習項目
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/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/data/named.log
- キャッシュをファイルにダンプする
出力先はnamed.confのoptions中のdump-fileで定義する
出力先を定義していない場合はワークディレクトリの cache_dump.dbに出力される
rndc dumpdb # 出力結果を確認 cat /var/named/data/cache_dump.db
- キャッシュをすべてフラッシュする
rndc flush # キャッシュをファイルに出力してクリアされたことを確認する rndc dumpdb cat /var/named/data/cache_dump.db
- サーバの統計情報をファイルにダンプする
出力先はnamed.confのoptions中のstatistics-fileで定義する
出力先を定義していない場合はワークディレクトリのnamed.statsに出力される
rndc stats # 出力結果を確認 cat /var/named/data/named_stats.txt
出力結果の意味
success 問い合わせに成功したクエリー数 referral 問い合わせに対し参照となったクエリー数 nxrrset 問い合わせに対するレコード型が存在しなかったクエリー数 nxdomain 問い合わせに対するドメイン名やホスト名が存在しなかったクエリー数 recursion 再帰問い合わせを行ったクエリー数 failure エラーとなったクエリー数
named.cache, localhost.zone, localhost.rev のチェック
/usr/named/localhost.rev, /usr/named/localhost.zone, /usr/named/root.cache の3つのファイルの確認は、nslookup を使う。
% nslookup > server dnsserver > 127.0.0.1 Name: localhost Address: 127.0.0.1 > localhost Name: localhost Address: 127.0.0.1 > 198.41.0.4 Name: a.root-servers.net Address 198.41.0.4 > a.root-servers.net Name: a.root-servers.net Address 198.41.0.4 > exit
198.41.0.4 とは、/usr/named/root.cache に書いてあった IPaddress のひと つである。 期待通りの結果を得られた。
内部向けのゾーンファイルと、外部向けのゾーンファイルが正しく動いていることを bind のコマンドで確認
この項目は「後回し」とする
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.
以上の演習が済んだら、仮に設定されたゾーンファイルを本格的なものに書き換える。その後、DNS 管理コマ ンドについての練習及び DNS サーバの動作確認を再度行なう。
(参考) rndc.conf, rndc.key
Solaris で rndc.conf, rndc.key を自前で書きたい時の手順である。
/usr/local/sbin/rndc-confgen -a cat /etc/rndc.key cd /var/tmp /usr/local/sbin/dnssec-keygen -a hmac-md5 -b 256 -n HOST `hostname` > /var/tmp/id cat /vat/tmp/id echo "cat "`cat id`".private" > /var/tmp/id.sh rm -f /var/tmp/id rm -rf /etc/rndc.conf echo "options {" > /etc/rndc.conf echo " default-server 127.0.0.1;" >> /etc/rndc.conf echo " default-key "\"`hostname`\"";" >> /etc/rndc.conf echo "}" >> /etc/rndc.conf echo "server 127.0.0.1{" >> /etc/rndc.conf echo " key "\"`hostname`\"";" >> /etc/rndc.conf echo "];" >> /etc/rndc.conf echo "key "\"`hostname`\"" {" >> /etc/rndc.conf echo " algorithm hmac-md5;" >> /etc/rndc.conf echo " secret"\"`sh id.sh | grep Key | sed 's/Key: //g'`\"";" >> /etc/rndc.conf echo "};" >> /etc/rndc.conf chmod 600 /etc/rndc.conf chmod 600 /etc/rndc.key rm -f /var/tmp/*.key rm -f /var/tmp/*.private
- 参考 Web ページ: Solaris での DNS サーバテスト手順