DNS(BIND)の設定(SuSE編)
SuSE においても、基本的な設定の考え方や方法は RedHat の時と変わりはありません。おやじは、ごく一般的な動的なグローバルIPアドレスのサービスを使用してサーバを建てており、ZIONさんのDDNSを使わせてもらってインターネットに当サイトを公開しています。この環境では、インターネットの世界の名前解決は、ZIONさんのDNSに依存することになりますので、内向きだけのDNSを動かしています。
一方、もう一社の固定IPサービスにも加入して独自ドメインを取得しており、こちらについては、外向きと内向きにDNSを動かしています。
以下は、おやじ宅のネットワーク構成での設定です。
◆名前解決の遅延対策
SuSEのBINDはデフォルトでipv6対応になっており、ipv6でつながっていない環境でそのまま使用すると、.jpドメインの名前解決が異常に遅くなる現象が発生するとのことです。ずいぶん悩まされましたが、ipv6を使わない場合はBINDで無効にしてやればipv6での名前解決に行かずに、この問題が解消されるとのこと。
解決策としては、ipv6 を disable した RPM を作成してインストールしてもよいのですが、
/etc/modules.conf.local (カーネル2.4ならmodules.confでもよいが、カーネル2.6では未サポートのため変更)/etc/modprobe.conf.localに以下のように追加してシステムを再起動すれば、ipv6機能が停止して名前解決が早くなります。(参考:
The Unofficial Fedora FAQ 日本語版 - Fedora Core 2用)
# vi /etc/modules.conf.local
# vi /etc/modprobe.conf.local
# Turn off IPv6
alias net-pf-10 off
alias ipv6 off
「Esc」、「:」、「w」、「q」で保存。
|
■DNS(BIND)の設定
SuSE の BIND は、デフォルトで以下のディレクトリとファイルが関連して chroot
( /var/lib/named がroot になるため、実際のログファイルは/var/lib/named/var/logになるので、ログが見受からないと騒がないように。)で動作しています。(ログ関係は省略)
/etc/named.conf ・・・・・・・・・・・・・・・メインの設定ファイル
|-- /var/lib/named/ ・・・・・・・・・各ゾーンファイルを置くディレクトリ
| |-- root.hint
| |-- localhost.zone
| |-- 127.0.0.zone
|
|-- named.conf.include ・・・・・・・・named.confからInculdeされるファイル
|-- /etc/named.d/ ・・・・・・・実際にIncludeされるファイルを置くディレクトリ
|- rndc.access.conf ・YaSTでIncludeするファイルを指定。デフォルトで
rndcに関する設定ファイルがincludeされている。
|
BIND を動かすメインの設定ファイルが /etc/named.conf で、SuSE では YaST
を使用して設定します。とは言っても、YaST で設定できるのは options ステートメントにかかわる部分だけで、他のステートメントは
named.conf ファイルを直接編集することになります。しかし、options ステートメントでも、YaSTがサポートしていないものについては設定はできませんし、逆にそれ以外のステートメントでも、種類によっては手動設定しても消されてしまうもの(aclは消えてしまいました。)があります。
従って、YaST での設定は行わずに以下の方針で行くことにしました。
- 設定の基本は、RedHat の時と同一とする。
- DDNS を利用しているドメイン ( example.zive.net ) は当然内向きのみとし、固定IPのドメイン
( example.com ) は外向きと内向きに対応する。但し、内向きの逆引きは一意に決まってしまうため
example.zive.net ドメイン を使用することとし、example.com ドメインはサーバにのみに適用する。
- YaST で Include 設定できる /etc/named.d/ ディレクトリ配下にオリジナルの
conf ファイル(ここでは my.conf とする) を置くことも考えたが、内向きと外向きの
DNS を一台のサーバで動かしているため、view ステートメントによるそれぞれの動作設定が必要になる。しかし、デフォルトで基本的なゾーンファイルの指定が
named.conf で行われており、my.conf で設定すると設定がダブッてしまう。そこで、ゾーンファイルは、named.conf
を直接編集することにし、結果として、おやじは my.conf は使用しなかった。
- 各ゾーンファイルは、デフォルトのゾーンファイルと同じ場所 ( /var/lib/named
) に置く。
◆基本動作の設定
DNS の基本的な動作の設定を、YaST の /etc/sysconfig エディターで行います。通常は変更不要と思いますが、my.conf
を Include するなら「Network/DNS/Name Server」の「NAMED_CONF_INCLUDE_FILES」でスペース区切りで「my.conf」を追加して「完了」を押して追加設定します。my.conf
そのものは別途エディタで作成しますが、/etc/sysconfig エディターで登録する前に予めファイルそのものは作成して置かないと、/etc/sysconfig エディターで登録できませんので注意してください。
◆named.conf の設定
前述のとおり、おやじは YaST を使用しないことにしましたので、下記内容を、named.conf
に直接記述しました。 SuSE のデフォルトは尊重しつつも、バッサリと今までの設定を継承したところもあり、あまり一貫性はありません。
RedHat の時の設定を参考にご覧になると、良いかもしれません。 誤って YaST
を起動しても壊されたりしない範囲で、設定するようにしました。
options {
directory "/var/lib/named";
dump-file "/var/log/named_dump.db";
statistics-file "/var/log/named.stats";
notify no;
allow-query { 127.0.0.1; 192.168.1.0/24; };
allow-transfer { 127.0.0.1; 192.168.1.0/24; };
forwarders { 1.2.3.4; 5.6.7.8; };
forward only;
};
logging {
# Log queries to a file limited to a size of 100 MB.
channel query_logging {
file "/var/log/named_querylog" versions 3 size 100M;
print-time yes; // timestamp log entries
severity info;
print-category yes;
};
category queries {
query_logging;
};
# Don't log lame server messages.
category lame-servers { null; };
};
# 内向きDNSの設定
view "lan" {
match-clients { 127.0.0.1; 192.168.1.0/24; };
# ルートのゾーン設定
zone "." in {
type hint;
file "root.hint";
};
# 正引きのループバックのゾーン設定
zone "localhost" in {
type master;
file "localhost.zone";
};
# 逆引きのループバックのゾーン設定
zone "0.0.127.in-addr.arpa" in {
type master;
file "127.0.0.zone";
};
# 正引きのおやじ宅内のゾーン設定
zone "example.zive.net" in {
type master;
file "example.zive.net.zone";
};
# 逆引きのおやじ宅内ゾーンの設定
zone "1.168.192.in-addr.arpa" in {
type master;
file "192.168.1.zone";
};
# example.comの正引きのゾーン設定
zone "example.com" in {
type master;
file "example.com.local";
};
};
# 外向きDNSの設定
view "wan" {
match-clients {
any;
};
recursion no; // 再帰的検索の禁止
# example.comの正引きのゾーン設定
zone "example.com" in {
type master;
file "example.com.zone";
allow-transfer { yyy.yyy.yyy.yyy; }; // セカンダリDNSのIPアドレスを記述(セカンダリDNSのみに転送)
allow-query { any; }; // 問合せは全て可
notify yes; // このzone設定に変化があったらnsで定義された
}; // dnsにnotify通知。
};
include "/etc/named.conf.include"; // デフォルトでrndc 関係をincludeしている
|
- directory
directoryは、デフォルトのまま。ここで指定したディレクトリに、各zoneファイルを置く。
- dump-file
「rndc dumpdb」でキャッシュされているメモリ内のデータをダンプ出力させるファイル名を指定する。
- statistics-file
「rndc stats」でサーバーの統計情報をダンプ出力させる統計情報ファイル名を指定する。
- notify
ベースは内向き DNS なので、notify通知は行わない、即ち、「notify no;」とした。外向きは、後述のように別途指定する。
- allow-query/allow-trasfer
allow-queryとallow-trasferで、デフォルトでは設定情報を外部に出さないように
localhost と家庭内のネットワークを設定する。外向きの情報は、外向きゾーン設定のところで開放する。(optionsでの設定より優先される)
RedHat のときは acl を使用して Alias で設定したが、YaST では acl の設置ができず、直接
named.conf に記述しても YaST に消されてしまう。従って、allow-query/allow-trasfer
の設定で、以下のようにアドレス/ネットワークを [ ; ] で区切って直接記述する。
オプション
|
概 要
|
設定内容
|
備 考
|
allow-query |
問合せ元制限 |
{ 127.0.0.1; 192.168.1.0/24; } |
アドレス/ネットワークを [ ; ] で区切って直接記述し、全体を { } でくくる。最後のアドレスの後ろの[
; ]も忘れずに。
|
allow-trasfer |
転送先制限 |
{ 127.0.0.1; 192.168.1.0/24; } |
- forwarders/forward
外部への問合せ先として forwarders で契約プロバイダの DNS を設定することにより、家庭内からの
DNS 問合せを高速化できます。本設定がない場合、キャッシュされていないドメインに関しては、常に
root に問合せに行くのでレスポンスが遅くなる。これを、契約プロバイダの DNS
経由にすれば非常に多くの方が使用しているので、キャッシュにヒットする確率が高くなり、レスポンスが改善する可能性がある。但し、おやじは元々契約プロバイダの
DNS が重いので内向きDNS を建てた経緯もあり、設定はしていない。
オプション
|
概 要
|
設定内容
|
備 考
|
forwarders |
問合せ先指定 |
{ 1.2.3.4; 5.6.7.8; } |
契約プロバイダの DNS を [ ; ] で区切って直接記述し、全体を { } でくくる。最後のアドレスの後ろの[
; ]も忘れずに。 |
forward |
forward動作指定 |
first |
first 指定で、まずフォワーダーに問合せ、駄目なら rootから検索する。 |
- ログ関係
/var/log 配下に named_querylog と言う名称で、クエリーのログを採ることにした。ファイル名の後ろの「versions
3 size 100M」は、100Mbyteのログファイルを 3世代保存するというデフォルト設定であるが、サイズが大きすぎて扱いにくいので、10Mぐらいにして世代を増やしたほうが実用的である。
severity info は、最低限のレベルのログ内容を出力する設定。ある程度詳細に採取したければ
infoをnoticeに、動作検証時などで非常に詳細なログ内容を出力したければ debugにすればよい。デバッグにすると膨大なログが出力されるので、注意が必要。通常はinfoで十分である。
print-time yes; print-category yes; でログに時間とカテゴリを出力する。
category lame-servers { null; } で逆引きのエラーログは捨てる。(apacheで逆引きしており、逆引きに失敗して非常に多くの「lame
server ・・・・」ログが出るので設定した。)
- view "lan" と view "wan" で、内向きと外向きを分離して設定する。「lan」や「wan」という名称は何でもかまわないので、自分が分かり易い名前をつければよい。但し、問い合わせを受けたとき、view
の記載順に match-client で定義されたアドレスとアクセス元アドレスが一致した
view の設定に基づいて返答するので、アドレスが特定できる内向きの view を必ず先に記述すること。
内向きの match-client には、localhost と家庭内のネットワークを、外向きの
match-client は「any」とする。これにより、家庭内からのアクセス以外は全て外向きのviewが使用される。
- 外向きデータは、recursion noとして再帰的な検索を禁止する。yesとするとキャッシュデータ等も検索される。
- 外向きゾーンの、allow-transfer { yyy.yyy.yyy.yyy; }; では、セカンダリ
DNS のみにゾーン転送するよう、セカンダリ DNS の IP アドレスを記述する。
allow-query { any; }; で、 問合せは全てから許可する。これら2つは、options
でデフォルトはlocalhost と家庭内のネットワークのみしか応答しないようにしているため、外部からの問い合わせ等に答えないので、ここで個別に指定する。
- 外向きゾーンの、notify yes; は、この zone 情報に変化があったことを ns で定義された
dns にnotify 通知するためのもので、これにより、セカンダリへの zone データの変更が速やかに行われる。デフォルトで
yes なので記述しなくても、マスタで zone 設定を変更して再起動すれば、すぐにセカンダリに反映される。(
serial 番号の変化で見ているので、内容を変更した場合は必ず serial 番号を上げることを忘れずに。)
- include でデフォルトで localhost のみ rndc が使用できるようになっている。
rndc の使用範囲等、rndc関係の設定は include 先の /etc/named.d/rndc-access.conf
を編集すれば良い。rndc 関係の設定について変更するなら、RedHat のコンテンツを参照のこと。
◆root.hint の設定(ルートゾーン)
このファイルはルートゾーンを定義しており、時々変更になるので、その場合はアップデートが必要になります。変更は数年に1回で、最近では2002年11月、2004年1月に変更になり、2007年11月に変更が予定されています。新しいルートヒントファイルは、以下のURLから入手できます。
変更は手動または自動でできますが、手動で変更する場合は以下のようにやればよいでしょう。
# cd /var/lib/named
# wget -O root.hint.new ftp://ftp.internic.net/domain/named.root
# mv root.hint.new root.hint |
ルートヒントファイルの変更にあたっては一般的に猶予期間が半年ほどありますが、おやじは変更漏れがないように簡単なスクリプトを書いて対応することにしました。
適当なディレクトリ(おやじは、 /usr/local/bin 配下)に、こちらのスクリプトを適当な名前で設置し、設定を適宜行い実行権限を変更しておきます。
# cd /usr/local/bin
# wget http://www.aconus.com/~oyaji/dns/root.hint.check
# chmod 755 root.hint.check |
後は、cronで適当なタイミングで実行すればよいだけです。/etc/crontab に下記を追記する。(下記は、毎週土曜日の1:23に実行する例である。)
# root.hintファイルの更新チェック
23 1 * * 5 root /usr/local/bin/root.hint.check |
◆localhost.zoneの設定(正引きのループバックゾーン)
root.hint を含め このファイル(localhost.zone)と次のファイル(127.0.0.zone)のデフォルトの3つのファイルは一切変更は不要です。極端な話、ループバックの2つのファイルは
hosts ファイルがある限り使われることはありませんし。
$TTL 1W
@ IN SOA @ root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1H ) ; minimum
IN NS @
IN A 127.0.0.1
|
◆127.0.0.zoneの設定(逆引きのループバックゾーン)
$TTL 1W
@ IN SOA localhost. root.localhost. (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1H ) ; minimum
IN NS localhost.
1 IN PTR localhost.
|
◆example.zive.net.zoneの設定(正引きの家庭内ゾーン)
$TTL 86400 (1) (2)
@ IN SOA example.zive.net. oyaji.example.zive.net. (
2004060600 ; serial (3)
3H ; refresh (4)
15M ; retry (4)
1W ; expiry (4)
1H ) ; minimum (4)
IN NS example.zive.net. (5)
IN MX 10 example.zive.net. (6)
@ IN A 192.168.1.100 (7)
router IN A 192.168.1.1 (8)
oyaji IN A 192.168.1.2 (8)
rina IN A 192.168.1.3 (8)
akko IN A 192.168.1.4 (8)
printer IN A 192.168.1.10 (8)
pdns IN A 192.168.1.100 (8)
www IN CNAME pdns (9)
mail IN CNAME pdns (9)
ftp IN CNAME pdns (9)
|
(1) 家庭内で使用するドメイン名(おやじは、インターネットと同じexample.zive.netを使用)を指定。(最後に
' . '(ピリオド)を忘れずに)
(2) サーバ管理者のメールアドレス(' @ 'を ' . 'に変えて指定。最後に ' .
'(ピリオド)を忘れずに)
(3) データベースのシリアル番号。(変更するたびに必ず値を増やすこと。年月日+追番がよい)
(4) リフレッシュ・リトライ・有効・生存時間(デフォルトのまま)
(5) ネームサーバ名を指定(サーバ名の最後に ' . '(ピリオド)を忘れずに)(1)とあわせること。
(6) メールエクスチェンジャの指定。(CNAMEは使用しないこと)
(7) example.zive.netでサーバのローカルアドレスを返すための設定。
(8) 各ホストの正引きデータを指定。
(9)別名定義を指定。(おやじは、サーバだけ用途毎の別名を登録した。DNSは、別名定義しないこと。言い換えれば、サーバが1台ならサーバ機はDNS名となる)素直に、(8)項と同様にAレコードで定義しても良い。
◆example.com.localの設定(内向きのexample.comの正引きのゾーン)
$TTL 86400 (1) (2)
@ IN SOA ns1.example.com. oyaji.example.zive.net. (
2004060600 ; serial (3)
3H ; refresh (4)
15M ; retry (4)
1W ; expiry (4)
1H ) ; minimum (4)
IN NS ns1.example.com. (5)
IN MX 10 example.com. (6)
@ IN A 192.168.1.101 (7) ns1 IN A 192.168.1.101 (8) www IN A 192.168.1.101 (8) mail IN A 192.168.1.101 (8) ftp IN A 192.168.1.101 (8)
|
(1) ネームサーバ名(外向きと合わせた)
(2) サーバ管理者のメールアドレス(家庭内はexample.zive.netで統一)
(3)〜(4) 前述と同一
(5) ネームサーバ名を指定(外向きと合わせた) (1)とあわせること。
(6) メールエクスチェンジャの指定。(外向きと合わせた)
(7) example.comでサーバのローカルアドレスを返すための設定。
(8) 各ホスト名をAレコードで定義(CNAMEのほうが簡単であるが)
◆192.168.1.zone の設定(逆引きの家庭内ゾーン)
$TTL 86400 (1) (2)
@ IN SOA example.zive.net. oyaji.example.zive.net. (
2004060600 ; serial (3)
3H ; refresh (4)
15M ; retry (4)
1W ; expiry (4)
1H ) ; minimum (4)
IN NS example.zive.net. (5)
1 IN PTR router.example.zive.net. (8)
2 IN PTR oyaji.example.zive.net. (8)
3 IN PTR rina.example.zive.net. (8)
4 IN PTR akko.example.zive.net. (8)
10 IN PTR printer.example.zive.net. (8)
100 IN PTR pdns.example.zive.net. (8)
101 IN PTR ns1.example.com. (8)
|
(1)〜(5)は、前述と同一.
(8)は、正引きの(8)で指定したホストの逆引きデータを指定。(別名定義したものではない)
◆example.com.zoneの設定(外向きのexample.comの正引きのゾーン)
$TTL 86400 (1) (2)
@ IN SOA ns1.example.com. oyaji.example.zive.net. (
2004060600 ; serial (3)
3H ; refresh (4)
15M ; retry (4)
1W ; expiry (4)
1H ) ; minimum (4)
IN NS ns1.example.com. (10)
IN NS nsx.zoneedit.com. (11)
IN MX 10 example.com. (12)
@ IN A xxx.xxx.xxx.xxx (13)
ns1 IN A xxx.xxx.xxx.xxx (14)
www IN A xxx.xxx.xxx.xxx (14)
mail IN A xxx.xxx.xxx.xxx (14)
ftp IN A xxx.xxx.xxx.xxx (14)
|
(1)〜(5)は、前述と同一.
(10) プライマリネームサーバ名を指定(レジストラに登録した自分のDNS)
(11) セカンダリネームサーバ名を指定(レジストラに登録したセカンダリDNS。とりあえずはなくても可。)
(12) メールエクスチェンジャの指定。(1)とあわせること。
(13) example.comでサーバのローカルアドレスを返すための設定。
(14) 各ホスト名をAレコードで定義
■ルータ/iptablesの設定
外向きでDNSを建てた場合、ルータやiptablesの設定変更が必要になります。ゾーン転送にはUDPの53番ではなく、TCPの53番を使用してセカンダリDNSからアクセスがあります。従って、WWWサーバ等と同様に、TCPの53番をサーバにポートマッピングしてフィルタを開けてあげる必要があります。このとき、セカンダリDNSのアドレスはわかっているので、アドレス指定を併用し不必要なアクセスは遮断すべきです。なお、セカンダリDNSがゾーンデータの変更チェックを行う時は、UDPの53番を使用します。
ゾーンの転送は、以下のような時に発生します。
- ゾーンのリフレッシュ間隔がタイムアップした。
- セカンダリDNSが、プライマリDNSからゾーン変更を通知された。(notify yes)
- セカンダリDNSが起動・再起動した。
■DNSの動作確認
動作確認は、BINDを起動してdigで行いますが、起動に先立ち各設定ファイルに誤りがないか確認しておきます。但し、内容そのものの正常性は確認できず、文法的な問題がないかをテストしてくれるだけなので、後で、内容についてはそれぞれ試験する必要があります。
- まず、named.confファイルが正常か確認する。確認には、named-checkconfコマンドを使用するが、単にnamed-checkconfとするだけ。文法的に問題がないかチェックしてくれ、下記は、8行目で認識できないオプションがあり、それはoptionである(正解は、options)と指摘している例である。
# named-checkconf
# /etc/named.conf:8: unknown option 'option'
|
- 続いて、named-checkzoneコマンドで各ゾーンファイルが正常か確認します。zone名とファイル名を入力してチェックします。問題がなければ、下記のようにserial番号が表示され、「OK」と表示される。全てのファイルをチェックしておく。
# cd /var/lib/named
# named-checkzone example.zive.net example.zive.net.zone
zone example.zive.net/IN: Loaded serial 2004060600
OK
|
- 設定ファイルでエラーがでなくなったら、下記で一応、chkconfig でチェックして各ランレベルでの起動確認をし、BINDを起動する。
# chkconfig --list named
named 0:off 1:off
2:off 3:off 4:off 5:off
6:off
# chkconfig named on
# chkconfig --list named
named 0:off 1:off
2:off 3:on 4:off 5:on
6:off
# /etc/init.d/named start
Starting name server BIND 9 done |
事前に設定ファイルをテストしているので、正常に起動するはずであり、ログファイル(/var/log/messages)に下記のようなメッセージが出力されているはずである。ログの内容は多少違うかもしれませんが、最低限各インタフェースで「listening」が53番ででるはずです。
Jun 6 11:59:19 server named[2822]: starting BIND 9.2.2 -t /var/lib/named
-u named
Jun 6 11:59:19 server named[2822]: using 1 CPU
Jun 6 11:59:19 server named[2824]: loading configuration from '/etc/named.conf'
Jun 6 11:59:19 server named[2824]: listening on IPv4 interface lo, 127.0.0.1#53
Jun 6 11:59:19 server named[2824]: listening on IPv4 interface eth0, 192.168.1.100#53
Jun 6 11:59:19 server named[2824]: listening on IPv4 interface eth0:1,
192.168.1.101#53
Jun 6 11:59:19 server named[2824]: command channel listening on 127.0.0.1#953
Jun 6 11:59:19 server named[2824]: zone 0.0.127.in-addr.arpa/IN: loaded
serial 42
Jun 6 11:59:19 server named[2824]: zone 1.168.192.in-addr.arpa/IN: loaded
serial 2004060600
Jun 6 11:59:19 server named[2824]: zone example.com/IN: loaded serial 2004060600
Jun 6 11:59:19 server named[2824]: zone localhost/IN: loaded serial 42
Jun 6 11:59:19 server named[2824]: zone example.zive.net/IN: loaded serial
2004060600
Jun 6 11:59:19 server named[2824]: zone example.com/IN: loaded serial 2004060600
Jun 6 11:59:19 server named[2824]: running
Jun 6 11:59:19 server named[2824]: zone example.com/IN: sending notifies
(serial 2004060600)
|
一応、netstatでnamed、rndcが起動しているか確認しておきます。TCPでの53番および953番、UDPの53番があれば大丈夫である。
# netstat -ln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
:
(snip)
:
tcp 0 0 192.168.1.100:53 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.101:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
:
(snip)
:
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN
:
(snip)
:
udp 0 0 192.168.1.100:53 0.0.0.0:*
udp 0 0 192.168.1.101:53 0.0.0.0:*
udp 0 0 127.0.0.1:53 0.0.0.0:*
|
- 続いて、digで外部のドメイン、アドレスに対する正引き・逆引き、家庭内の各パソコン等の正引き・逆引きをしてチェックしてみましょう。digの使い方については、manや他サイトを参照してください。
なお、example.zive.netやexample.comで牽くとサーバのプライベートアドレスが返り(example.zive.net.zoneの(8)の設定)、WAN側のグローバルアドレスを牽くことができません。といっても、家庭内からこのドメインを牽いたときにADSLルータのWAN側アドレスが牽けても、一般的なルータではローカル側からWAN側アドレスを指定しても、ping以外は無視されるか、WWWの場合は、ルータの設定画面が表示されてしまうのでほとんど役に経ちません。(自分のグローバルアドレスをCGI等でほしいときなど、不便です。)
Top Pageへ