Q

クライアントPCのTCP/IP設定で社内用のDNSサーバーを[優先DNSサーバー]に,インターネット用のDNSサーバーを[代替DNSサーバー]として指定しています(図1)。ところが,DNSサーバーの順序を入れ替えると社内のホスト名を引けません。複数のDNSサーバーを設定すると,名前解決できない場合,優先から代替サーバーへと順に問い合わせるのではないのでしょうか?


△ 図をクリックすると拡大されます
図1●TCP/IPのプロパティ画面で2つのDNSサーバーのIPアドレスを登録した例
A

DNSのクライアント(リゾルバ)で複数のDNSサーバーを指定しても,名前解決ができない場合に登録されたすべてのDNSサーバーへ常に順番に問い合わせるわけではありません。[詳細設定...]ボタンでも複数のDNSサーバーを指定できますが同様です。

 基本的には「DNSサーバーが何も答えを返さない場合,次々に問い合わせる」という動作です。最初のDNSサーバーへ問い合わせで,「このようなドメイン名(ホスト名)は存在しない(NXDOMAIN - rcode=3)」という答えが返ってくれば,2台目以降のDNSサーバーへは問い合わせません

必ずしも代替サーバーは使わない
 NT 4.0 Service Pack 5以降では,DNSサーバーへ問い合わせを行い「NOERROR - rcode=0」あるいは「NXDOMAIN rcode=3」が返ってくれば問い合わせは終了します(SP4までは「SERVFAIL rcode=2」の場合でも問い合わせが終了していたのですが,SP5で修正されました。詳細はMicrosoftのKnowledge Base(文書番号:Q195611)に記載されています。

 NT 4.0 SP4以降やWindows 2000のリゾルバでは,平行して複数のDNSサーバーへ問い合わせを行うなど様々な改良が行われています(文書番号Q198550,Q261968など)。

 Windows 2000に関しては「Microsoft Windows 2000 Serverリソースキット6 TCP/IPガイド」の「6.2 Windows 2000 リゾルバ」の節も参考になります。

 社内用とインターネット用のDNSサーバーが異なり,それぞれ分断された名前空間を保持する場合,リゾルバの設定だけではすべての名前空間を引くことはできません。元々DNSのドメイン名前空間は複数のツリーを構成できるように設計されていないため,ある意味正しい動作といえます。

 このような場合,一般にはDNSサーバー側でフォワーダ(forwarders)という設定を行うことで対処します。質問のケースで,社内用DNSサーバーを優先させるとインターネット用DNSサーバーを利用できるのは,社内用DNSサーバーにおいてインターネット用DNSサーバーがフォワーダ先として設定してあるためです。


△ 図をクリックすると拡大されます
図2●DNSの管理コンソールでフォワーダの設定を[有効]にして,フォワーダ先のDNSサーバーのIPアドレスを登録する

 BIND 8,BIND 9ではnamed.conf中のoptionsステートメント中で,Microsoft DNSサーバーの場合は,DNS管理コンソール上でサーバーのプロパティを開き[フォワーダ]タブ中で設定します(図2)。

 この環境では,リゾルバが最初に社内用DNSサーバーへ問い合わせた場合は,社内のゾーンは自力で,インターネット上のゾーンはインターネット用DNSサーバーが解決して期待した結果を得られます。

 ところが,質問のように優先順位を変えて最初にインターネット用のDNSサーバーへ問い合わせると,インターネット上のゾーンは名前解決できても,社内用のゾーンは解決できません。社内用DNSサーバーは,インターネット上のルート・サーバーからたどれず,またフォワーダも設定されていないためです。

 nslookup.exeでserverコマンドを使用すると,問い合わせ先のDNSサーバーを切り替えられますので,社内用とインターネット用の各DNSサーバーへ直接問い合わせを投げてみると結果の違いをチェックできます。

 この問題を解決するには,インターネット用のDNSサーバー上で社内用のDNSサーバーをフォワーダとして指定するという短期的な手段がありますが,外に見せたくない名前空間が外部へ漏えいする副作用があります。また,インターネット用DNSサーバーではほとんどの場合に動的更新(Dynamic Update)を許可しないので,Active Directory環境では,名前登録の失敗などの問題を起こします。

社内用スレーブ・サーバーを用意

リゾルバで複数のDNSサーバーを指定するのは,本来は冗長性を持たせて耐障害性を高めるためです。そこで質問のケースで最良の対策は,社内用のスレーブ(セカンダリ)サーバーを用意し,それらを代替DNSサーバーなどに指定してインターネット用のDNSサーバーを指定しないことでしょう。

BIND 9では,viewステートメントを使用して,問い合わせ元クライアントや問い合わせ先ドメイン名によって見せるゾーンを変更したり,別々のフォワーダを指定したりでき,これも1つの解決方法です(Microsoft DNSサーバーには今のところそのような機能は実装されていません)。しかし,この機能に頼り過ぎると,無計画にActive Directoryドメインを作成し,互いに分断された複数の名前空間が社内に乱立することになります。

小森博司