この記事は、同じ IP アドレスで複数のレコードが登録される問題のトラブルシューティングに役立ちます。 この問題は、ドメイン ネーム システム (DNS) の清掃の構成と、動的ホスト構成プロトコル (DHCP) のリース期間が原因で発生します。
シナリオ
次のシナリオについて考えてみます。
DHCP サーバーには、次の構成があります。
- DHCP スコープのリース期間は、既定の 8 日間に設定されます。
- DHCP スコープは、使用可能な IP アドレスで低くなっています。
- クライアント A は 8 日間で IP アドレスのリースを更新せず、有効期限が切れます。
- クライアント B が新しい IP アドレスを要求します。
- DHCP サーバーは、クライアント A にリースされているアドレスをクライアント B に割り当てます。
このシナリオは一般的であり、すべてが正しく動作します。
DNS サーバーには、次の構成があります。
- Active Directory (AD) 統合 DNS ゾーンは、古いリソース レコードを清掃するように設定されています。
- DNS レコードの清掃では、既定の設定が使用されます。 更新間隔 = 7 日、 Refresh 間隔 = 7 日、 Scavenging 期間 = 7 日。
- クライアント A は、クライアントの DHCP リースが最後に更新された 8 日前に DNS レコードを更新しました。
- 既定では、クライアント A は DNS レコードの所有者であるため、DHCP サーバーによってレコードを削除することはできません。
- クライアント B は、DHCP サーバーから受信した新しい IP アドレスに DNS レコードを登録します。これは、クライアント A に登録されたレコードと同じです。
このシナリオでは、DNS サーバーはクライアント A の DNS レコードを 6 日間清掃できません。 これで、クライアント A とクライアント B は、DNS に同じ IP アドレスが登録されています。
問題の分析
異なる名前の DNS レコードが同じであるため、いくつかの問題が発生します。 たとえば、Microsoft System Center Configuration Manager (SCCM) クライアントでのインストールの問題などです。
次に別の例を示します。 クライアント A で共有にアクセスすると、クライアント A がオンになっていない場合でも、次のエラー メッセージが表示されます。
このエラーは、1 台のコンピューターを対象とした Kerberos チケットが別のコンピューターに送信されるために発生します。 次のセクションでは、プロセス全体について説明します。
ログオンエラー時のネットワーク フロー
コンピューター (Infra-App1) は、 client-a.corp.contoso.com
の DNS クエリを実行します。 DNS 応答は、IP アドレス 10.0.0.100 で返されます。
DNS に関する限り、結果は正しいです。 クライアント A には、IP アドレスとして 10.0.0.100 が表示されます。クライアント B も同様です。
次に、コンピューター Infra-App1 が Kerberos チケットを要求します。 DNS クエリはクライアント A 用であるため、チケット付与サービス (TGS) 要求もクライアント A 用です。
TGS 要求:
ドメイン コントローラーの応答:
コンピューター Infra-App1 がチケットを受け取った後、コンピューターはクライアント A への接続を試みます。Kerberos チケットはこのフレームに含まれています。
最後に、コンピューター Infra-App1 がクライアント B に接続しているため、リモート クライアントからエラーが返されます。
Kerberos を動作させるには、適切なアカウントに適切なチケットを提示する必要があるため、このエラーが発生します。
Note
Kerberos の詳細については、「ビジー状態の管理者の Kerberosを参照してください。
この問題は、Kerberos 認証ではなく New Technology LAN Manager (NTLM) 認証が使用されるため、完全修飾ドメイン名 (FQDN) の代わりに IP アドレスを使用する場合は発生しません。 IP アドレスを使用してクライアントに接続する場合、どのクライアントに接続されているかは想定されません。 そのため、コンピューターは最初に NTLM をネゴシエートする必要があります。 scenario セクションの例では、Kerberos は有効な応答を返します。そのため、コンピューターは NTLM を使用するようにフェールオーバーされません。
解決策
この問題は古い DNS レコードに関連しているため、さまざまな解決策を使用して問題が発生しないようにすることができます。
Note
解決ごとに、清掃間隔を 1 日から 3 日に短縮することをお勧めします。 7 日間の既定値は、無効なレコードが DNS に残っている期間を延長します。
解決策 1
利:
DHCP リースは、DNS レコードが消去されるまで保持されます。 他のクライアントはアドレスを受信せず、DNS に登録します。
不利:
DHCP スコープが既にアドレスに不足している場合は、IP アドレスが不足する可能性があります。
時間差が小さいため、リースの有効期限が切れる前にレコードの一部が消去されない場合があります。 清掃間隔を 1 日に設定すると、古いレコードが翌日に削除されます。
解決策 2
DHCP リースに一致するように、 更新 + 更新 間隔を減らします。 scenario セクションの例では、更新と Refresh の両方を 4 日間に減らすことができます。
利:
既存の DNS レコードは、最初のソリューションと同じ結果を迅速に達成します。
不利:
これらが AD 統合 DNS ゾーンの場合、AD レプリケーションの頻度が増加します。 これは、DNS レコードがクライアントによってより頻繁に更新されるためです。 たとえば、7 日ごとではなく 4 日ごとです。
時間差が小さいため、リースの有効期限が切れる前にレコードの一部が消去されない場合があります。 清掃間隔を 1 日に設定すると、古いレコードが翌日に削除されます。
解決策 3
DHCP サーバーがクライアントに代わってアドレスを登録できるようにします。
利:
DHCP サーバーは、リースの有効期限が切れるとすぐに DNS レコードを削除できます。 セットアップが正しい場合は、重複するレコードは存在しません。
不利:
セットアップの方が複雑です。
DHCP サービスを実行するようにサービス アカウントを設定する必要があります。または、すべての DHCP サーバーを DNSUpdateProxy グループに参加させる必要があります (安全性が低くなります)。 この構成により、複雑さが増します。
これを行うには、「 Windows で DNS 動的更新を構成する方法を参照してください。
DHCP リース期間、 更新間隔、 間隔、および Refresh 間隔を試してください。 既定値から完全に離れる必要がある場合があります。 低い DHCP リース期間 (時間単位) は、ワイヤレス サブネットに使用される場合があります。 ただし、サーバーのパフォーマンスに注意してください。特に、大規模な DNS ゾーンで数時間ごとに清掃するように DNS サーバーが設定されている場合は注意してください。
重複する IP を持つレコードを識別する
このセクションでは、PowerShell を使用して重複するレコードを識別する方法について説明します。 このスクリプトは、重複する IP アドレスを含む DNS 内のレコードを検索することを目的としています。
#Import the Active Directory Module
import-module activedirectory
#Define an empty array to store computers with duplicate IP address registrations in DNS
$duplicate_comp = @()
#Get all computers in the current Active Directory domain along with the IPv4 address
#The IPv4 address is not a property on the computer account so a DNS lookup is performed
#The list of computers is sorted based on IPv4 address and assigned to the variable $comp
$comp = get-adcomputer -filter * -properties ipv4address | sort-object -property ipv4address
#For each computer object returned, assign just a sorted list of all
#of the IPv4 addresses for each computer to $sorted_ipv4
$sorted_ipv4 = $comp | foreach {$_.ipv4address} | sort-object
#For each computer object returned, assign just a sorted, unique list
#of all of the IPv4 addresses for each computer to $unique_ipv4
$unique_ipv4 = $comp | foreach {$_.ipv4address} | sort-object | get-unique
#compare $unique_ipv4 to $sorted_ipv4 and assign just the additional
#IPv4 addresses in $sorted_ipv4 to $duplicate_ipv4
$duplicate_ipv4 = Compare-object -referenceobject $unique_ipv4 -differenceobject $sorted_ipv4 | foreach {$_.inputobject}
#For each instance in $duplicate_ipv4 and for each instance
#in $comp, compare $duplicate_ipv4 to $comp If they are equal, assign
#the computer object to array $duplicate_comp
foreach ($duplicate_inst in $duplicate_ipv4)
{
foreach ($comp_inst in $comp)
{
if (!($duplicate_inst.compareto($comp_inst.ipv4address)))
{
$duplicate_comp = $duplicate_comp + $comp_inst
}
}
}
#Pipe all of the duplicate computers to a formatted table
$duplicate_comp | ft name,ipv4address -a
出力のサンプルを次に示します。
この PowerShell スクリプトは簡単です。 スクリプトをサンプルと考えてください。 このスクリプトは、AD の実際のコンピューター アカウントに登録されている重複する IP アドレスのみを返します。 このスクリプトは、AD ドメイン内のすべてのコンピューターに対してクエリを実行します。 次に、DNS クエリを実行して IP アドレスを取得します。 コンピューターが多数ある場合は、get-adcomputer
で -searchbase
スイッチを使用して、毎回返されるコンピューターの数を制限します。 コンピューターが AD に参加していない場合、コンピューターは get-adcomputer
コマンドから返されません。