2008年8月14日木曜日

MicrosoftDNSサーバのイベントID4515を解消する

WindowsServer2003で構成されたActiveDirectoryのドメインコントローラで、DNSが起動する際にイベントID4515を記録するときがあります。
関連して色々と調査したので情報エントリ、関連リンク先を一通り理解すればイベントID4515が発生する原因は全部潰せるとおもいます。
 
ActiveDirectoryのスキーマに精通してLDAPの理解があれば苦労しなかったのでしょうがなかなかそうもいかない…
イベント ID : 4515
ソース : DNS
種類 : 警告
説明 : ゾーン example.local はディレクトリ パーティション MicrosoftDNS から既に読み込まれましたが、ディレクトリ パーティション DomainDnsZones.example.local でこのゾーンの別のコピーが見つかりました。DNS サーバーはこのゾーンの新しいコピーを無視します。この競合をできるだけ早く解決してください。
※サーバイベントログより引用

 

あるお客さんの環境で発生したので、これを下記マイクロソフトのKBをを参考に解消しようとするとどうも細部が違う。

Windows Server 2003 の DNS サーバー ログにイベント ID 4515 が記録される
http://support.microsoft.com/kb/867464/ja


 

ADSIEDITを使用して ForestDnsZones と DomainDnsZones を参照したが、重複する情報は特にない。イベントログの文言も今回のケースとは少し違った。
 














表:この環境で確認できた状況
確認先状況
ForestDnsZonesサブドメイン「_msdcs.example.local」のゾーン情報が入っている
DomainDnsZonesexample.localのゾーン情報が入っているが情報が古い

 
結局、MicrosoftKBの解説はあくまで2003仕様のActiveDirectoryの話で、今回のケースでは過去にWindows2000Serverで構築されていたドメインとWindowsServer2003の”新ドメイン”があり、それらを統合する為に色々と相互接続設定をを試した名残があったのだろうということに落ち着いた。
 
 

以下調べたことをつらつらと記述。
 

DNSのActiveDirectory統合ゾーンがカギ


ActiveDirectory(以下AD…)で使うDNSはゾーン情報をAD内に持っています。
DNS(Domain)用のアプリケーションディレクトリパーティションがあって、それが「ForestDnsZones」と「DomainDnsZones」、Domain~ のほうは2003用ADにドメイン構築した際の「名前そのままゾーン」の保管先として、 "example.local" のリソースレコードが並んでいる。
Forest~ のほうは"example.local"ドメイン作成時に自動的に作られる委任サブドメイン"_msdcs.”ゾーンが、これにはSRVレコードが含まれる。
"_msdcs.”はアイランド問題の解消のため設置、フォレスト内のドメインコントローラに一意な識別子を設定する。
 

しかしこれらはWindows2000のADスキーマにはいない、もともと2000のADが抱えていた問題解消+いろいろ拡張性を考慮して改良したから。
 

関連用語のMS公式解説 (※解釈おかしい箇所があるかも知れないので要確認)
アプリケーションディレクトリパーティション(リンク:TechNet)
Windows2000ADのアイランド問題(リンク先の中段くらい)
ゾーン レプリケーション スコープ(リンク:TechNet)

では2000のADでゾーンはどこにいたのか探す。
WindowsでDNSの管理コンソールを立ち上げて、ActiveDirectory統合ゾーンのプロパティを見たらゾーンレプリケーションスコープの選択がある、選択肢は下記のリンク。
 


 

これがADの保管先と対応しているので表にしてみた。

















表:ADスキーマとAD統合ゾーンDNSとの関係
ADエントリゾーン情報のあるDN
/対応するゾーン レプリケーション スコープ
ForestDnsZonesCN=MicrosoftDNS, DC=ForestDNSZones, DC=example, DC=local
/ Active Directory フォレスト内のすべての DNS サーバー
DomainDnsZonesCN=MicrosoftDNS, DC=DomainDNSZones, DC=example, DC=local
/ Active Directory ドメイン内のすべての DNS サーバー
SystemCN=MicrosoftDNS, CN=System, DC=example, DC=local
/ Active Directory ドメイン内のすべてのドメイン コントローラ

 

統合ゾーンDNSの3つ目の保管先、"CN=MicrosoftDNS, CN=System"


SystemのMicrosoftDNSを調べると、ちゃんと "example.local"ゾーンが最新の状態で保管されている。
ちなみに "CN=System" の中身は DNを"DC=example, DC=local" として開く=ADSIEDITのデフォルトで開いているDNから簡単にたどれる。
さらにちょっと寄り道すると、実際のADのレプリケーションでレプリカされるのはこの情報で、ADのDNSはゾーン転送とかするわけでなく、ADのアプリケーションディレクトリパーティションを読み込む・更新を適用する、という動作をしている。
 

ということで上記ディレクトリパーティションはWindowsのDNSサーバが起動する際にゾーン情報を「System」→(「ForestDNSZones」→「DomainDNSZones」※カッコ内は未確認)という順番で読み込んでいるんだろうなと。
 

ほか今回確認した時点ではSystemには「逆引きDNSゾーン」、と「RootDNSサーバ達」のゾーンが格納されていた。
 

DNS管理コンソールで確認すると、正引き、逆引きともに ゾーン レプリケーション スコープ は「Active Directory ドメイン内のすべてのドメイン コントローラ」となっていた、上記対応表どおりだ。
 

なおRootDNSサーバゾーンは各DNSサーバサービス固有のものなのでSystemでいい。
 
 


実際どれを消したらいいのか


ここまでわかれば後は簡単だった。
「DomainDNSZones」の"CN=MicrosoftDNS"から"example.local"ディレクトリを削除してDNSを再起動、DNSイベントログにID:4515の警告はもう出ない。
 

結局はイベントログの "説明:" セクションを読み返してみると、ログ様の仰せのとおりだったと事後になって理解。警告・エラーを調査すると結局はいつもこうなりますね。
 
 

すでに2000Serverを使ったドメインコントローラなくなっていたので、そのあと正引き、逆引きゾーンの ゾーン レプリケーション スコープ を「Active Directory ドメイン内のすべてのドメイン コントローラ」から「Active Directory ドメイン内のすべての DNS サーバー」 に変更した。
※2000Serverが残っている場合もADスキーマ更新で行けるようです。
 

作業後のディレクトリパーティションとゾーン情報は下記になった。

















表:作業後のゾーン格納パーティション
ADエントリ保持しているゾーン情報
ForestDnsZones"_msdcs.example.local"
DomainDnsZones"example.local"
その他逆引きゾーン
System. (ルートDNSサーバの一覧)

 
 

まるまる当てはまる事例は少ないかも知れませんが、ID:4515で「ForestDNSZones」、「DomainDNSZones」、「MicrosftDNS(※このイベントログで出てくる際にはSystemを指す)」のキーワードに迷った人にこのエントリを参考にしてもらえると。