内部LAN専用DNSの構築
LANとは、Local Area Netoworkの略なので、「内部LAN」の「内部」が冗長ではあるが、
「HTTPプロトコル」みたいで(HTTPはHyper Text Transfer Protocolの略)分かりやすいのでそう書く。
微妙で回避可能(hostsファイルにホスト名を追記するなど)な問題だったのでほっておいたけど、なぜそうなるのか理由が
理解できていなかったので調査内容をメモ。
LANを構築し、外部ネットワークに接続出来るように設定する。
そのLAN内に、外部に公開したい(例えば)Webサーバーの設定をしてポートを開けたりなんなりして公開したとする。
これで特に問題なく公開は出来るのだが、
そのWebサーバーが所属するネットワークから名前で(つまり、内部から内部宛で)そのWebサーバーを参照することが出来ない。
参照することが出来ない、と言うか、現在の環境だとルーターの設定画面につながってしまう。
無線LAN環境(Bufferlo WHR-G)にしている位な話で特に変わったことはないと思う。
なんとなくダメなんだろなくらいにしか考えていなくて結局真相を理解できないままでずっといたのだが、
◇自宅内DNSサーバーの構築◇初心者のためのLinuxサーバー構築講座☆お便利.com☆の
「LAN内の サーバー には、同じLAN内の他の クライアント機 から FQDN でのアクセスができない。」
と言う記述の中の
同じサブネット内の ホスト機 同士では、NATもIPマスカレードも無関係ですから、
というのが目からウロコだった。
というわけで、内部LAN用DNSを立ち上げることにする。
BINDはインストールされているものとします。
環境は
# named -v
BIND 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2設定内容は、ネームサーバーホスト名はns.example.comで、ドメインはexample.comとして記載しています。
関係ないけど「example.com」って説明用に予約されているんですねぇ。http://example.com/
設定ファイル(named.conf)
まずは、named.confを
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | //
// named.caching-nameserver.conf
//
// Provided by Red Hat caching-nameserver package to configure the
// ISC BIND named(8) DNS server as a caching only nameserver
// (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// DO NOT EDIT THIS FILE - use system-config-bind or an editor
// to create named.conf - edits to this file will be lost on
// caching-nameserver package upgrade.
//
options {
//listen-on port 53 { 127.0.0.1; };
//listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
// Those options should be used carefully because they disable port
// randomization
query-source port 53;
// query-source-v6 port 53;
allow-query { localnets; };
allow-query-cache { localnets; };
allow-transfer {localnets;};
forwarders{
192.168.1.1;
};
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
view localhost_resolver {
match-clients { localhost; };
match-destinations { localhost; };
recursion yes;
include "/etc/named.example.com.zone";
};
view internal {
match-clients {localnets;};
match-destinations {localnets;};
recursion yes;
include "/etc/named.rfc1912.zones";
include "/etc/named.example.com.zone";
}; |
ざっと説明すると、
・optionsでは、IPV6対応を無効(listen-on-v6, query-source-v6 )
・問い合わせ元、転送先を制限(allow-query, allow-query-cache, allow-transfer)をlocalnetsに制限。
「localnets」はちなみに予約語で、RedHatの/etc/named.confによると
localnets — ローカルシステムが接続しているネットワークのIPアドレスと一致。
です。
・forwardersには、現在のネットワークのルーターのアドレスを指定します。
・「localhost_resolver」と「internal」には「/etc/named.example.zone」でゾーンファイルを指定します。ルートゾーンの定義等は「/etc/named.rfc1912.zones」に定義されているので必要であればそれもインクルードします。
外出し設定ファイル
1 2 3 4 5 6 7 8 | zone "example.com" {
type master;
file "example.com.db";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "1.168.192.in-addr.arpa.db";
}; |
正引き、逆引きのファイルを指定します。
正引きゾーンファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 | $TTL 86400
@ IN SOA ns.example.com. root.example.com.(
2004031903 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.example.com.
IN MX 10 ns.example.com.
router IN A 192.168.1.1
svn IN A 192.168.1.2
example.com IN A 192.168.1.3 |
とりあえず、ルーターが1, サブバージョンで使うマシンが2, それ以外で「example.com」が自分を指すようにしました。
逆引きゾーンファイル
1 2 3 4 5 6 7 8 9 10 11 | $TTL 86400
@ IN SOA ns.example.com. root.example.com.(
2004031903 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.example.com.
IN PTR example.com.
1 IN PTR router.example.com.
2 IN PTR svn.example.com. |
なんだか(ホスト・ドメイン名を置き換えてるため)設定そのまま貼り付けたわけじゃないのでこれで実際に動くのか微妙かもしれません。
これでservice named startで起動しておきます。
そして、今までネームサーバーとなっていたルーターのDNSサーバーの設定(多分どっかにあるはず)を、今設定したネームサーバーのIPアドレス(192.168.1.3)に設定すればOKです。
これでしばらく運用していたのですが、どうしても内部ネットワークに置いてある公開用自ドメインのWeb画面にアクセスするとルーターの設定画面に飛んでしまう現象があった。(ネットワーク接続直後は必ずだが、なぜか10分くらいして再度試すとうまく自ドメインのサイトに接続出来る)
DNSサーバー側のキャッシュをクリアしたり、クライアント側のキャッシュをクリアしたりしていたのですがどうにも解消されませんでしたが、ある時以下ページを見っけました。
sasapurinのブログ: Windows XPにおけるLAN内DNS使用時の不具合
具体的に言えば、「DNS Client」と言う表示名の「Dnscache」サービスが災いしている。このサービスの説明はこの様に記述されている。
「このコンピュータのドメイン ネーム システム (DNS) 名を解決およびキャッシュします。このサービスが停止した場合、このコンピュータは DNS 名を解決できず、Active Directory ドメイン コントローラーを見つけることができなくなります。このサービスが使用不可にされた場合、このサービスに明示的に依存するサービスはすべて起動できなくなります。」
しかし弊害と言えば、ActiveDirectory環境下におけるドメインサーバを見失うということだけらしい。とりあえずサービスを再起動してみたところ名前解決の失敗が一時的に(数日間)解消される事を確認した。どうせAD環境ではないんだからと思い切ってサービスを停止して様子を見ることにした。見事に名前解決に失敗することは無くなった。全端末サービスを停止して回った・・なんてうざったいサービスなんだろう。
ほんとにうざったいサービスだ(笑)。ActiveDirectoryがダメになるだけだしサービスからこれを停止して手動に切り替えしてみた。
そうすると同様の現象は出なくなった。
ただ、DNSClientを止めると、Windows系の開発で良くやる(かな?)Windows\system32\drivers\etc\hostsファイルの指定も効かないっぽいが、その時だけDNSClientが立ち上がっていれば良い。
