转发器和条件转发器解析超时
本文介绍在 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 cmdletGet-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 cmdletGet-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(标准查询),响应 - 服务器失败