Q

親ドメインと子ドメインのドメイン・ツリーで,ドメインごとにサイトに割り当てて,Active Directoryを運用しています。各サイトにはDNSサーバー,グローバル・カタログ・サーバーを設置していますが,子ドメイン内でグローバル・カタログを利用するアプリケーションが動作しないことがあります(図1)。調査した結果,サイト間のネットワークが切断されているとき,このトラブルが発生していました。そもそもサイト間のネットワークが切断された場合を考慮して,子ドメインのサイト内にグローバル・カタログを設置したにもかかわらず,それを利用するアプリケーションが動作しないというのは不思議な話です。どういうことなのでしょうか?

 なお,各ドメインのDNSサーバーはドメイン内の情報のみしか保持していません。親ドメインのDNSサーバーは子ドメインのDNSゾーンに対して委任しており,子ドメインのDNSサーバーは親ドメインのDNSに対してフォワーダを設定しています。


図1●グローバル・カタログがあるのにそれを利用するアプリケーションが動作しないことがある
各ドメインのDNSはドメイン内の情報のみしか保持しておらず,子ドメインのDNS側で親ドメインのDNSに対してフォワーダの設定を行っている。この構成では,各サイトにそれぞれグローバル・カタログを設置していても,サイト間のネットワークが切断されると,グローバル・カタログを利用するアプリケーションが動作しないことがある。

A

上記のように,各ドメインのDNSサーバーがドメイン内の情報しか保持していない環境では,各サイトにグローバル・カタログ・サーバーを設置しても,グローバル・カタログを見付けられないことがあります。

 通常,各ドメインに新たにマシンを追加すると,そのマシンに関するホスト名やIPアドレスはそのドメインを管理しているDNSサーバーに登録されます。従って,そのドメイン内のDNSサーバーだけで名前解決することで,追加したマシンへアクセスできるようになります。


図2●親ドメインと子ドメインにそれぞれ設置しているDNSサーバーのゾーン情報
子ドメインのDNSサーバーに本来登録されているはずのグローバル・カタログ(GC)が,親ドメインのDNSサーバーに登録されている。

 しかしグローバル・カタログだけは子ドメインに設置しても,子ドメインのDNSサーバーにその所在を表すSRVレコードが登録されません(図2)。最初に構築したドメイン(ここでは親ドメイン)のDNSサーバーに登録されます。これは,Windows 2000のActive Directoryの仕様です。

 どういう状態になるかを簡単に説明しましょう。グローバル・カタログへアクセスするためにグローバル・カタログの情報を取得しようとしますが,子ドメインのみを管理しているDNSサーバーでは名前が解決できません。そのためフォワーダに設定された親ドメインのDNSサーバーに問い合わせて解決することになります。このとき,子ドメインと親ドメインの間ネットワークが切断されていると,親ドメインのDNSサーバーにアクセスできなくなります。その結果,グローバル・カタログに関する情報の問い合わせができず,グローバル・カタログを見付けることができないというトラブルが発生します。

 このトラブルを回避する方法は3つあります。(1)グローバル・カタログの情報が記録されているSRVレコードのTTLを通常よりも長く設定する方法,(2)_msdcs.<親ドメイン名>を別ゾーンとして管理しその部分のみを子ドメインのDNSに登録する方法,(3)親ドメインのすべてのゾーンを子ドメインのDNSに登録する方法です。

 (1)は,設定対象であるSRVレコードが,「_ldap._tcp.<所属するサイト名>._sites.gc._msdcs.<親ドメイン名>」「_ldap._tcp.gc._msdcs.<親ドメイン名>」「_gc._tcp.<サイト名>._sites._msdcs.<親ドメイン名>」「_gc._tcp._msdcs.<親ドメイン名>」などと複数あり,設定が面倒です。

 (2)はちょっとしたコツが必要な上に,ドメイン・コントローラを追加するときに,追加したドメイン・コントローラを正しく認識できずに既存のドメイン・コントローラとの間の複製ができなくなるなど,トラブルの原因となる場合がありますので注意が必要です。このため,一般的にはあまりお勧めできません。


図3●親ドメインのゾーン情報を子ドメインのDNSサーバーにコピーすれば,この問題を解決できる
こうすれば,サイト間のネットワークに障害が発生しても,子ドメインのDNSサーバーだけで親ドメインのゾーン情報に対するDNSクエリーにも回答できるようになる。

 ゾーン転送のトラフィックやセキュリティに問題がない場合は,(3)の親ドメインのDNSで管理するすべてのゾーンを「標準セカンダリ」として保持する方法がお勧めです(図3)。設定や管理も煩雑にならず,トラブルの原因にもなりにくいです。

 子ドメインのDNSサーバーで,親ドメインのDNSサーバーのゾーンを「標準セカンダリ」として保持する設定は簡単です。まず,親ドメイン側のDNSでゾーン転送が対象サーバーに対して許可されているかを確認します。確認はプライマリ・ゾーンのプロパティで行います。

 そして子ドメインのDNSサーバー側で新しいゾーンを作成し,ゾーンの種類は[標準セカンダリ]を選択します(図4)。ゾーンの名前は親ドメインを指定し,転送元のサーバーとして親ドメインのDNSサーバーを指定するだけです。


△ 図をクリックすると拡大されます
図4●子ドメインのDNSサーバーで新しく作成したゾーンは,親ドメインが管理するゾーンの標準セカンダリに設定する

 設定が終わったら,DNSの管理ツールで子ドメインのDNSサーバーと親ドメインの情報が同一かを確認します。子ドメインのDNSサーバーに親ドメインのゾーン情報が反映されるまでに,若干時間がかかるので注意してください。

 最後に余談ですが,Windowsサーバーの最新OSである「Windows Server 2003」のRC(製品候補版)2を検証したところ,最初に構築したドメインの_msdcs配下の情報を別ゾーンとして管理し,そのゾーン情報をすべてのDNSサーバーに複製するようになっていました。このため,新OSでは今回のような設定は不要になるはずです。

黒田剛