自宅ではWindows 2000をメインで使用していて、LinuxやFreeBSDでLAN内部にDNSを置いて宅内Webサーバへのアクセスなんかを快適にしていた。XPも使っているがWORKGROUP環境なのでシンプルな仕組みである。しかしDNSの効果はApacheのバーチャルホストと組み合わせると強力だ。
その利便性もあって新しく勤めた職場でサーバやネットワークを任されるようになり、DNSを導入することを提案し導入することになった。CentOSという定番なLinux OSでDNSサーバを構築した。社内にはWebプログラマーがいて、独自のWebシステムがあるのだが、今まではIPアドレスでアクセスしていた。私はこの職場に勤めた当初から非常に不便だと思ったのだ。
私のDNSの構築作業はすんなりと終わり、新しくグループウェア(GroupSession)等をセットアップしたり、社内の情報共有を改善することに成功した。Apacheで各種サービスを動かすので、バーチャルホストを使用するためにもDNSは欠かせなかったのだ。
しかし思わぬトラブルが待ち受けていた。
数日すると、LAN内のDNSサーバで名前解決が出来なくなるのである。
最初は、Google Chromeのベータ版を使用しはじめた人が立て続けに訴えたので、ブラウザの問題だと思った。しかし数日後は色々な環境でこの名前解決に失敗する症状が出始めた。
Windows XPにおいて「NSLOOKUP」は問題ないのでDNSサーバの問題では無いと判断した。しかし「PING」では名前解決に失敗する。キャッシュの問題か?
「NSLOOKUP」と「PING」及び「ブラウザ」は名前解決の挙動が違うことが分かった。
- 「NSLOOKUP」はキャッシュリゾルバを使わない
- 「PING」及び「ブラウザ」キャッシュリゾルバを使う
具体的に言えば、「DNS Client」と言う表示名の「Dnscache」サービスが災いしている。このサービスの説明はこの様に記述されている。
「このコンピュータのドメイン ネーム システム (DNS) 名を解決およびキャッシュします。このサービスが停止した場合、このコンピュータは DNS 名を解決できず、Active Directory ドメイン コントローラーを見つけることができなくなります。このサービスが使用不可にされた場合、このサービスに明示的に依存するサービスはすべて起動できなくなります。」
しかし弊害と言えば、ActiveDirectory環境下におけるドメインサーバを見失うということだけらしい。とりあえずサービスを再起動してみたところ名前解決の失敗が一時的に(数日間)解消される事を確認した。どうせAD環境ではないんだからと思い切ってサービスを停止して様子を見ることにした。見事に名前解決に失敗することは無くなった。全端末サービスを停止して回った・・なんてうざったいサービスなんだろう。
さて、先日自宅のLAN環境をようやくNTドメイン環境から、AD環境に移行させた。Windows 2000 Serverの5クライアントが手に入ったから(ようやく手が届く値段になった・・・涙)導入したのだ。もっとも、それまでLinuxサーバで稼動させていたDNSなどを止めてWindows 2000 Serverにした理由はWindowsアプリを常時稼動のマシンで使わざるを得なくなったからである。どうせなので一元管理したいなとAD環境で動かすことにした。
3日もしない間にものの見事にDNSによるLAN内のWebサーバのサブドメイン(ホスト名)を解決できなくなった。もちろんWindows 2000 ServerのDNSを使っている。前述のとおりAD環境下だから上記の「Dnscache」サービスを停止することも出来ない。
ここで発想を転換することにした。UNIX系のOSにはcronという使いやすいタスクスケジューラがある。Windowsにも一応タスクスケジューラは備わっている(分かりやすいが柔軟性は低い)。こいつでサービスを再起動するスクリプト(VBSやBAT)を実行すればいいんではないかと。
サービスを再起動する方法はすぐに見つかった。非常にありがたい情報である。(感謝!!)
気の短い人は応用編に答えが書かれている。SET service_name=Dnscacheと書き換えるだけでそのまま使用できる。万一先方のエントリーが無くなった場合非常に困るので転記させていただきます。元情報は上記サイトです。
@ECHO OFF
SET service_name=Dnscache
NET STOP %service_name%
SET max_count=3
SET loop_count=0
:service_start
NET START %service_name%
REM STARTできたら終わり
IF %errorLevel% == 0 GOTO service_restart_end
ECHO start失敗 (error level %errorLevel%)
SET /A loop_count=%loop_count% + 1
IF NOT %loop_count% == %max_count% GOTO service_start
:service_restart_end
とりあえずWindows起動時にBATファイルとして走ればいいかなと、タスクスケジューラに登録した。一週間以上様子を見ているが名前解決の失敗は発生していない。いい感じかも。
このWindowsの挙動不審な名前解決についてはネット上でも話題になっている様だ。
参考サイト


コメント
内部LAN専用DNSの構築
LANとは、Local Area Netoworkの略なので、「内部LAN」の「内部」が冗長ではあるが、
「HTTPプロトコル」みたいで(HTTPはHyp…
同じ問題で悩んでいました。ありがとうございます。DNS client なんてうざいんだ!
Windows ServerでActiveDirectoryを構築していると、Windows標準のDNSで稼働させることが出来るので、こういう問題は起きないみたいですね。MSの独自実装なDNSが災いしていると推測していますが、小回りの利くメーカーでは無いので、技術情報をもとに対処療法的にやるしかないなというのが、Microsoft社との付き合いで学習したことです。
個人的にはそろそろWindowsは要らないと思っています。Windowsに依存するアプリをどうしても使いたいケースってクリエータ系以外はそれほど無いんじゃないかと。もちろん企業さんとかの独自の業務アプリは別ですけどね。WebアプリならMacでもLinuxでもBSDでもSolarisでも、今時のスマホやiPadなんかでも大丈夫でしょう。時代はクラウド(Web)ですね。