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
設定内容は次の通り、案を定める
ディレクトリは次のようになる
/var/named/chroot +-- dev +-- etc +-- proc +-- var +-- tmp +-- run | +-- named +-- named (*) 設定ファイルの置き場 +-- data +-- slaves
(以下、ホスト名は「dnsmail」のように書く)
(以下、ホスト名は「www」のように書く)
(以下、ネットワークアドレスは 「XXX.YYY.ZZZ」のように書く)
(以下、DNS ドメイン名は「mydomain.hoge.com」と書く)
(以下、上流の DNS サーバの IP アドレスは「AAA.BBB.CCC.10」と書く)
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/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 は使っていないと いうことに留意しておいてください。
cat /etc/resolv.conf で、今設定を行なっているマシンの IP アドレスが、 「nameserver」の行に、正しく記述されていることを確認.
cat /etc/resolv.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-checkconf /var/named/chroot/etc/named.conf
エラーが出たら、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 サーバ起動時にエラーが出たら、関係する設定ファイル (ここでは、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 を設定して、先ほど作った仮のゾーンファイ ル public.zone, public.rev, db.zone, db.name を4つとも使うようにします。 ここでも、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。
cp /var/named/chroot/etc/named.conf /var/named/chroot/etc/named.conf.DIST
設定ファイル /var/named/chroot/etc/named.conf の注意事項
named.conf ファイルの options 設定の中で
options { (他の設定) allow-recursion { 127.0.0.1; XXX.YYY.ZZZ.0/24; }; (他の設定) };
のように設定する. 外部からのrecursive query が抑止され、自分が提供しているドメイン、およ び既に キャッシュされている情報以外は返さないようになる. つまり、組織の外から「組織の外を検索するような要求」が来 たときに、recursive query の実行を抑止する。 なお、組織の内を検索するような要求に対しては recursive query は関係な い。
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-checkconf /var/named/chroot/etc/named.conf
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
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」の結果ログが出てきますので、エラー が出ていないことを十分に確認してください。
参考:
chown -R named:named /var/named/chroot
下記の手順で、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 status # エラーが無く、「server is up and running」という行が出てくることを確認
TCP wrapper の設定ファイルである /etc/hosts.allow を確認します。
53/UDP は通常の名前解決に使われ、53/TCP はゾーン転送(プライマリ、セカ ンダリ間)にのみ使われます。 53/TCP のアクセス のアクセスは、XXX.YYY.ZZZ.* のみを許すように設定します。 例えば、次のように設定します。 (ネットワークアドレスの末尾に付ける「.」は忘れないようにしましょう)。
named: 127.0.0.1 named: XXX.YYY.ZZZ.
rndc には次の2つの設定ファイルが関係する。 bind のインストールの時点で、次の2つのファイルはすでに作られている。 そのまま使う
「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 関係以外のファイルが盗まれないように、このような設定をしているわけです。
DNS がうまく動かないと思った時は、クライアント側の /etc/resolv.conf も 確認すること。
次のように、hosts の行に「dns」を含むこと。
hosts: files nis dns
order hosts,bind
上記の設定後、 MX, Web サーバの順引き、逆引きができることを確実に確認する(下記「演習 項目」を見て下さい)
# 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 @<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のメンテナンス手順は以下の通り (グローバルIPを持つマシンの追加・削除する場合)。
# cd /var/named/chroot/var/named/data # cp db.zone db.zone.back060426 <--その日の日付 # cp dbrev.rev dbrev.rev.back060426 <--その日の日付
//Aレコードの記述例 hostname IN A XXX.YYY.ZZZ.200
//PTRレコードの記述例 200 IN PTR hostname.mydomain.hoge.com.
2006042601 "更新した年月日+その日の更新回数"のようにする.
# kill -HUP `cat /var/named/chroot/var/run/named/named.pid`
rndc reload # ログファイルを見てエラーが無いことを確認する tail /var/named/chroot/var/named/data/named.log
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
rndc stats # 出力結果を確認 cat /var/named/chroot/var/named/data/named_stats.txt
出力結果の意味
success 問い合わせに成功したクエリー数 referral 問い合わせに対し参照となったクエリー数 nxrrset 問い合わせに対するレコード型が存在しなかったクエリー数 nxdomain 問い合わせに対するドメイン名やホスト名が存在しなかったクエリー数 recursion 再帰問い合わせを行ったクエリー数 failure エラーとなったクエリー数
この項目は「後回し」とする
以上の演習が済んだら、仮に設定されたゾーンファイルを本格的なものに書き換える。その後、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.
詳細は、検討中