本文可帮助你排查使用同一 IP 地址注册多个记录的问题。 此问题是由域名系统(DNS)清理和动态主机配置协议(DHCP)租约持续时间引起的。
场景
请考虑以下场景。
在 DHCP 服务器上,你具有以下配置:
- DHCP 作用域的租约持续时间设置为默认的 8 天。
- DHCP 范围在可用 IP 地址上较低。
- 客户端 A 不会在 8 天内续订其 IP 地址租约并过期。
- 客户端 B 请求新的 IP 地址。
- DHCP 服务器将客户端 B 分配租给客户端 A 的地址。
此方案很典型,一切正常。
在 DNS 服务器上,你具有以下配置:
- Active Directory (AD) 集成 DNS 区域设置为已过时的资源记录。
- DNS 记录清理使用默认设置: 无刷新间隔 = 7 天, 刷新间隔 = 7 天, 清理周期 = 7 天。
- 客户端 A 在八天前更新客户端的 DHCP 租约时续订了其 DNS 记录。
- 默认情况下,客户端 A 是其 DNS 记录的所有者,因此 DHCP 服务器无法删除该记录。
- 客户端 B 使用从 DHCP 服务器接收的新 IP 地址注册其 DNS 记录,该地址与注册到客户端 A 的记录相同。
在此方案中,DNS 服务器无法再对客户端 A 的 DNS 记录再进行六天。 现在,客户端 A 和客户端 B 在 DNS 中注册了相同的 IP 地址。
问题分析
由于不同名称的 DNS 记录相同,因此会出现多个问题。 例如,Microsoft System Center Configuration Manager (SCCM) 客户端的安装问题。
再提供一个示例。 在客户端 A 上访问共享时,即使客户端 A 未打开,也会收到以下错误消息。
之所以出现此错误,是因为一台计算机的 Kerberos 票证将发送到另一台计算机。 以下部分将演练整个过程。
登录失败期间的网络流
计算机 (Infra-App1) 执行 client-a.corp.contoso.com
DNS 查询。 使用 IP 地址 10.0.0.100 返回 DNS 响应。
就 DNS 而言,结果是正确的。 客户端 A 的 IP 地址为 10.0.0.100,客户端 B 也是如此。
然后,计算机 Infra-App1 请求 Kerberos 票证。 DNS 查询适用于客户端 A,因此票证授予服务(TGS)请求也适用于客户端 A。
TGS 请求:
域控制器的响应:
计算机 Infra-App1 收到票证后,计算机将尝试连接到客户端 A。此帧中包含 Kerberos 票证。
最后,远程客户端返回错误,因为计算机 Infra-App1 连接到客户端 B。
由于必须向正确的帐户显示正确的票证才能使 Kerberos 正常工作,因此会出现此错误。
注意
有关 Kerberos 的详细信息,请参阅 忙碌管理员的 Kerberos。
如果使用 IP 地址而不是完全限定的域名(FQDN),则不会发生此问题,因为使用新技术 LAN 管理器 (NTLM) 身份验证而不是 Kerberos 身份验证。 使用 IP 地址连接到客户端时,没有关于要连接到哪个客户端的假设。 因此,计算机必须首先协商 NTLM。 对于方案部分中的示例,Kerberos 返回有效的响应,因此计算机不会故障转移以使用 NTLM。
解决方法
由于此问题与过时的 DNS 记录相关,因此可以使用不同的解决方法来防止问题发生。
注意
对于每个分辨率,我们建议将清理间隔降低到 1 到 3 天。 七天默认值延长了无效记录保留在 DNS 中的时间段。
解决方法 1
增加 DHCP 租约持续时间以匹配 “无刷新 + 刷新 ”间隔。 对于方案部分中的示例,可以将 DHCP 租约增加到 14 天。
优势:
DHCP 租约将一直保留,直到清理 DNS 记录。 其他客户端不会在 DNS 中接收并注册地址。
缺点:
如果 DHCP 范围在地址上已较低,则 IP 地址可能会耗尽。
由于时间差异较小,在租约到期之前,可能无法清理少量记录。 将清理间隔设置为一天可确保第二天删除过时的记录。
解决方法 2
减少“无刷新 + 刷新”间隔以匹配 DHCP 租约。 对于方案部分中的示例,可以将“无刷新”和“刷新”减少到四天。
优势:
现有 DNS 记录的清理效果与第一个解决方案中的结果相同。
缺点:
如果这些区域是 AD 集成的 DNS 区域,AD 复制频率会增加。 这是因为客户端会更频繁地刷新 DNS 记录。 例如,每四天而不是每七天一次。
由于时间差异较小,在租约到期之前,可能无法清理少量记录。 将清理间隔设置为一天可确保第二天删除过时的记录。
解决方法 3
允许 DHCP 服务器代表客户端注册地址。
优势:
DHCP 服务器可以在租约过期后立即删除 DNS 记录。 如果设置正确,则不应存在重复记录。
缺点:
设置涉及更多内容。
需要设置服务帐户才能运行 DHCP 服务,或者所有 DHCP 服务器都需要加入 DNSUpdateProxy 组(不太安全)。 配置增加了复杂性。
为此,请参阅 如何在 Windows 中配置 DNS 动态更新。
试验 DHCP 租约持续时间、 无刷新 间隔和 刷新 间隔。 你可能会发现需要完全离开默认值。 低 DHCP 租约持续时间(以小时为单位)有时用于无线子网。 不过,请注意服务器的性能,尤其是在大型 DNS 区域中,如果 DNS 服务器设置为每隔几个小时进行复仇。
识别具有重复 IP 的记录
本部分介绍如何使用 PowerShell 标识重复记录。 该脚本旨在查找 DNS 中包含重复 IP 地址的记录。
#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 地址。 如果你有许多计算机,请使用 -searchbase
开关来 get-adcomputer
限制每次返回的计算机数。 如果计算机未加入 AD,则不会从 get-adcomputer
命令返回计算机。