朝日ネットでインフラ設計・構築を担当しているトランシュメール・ステファンです。
先日Windowsホストの再構築をした際、DNS設定が更新されない問題に直面し、適切な情報が見つけられずに対応に苦労しました。
今回はこの問題について、ネットでは見つけづらい手軽な対処法を紹介します。
Windows DNSのおさらい
Windowsのドメインは当初は「NTドメイン」でしたが、Windows 2000から「ADドメイン」という方式も誕生し、現在はADが標準です。
NTドメインではホスト名はNetBIOS方式に基づいています。名前は最大15文字です。 ADではホスト名はFQDNベースなのでDNSが必要になります。 そのため、ADサーバーを作成したら、このサーバーは「ADドメインサービス」及び「DNSサービス」を提供します。
ADサーバー(及びDNSサーバー)
ADのDomain Controllerが既にあるものとして説明します。
サーバーマネージャー を開けて、 ツール メニューで DNS。
ツリーを展開して、 前方参照ゾーン(正引き)では AとAAAAレコード が見えて、 逆引き参照ゾーン(逆引き)では PTRレコード が見えます。
WindowsのDNSサービスの中で、 各エントリがADオブジェクトになります 。 従って、各エントリがADのACLの対象になります 。
Windowsクライアント
ネットワークの設定画面でドメインに接続するWindowsクライアントは自分の名前を自動的にADサーバーのDNSに書き込むことができます。
Windowsの [TCP/IP詳細設定] で [DNS設定] を確認します。
この [接続のアドレスをDNSに登録する] というボックスがチェックされていると、Windowsクライントが自分でDNSのゾーンを編集して追加します(なお、デフォルト設定ではチェックあり)。
更新頻度は 15分 です。
これでホスト名とIPアドレスの対応が正しい状態を保てます。
DNSレコードが更新されない問題
しかし、Windowsクライアントで自動的にDNSに登録する設定を有効にしてもゾーンに乗っているレコードが更新されないことがあります。
その問題は、Windowsホストを再構築したときに発生します。
問題の原因
原因は、ADのsecurity identifier(SID)によるコンピュータオブジェクト管理です。
Unixの世界ではDNSサービスは「ゾーンファイル」というテキストファイルの内容に基づいています。 WindowsのDNSサービスではDNSレコード(Aレコード、AAAAレコード、PTRレコード)の一つ一つはユニークなSIDに紐づきます。 SIDはAccess Control List(ACL)の対象であるため、そのSIDを持つホストでしか更新できません。
新しいホストを構築し、ドメインに登録すると新しいADコンピュータオブジェクトと新しいSIDがアサインされます。 DNSレコード(Aレコード、AAAAレコード、PTRレコード)が以前のホストとそのADコンピュータオブジェクトのSIDで登録され、新しいホストではレコードを編集できません。
なお編集自体は実施しようとするので、Windowsのログに編集できないエラーが出力され続けます。
古いホストがなくなると上記のように "不明なアカウント" と、名前ではなくそのSIDで現れます。
この状態では手動でDNS変更作業しないとこのエントリが永久にこのまま残ります。
問題の整理
- 前提
- DNS情報を最新化するために、[TCP/IP詳細設定] - [この接続のアドレスをDNSに登録する]にチェックをしている環境
- 影響
- DNS名、IPアドレスが同じである新ホストを構築する場合
- ADのレコードを更新できないことを示すエラーが出力され続ける
- 「不明なアカウント」という不要オブジェクトがADに残り続ける
- DNS名は同じで、IPアドレスが異なる新ホストを構築する場合
- DNS名と紐づくIPアドレスを変更できないため、名前解決ができない
- ADのレコードを更新できないことを示すエラーが出力され続ける
- 「不明なアカウント」という不要オブジェクトがADに残り続ける
- DNS名、IPアドレスが同じである新ホストを構築する場合
対応方法
対応方法は以下3種類ですが、1つ目と2つ目は手動での対応。3つ目は設定での自動対応になります。
DNSレコード削除と手動登録
DNSサービスで該当のそれぞれのエントリ(Aレコード、AAAAレコード、PTRレコード)を削除し、Windowsクライアントでは command line を 管理者権限 で実行して下記のコマンドを実行させます。
ipconfig /registerdns
新ホストでフルコントロール
それぞれのエントリ(Aレコード、AAAAレコード、PTRレコード)に 新ホストのADコンピュータアカウント を追加して フルコントロール にさせます。 複数ホストの場合、大変なのでpowershellを使った方が適切と思いますが、スクリプトの作成が必要です。
scrubbingによる対応
もう一つの対応方法です。
エージング の設定で、指定した日数が経ってもホストが自分のDNSエントリを更新しなければDNSエントリが削除されるようにすることができます。 削除後は新たな機材からの更新要求にて新エントリが追加されます。
!注意! 「自動的にDNSに登録する設定を有効」の設定は15分周期で登録をするため、scrubbingで古い定義が削除されてから正しいエントリの自動生成が行われるまで最大15分間定義がない時間が発生します。 その間ホストのDNS名はなくなって、FQDNに基づいている通信が失敗します。
なお、日本語版Windowsではscrubbingは"清掃"と表現されているようです。とても分かりにくいです。
あとがき
今回紹介した事例は弊社のWindows環境で実際に起きた問題です。 始めにも書きましたが、上記対処方法は日本語サイトでも英語サイトでもなかなか見つからず苦戦しました。 この記事が同じ問題に直面しているエンジニアの助けになれば幸いです。
採用情報
朝日ネットでは新卒採用・キャリア採用を行っております。