转发器和条件转发器解析超时

本文介绍在 DNS 服务器上将一个或多个 DNS 服务器 IP 配置为转发器或条件转发器时存在的回退和超时行为。

原始 KB 数: 2834250

总结

与 DNS 客户端类似,使用多个转发器或条件转发器配置 DNS 服务器会向 DNS 基础结构添加额外的容错。 将多个 DNS 服务器添加为转发器或条件转发器后,在仅配置的服务器、基础网络链接或支持网络基础结构发生故障时,可以继续解析 DNS 名称。

但是,在服务器上添加容错更为关键,因为可能存在一个可传递操作,一些服务器代表现在挂起的多个客户端执行。 然后,资源会以增量方式消耗更长的时间。

如果要使用三个或多个转发器/条件转发器,请确保正确调整参数,因为默认设置可能未针对此大量服务器进行优化。

将两个以上的 DNS 服务器配置为转发器时,DNS 服务器的默认行为是什么

为了了解其工作原理,关键变量为:

  • RecursionTimeout - 域名系统(DNS)在终止搜索之前等待远程服务器响应递归客户端查询的时间。

    它保存在注册表的下面 HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters\RecursionTimeout,可通过 dnscmd /config /RecursionTimeout <value>该注册表进行配置。 这可以通过 PowerShell cmdlet Get-DnsServerRecursion进行验证。

    默认值为 Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019 和 Windows Server 2022 中的 8 秒。

    RecursionTimeout 在 DNS 服务器级别定义,独立于查询的特定区域。

  • ForwardingTimeout - 域名系统(DNS)等待转发器列表中每个服务器响应查询的时间。

    它保存在注册表中,可通过dnscmd /config /ForwardingTimeout <value>该注册表HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters\ForwardingTimeout进行配置。 也可通过 PowerShell cmdlet Get-DnsServerForwarder对此进行验证。

    在 Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019 和 Windows Server 2022 中,默认值为 3 秒。

    ForwardingTimeout 在 DNS 服务器级别定义,独立于查询的特定区域。

当 DNS 服务器收到对某个区域中不具有权威性的记录的查询,并且需要使用转发器时,默认行为如下:

时间(自开始以来的秒) 操作
0 客户端查询 DNS 服务器。 DNS 服务器立即将查询转发到其第一个转发器。
<forwarding_timeout> forwarding_timeout>秒后<,如果第一个转发器未回复,DNS 服务器将查询第二个转发器。
2 * <forwarding_timeout> +1 forwarding_timeout> +1 秒后<,如果第二个转发器未答复,DNS 服务器将查询第三个转发器。
... ...
N * <forwarding_timeout> +(N-1) forwarding_timeout> + 1 秒后<,如果第 N 个转发器未回复,则 DNS 服务器会查询第 1 个转发器。

注意

除了配置的延迟之外,由于系统开销,可能会有额外的半秒延迟。

算法在时间超过 RecursionTimeout 值时停止

如果 RecursionTimeout 过期,DNS 服务器将回复到客户端,出现服务器故障。

注意

我们不会在 RecursionTimeout 过期后立即发送服务器故障,但前提是是时候尝试下一个转发器了。

如果服务器设法在 RecursionTimeout 过期之前联系所有转发器而不获取答案,它将尝试使用名称解析的根提示(默认设置,除非在服务器级别禁用递归)。

这意味着,使用默认设置,Windows DNS 服务器最多可以查询三个转发器。 没有足够的时间到达使用第四个转发器。 事实上,使用默认设置,Windows DNS 服务器将:

  • 在 0 秒后查询第一个转发器
  • 在 3.5 秒后查询第二个转发器
  • 在 3.5 + 4 = 7.5 秒后查询第三个转发器

第八秒, RecursionTimeout 过期,因此我们不会到达查询第四个转发器的位置(在 3.5 + 4 + 4 + 4 = 11.5 秒之后发生)。

我们将在 11.5 秒后发送服务器故障响应。

示例:

IP 地址为 192.168.0.1 的 DNS 服务器配置了五个转发器(10.0.0.1-10.0.0.5)。

客户端的 IP 地址为 10.0.0.31,正在查询 Microsoft.com

在网络捕获中,我们将看到以下网络监视器输出(注意 10.0.0.4 和 10.0.0.5 从未查询):

时间偏移时间Delta 源目标详细信息
6:33:51.7507293 0.2731738 0.0000000 10.0.31 192.168.0.1 DNS:QueryId = 0xF03, QUERY (标准查询), 类 Internet 上主机加载项类型的查询microsoft.com
6:33:51.7510021 0.2734466 0.0002728 192.168.0.1 10.0.0.1 DNS:QueryId = 0xBD57, QUERY (标准查询), 类 Internet 上主机加载项类型的查询microsoft.com
6:33:55.2997074 3.8221519 3.5487053 192.168.0.1 10.0.0.2 DNS:QueryId = 0xBD57,QUERY (标准查询),类 Internet 上主机加载项类型的查询microsoft.com
6:33:59.2931644 7.8156089 3.9934570 192.168.0.1 10.0.0.3 DNS:QueryId = 0xBD57,QUERY (标准查询), 类 Internet 上主机加载项类型的查询microsoft.com
6:34:03.3112753 11.8337198 4.0181109 192.168.0.1 10.0.0.31 DNS:QueryId = 0xF03,QUERY(标准查询),响应 - 服务器失败

将两个以上的 DNS 服务器配置为条件转发器时,DNS 服务器的默认行为是什么

与转发器类似,条件转发器有两个关键变量。 我们仍然具有 RecursionTimeout (它正在服务器级别运行),但在此方案中,我们使用 ForwarderTimeout 而不是 ForwardingTimeout。 具体而言, ForwarderTimeout 基于区域运行,并且具有不同的默认值:

  • RecursionTimeout - 域名系统(DNS)在终止搜索之前等待远程服务器响应递归客户端查询的时间。

    它保存在注册表下 HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters\RecursionTimeout

    可通过 dnscmd /config /RecursionTimeout <value>. 进行配置。

    默认值为 Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019 和 Windows Server 2022 中的 8 秒。

    RecursionTimeout 在 DNS 服务器级别定义,独立于查询的特定区域。

  • ForwarderTimeout - 域名系统(DNS)等待条件转发器列表中的每个服务器响应查询的时间。

    由于为特定区域配置了条件转发器, 因此 ForwarderTimeout 也依赖于区域。

    它保存在注册表下 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server\Zones\ <zone_name>\ForwarderTimeout

    在 Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019 和 Windows Server 2022 中,默认值为 5 秒。

    这也是可以在条件转发器 GUI 中看到的设置。

当 DNS 服务器收到对某个区域中不具有权威性的记录的查询,并且配置为对记录使用条件转发器时,默认行为如下:

时间(自开始以来的秒) 操作
0 客户端查询 DNS 服务器。 DNS 服务器立即将查询转发到其第一个条件转发器。
<forwarder_timeout> forwarder_timeout>秒后<,如果第一个条件转发器未回复,则 DNS 服务器将查询第二个条件转发器。
2 * <forwarder_timeout> +1 forwarder_timeout> +1 秒后<,如果第二个条件转发器未回复,则 DNS 服务器将查询第三个条件转发器。
... ...
N * <forwarder_timeout> +(N-1) forwarder_timeout> +1 秒后<,如果第 N 个条件转发器未回复,则 DNS 服务器将查询第 1 个条件转发器。

注意

除了配置的延迟之外,由于系统开销,可能会有额外的半秒延迟。

算法在时间超过 RecursionTimeout 值时停止

如果 RecursionTimeout 过期,DNS 服务器将回复到客户端,出现服务器故障。

注意

我们不会在 RecursionTimeout 过期后立即发送服务器故障,但前提是尝试下一个条件转发器的时间。

这意味着,使用默认设置,Windows DNS 服务器最多可以查询两个条件转发器。 没有足够的时间来使用第三个条件转发器。 事实上,使用默认设置,Windows DNS 服务器将:

  • 在 0 秒后查询第一个转发器
  • 在 5.5 秒后查询第二个转发器

第八秒, RecursionTimeout 过期,因此我们不会到达查询第三个条件转发器的位置(在 5.5 + 6 = 11.5 秒之后发生)。

我们将在 11.5 秒后发送服务器故障响应。

示例:

IP 地址为 192.168.0.1 的 DNS 服务器配置了区域 Microsoft.com五个条件转发器(10.0.0.1-10.0.0.5)。

客户端的 IP 地址为 10.0.0.31,正在查询 Microsoft.com

在网络捕获中,我们将看到以下网络监视器输出(注意 10.0.0.3、10.0.0.4 和 10.0.0.5 从未查询):

时间偏移时间Delta 源目标详细信息
6:50:32.5481816 0.4306857 0.0000000 10.0.33 192.168.0.1 DNS:QueryId = 0x245A,QUERY (标准查询),查询类 Internet 上的主机加载项类型查询microsoft.com
6:50:32.5484341 0.4309382 0.0002525 192.168.0.1 10.0.0.1 DNS:QueryId = 0x252B, QUERY (标准查询), 类 Internet 上主机加载项类型的查询microsoft.com
6:50:38.1695163 6.0520204 5.6210822 192.168.0.1 10.0.0.2 DNS:QueryId = 0x252B,QUERY (标准查询), 类 Internet 上主机加载项类型的查询microsoft.com
6:50:44.1856567 12.0681608 6.0161404 192.168.0.1 10.0.33 DNS:QueryId = 0x245A,QUERY(标准查询),响应 - 服务器失败

参考