如果 DHCP 服务器使用“始终动态更新 DNS 记录”,则出现意外的 DNS 记录注册行为

适用于: Windows 11、Windows 10、Windows 8.1

现象

你有一个基础结构,该基础结构使用 Windows 动态主机配置协议(DHCP)客户端和Microsoft DHCP 服务器来分配和管理 IP 地址。 在 DHCP 服务器上,根据以下设置选择“启用 DNS 动态更新”,并始终动态更新 DNS 记录。 在此配置中,你希望 DHCP 服务器管理 A 记录和 PTR 记录的动态 DNS 更新。 但是,你观察到客户端和服务器都创建了 DNS 记录。 根据配置,此行为具有以下影响:

  • 如果为 Nonsecure 和安全 动态更新配置 DNS 区域,则会看到 DHCP 服务器会创建记录,然后 DHCP 客户端删除并重新创建相同的记录。
  • 如果将 DNS 区域配置为仅保护动态更新,则 DNS 记录可能会不一致。 DHCP 服务器和 DHCP 客户端都创建记录。 但是,DHCP 服务器无法更新 DHCP 客户端创建的记录,DHCP 客户端无法更新 DHCP 服务器创建的记录。

原因

若要获取 IP 地址,DHCP 客户端会将 DHCP 请求消息发送到 DHCP 服务器。 通常,此消息包括客户端的完全限定域名(FQDN)和用于控制动态 DNS 更新行为的标志。 此信息统称为 选项 81 (也称为 客户端 FQDN 选项)。

注意

某些较旧的 DHCP 客户端不使用选项 81。 若要为这些客户端提供动态更新,请将 DHCP 服务器配置为为不请求更新的 DHCP 客户端(例如运行 Windows NT 4.0 的客户端)启用动态更新 DNS 记录。

DHCP 服务器还存储一组选项 81 标志,用于控制动态 DNS 更新行为。 DHCP DORA(发现/套餐/请求/确认)过程的一部分涉及客户端与其选项 81 标志值服务器之间的比较,以确定谁负责 DNS 更新。 “症状”部分中描述的行为涉及的标志命名为 O (override) 和 S (服务器) 位。 标志函数如下所示:

  • 如果为 S = 0,则客户端负责更新 A 记录。
  • 如果为 S = 1,则服务器负责更新 A 记录。
  • 如果客户端在其请求中发送的 S 值不同于服务器的 S 值,则服务器将其 O 值设置为 1

如 RFC 中所述,DHCP 服务器对请求消息的答复应包括其标志值。 如果将 O 设置为 服务器消息中的 1 ,则客户端应了解服务器正在重写客户端的 S 值。

在 Windows 8.1 中,对 DHCP 客户端的动态 DNS 更新行为引入了有意的设计更改。 此更改支持Microsoft操作系统的更高版本中 TCP/IP(传输控制协议/Internet 协议)堆栈的持续开发和增强功能。 在 Windows 8.1 及更高版本中,DHCP 客户端不遵循 DHCP 服务器的选项 81 OS 值。 如果客户端配置为更新 A 记录,即使服务器也配置为更新 A 记录,它也会继续执行此操作。 在 DHCP 管理控制台中选择“始终动态更新 DNS 记录”时,会出现这种情况。

如果将 DNS 区域配置为 保护动态更新,则只有创建 DNS 记录的实体(DHCP 客户端、DHCP 服务器或 DHCP 服务配置为使用的帐户)才能更新或删除该记录。 如果 DHCP 客户端而不是 DHCP 服务器创建 DNS 记录,则 DHCP 服务器以后无法修改该记录。

注意

Microsoft的 DHCP 客户端不提供直接在用户界面中设置客户端的 OS 值的方法。 默认情况下,这两个值均为 0。 可以通过记录 DHCP 客户端请求的 netsh 跟踪 以及使用 Netmon 等工具来查看结果来查看值。

可以使用 Windows PowerShell cmdlet Get-DhcpServerv4OptionValue 查看 DHCP 服务器的选项 81 值。 但是,cmdlet 将此值报告为单个整数,该整数将多个不同的设置组合为位值。 例如,如果在 DHCP 作用域属性窗口的 DNS 选项卡上选择“始终动态更新 DNS 记录”,则将 S 值设置为 1 但该 cmdlet 报告选项 81 的八个可能值之一。 所有这些都使用 S=1。 特定值取决于 DNS 选项卡上设置的组合。

有关 DHCP 客户端、DHCP 服务器和 DNS 服务器之间动态更新的工作原理的详细信息,请参阅 DNS 进程和交互

解决方法

如果体系结构要求使用 Always 动态更新 DNS 记录,则可以在客户端计算机上创建注册表项,以强制 DHCP 客户端遵守 DHCP 服务器替代。

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,按以下步骤操作时请务必谨慎。 出于防范目的,请在修改之前备份注册表,以便在出现问题时还原注册表。 有关如何备份和还原注册表的详细信息,请参阅:如何备份和还原 Windows 中的注册表

  1. 导航到以下子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters

  2. 在子项下,创建以下条目:

    • 名称: RegistrationOverwrite
    • 类型: REG_DWORD
    • 值: 2

    注意

    RegistrationOverwrite 具有以下可能的值:

    • 0 - 无覆盖。
    • 1 - DNS 客户端创建的记录覆盖 DHCP 服务器创建的记录。 这是默认值。
    • 2 - DHCP 服务器创建的记录覆盖 DNS 客户端创建的记录。
  3. 重新启动客户端计算机。

  4. 在 DNS 服务器管理控制台中,检查转发和反向查找区域。 根据特定环境,可能需要手动删除 DHCP 服务器无权删除或更改的 A 和 PTR 记录。