Windows Server中的DNS转发

DNS 转发是一种名称解析过程,其中一个 DNS 服务器向另一个作为转发者的 DNS 服务器发送递归查询。 DNS 服务器可以使用服务器级转发器进行一般名称解析,并对选定的 DNS 命名空间使用条件转发器。 了解转发与委派、根提示和超时之间如何相互作用,有助于你预测哪个服务器会接收查询,以及解析何时可以沿另一条路径继续进行。

本文解释了DNS服务器在处理递归客户端查询时,如何在本地可用数据、条件转发器、委托、服务器级转发器和根提示之间进行选择。 它还解释了超时和回退设置如何影响解析是继续进行还是返回失败结果。

DNS 服务器如何选择解析路径

当DNS服务器接收客户端递归查询时,会评估本地可用数据,然后选择合适的解析路径。 路径取决于DNS服务器所托管的区域及其条件转发器、委派、服务器级转发器和根提示配置。

终末反应与无反应的区别是这一选择过程的核心。 像 NXDOMAIN or NODATA 这样的 DNS 响应是有效的终端响应,通常不会触发备份。 当配置好的服务器没有响应,或者DNS服务器将某个结果归类为可重试时,通常会使用备份。

当你禁用 ForwardDelegations 时,此解析顺序适用。 DNS 策略和其他 DNS 功能都会影响特定查询的路径。

  1. 检查本地可用的DNS数据。 服务器会评估其所托管的权威区域和缓存。 如果托管的权威区覆盖了查询,该区决定了结果。 如果权威数据或缓存提供了终端结果,服务器会返回该结果。

  2. 使用匹配的条件转发器。 如果查询名称与条件转发区匹配,服务器会将查询发送到该区配置的目标DNS服务器。 如果这些服务器没有响应或返回 DNS 服务器判定为可重试的结果,条件转发器的 “使用递归 ”设置将决定服务器是否可以尝试其他递归解析路径。

  3. 使用合适的委托。 如果匹配的委派识别出下一个权威服务器,服务器会向委派中的名称服务器发送迭代查询。 禁用 ForwardDelegations 后,服务器级转发器无法控制查询,而相关的委托则控制其解析。

  4. 使用服务器级转发器。 如果没有条件转发器或适用的委派来控制该查询,服务器将按照当前生效的顺序使用其配置的服务器级转发器,并遵循所配置的超时时间。

  5. 在配置允许的情况下,使用根提示。 如果服务器已尝试完所有服务器级转发器,且服务器配置启用了递归和根提示回退,整体递归超时也尚未到期,则可回退到根提示。 如果服务器没有配置的服务器级转发器,根提示可以作为迭代解析的起点。

  6. 返回结果或失败状态。 服务器返回了选定路径的结果。 如果服务器配置禁用递归,服务器通常会返回 REFUSED 需要递归的查询。 如果递归处理无法完成,服务器返回 SERVFAIL。

Note

转发器无响应并不保证服务器会执行根提示回退。 服务器必须在 RecursionTimeout 到期之前尝试完所有适用的转发器。 如果整个递归过程的超时时间先耗尽,查询会在到达根提示之前失败。

DNS 服务器转发器的解析流程与回退机制

以程图展示了从本地可用数据到逐步更广泛分辨率方法的常见决策路径。 终端响应在任何阶段都会终止处理。 只有在配置允许回退且 RecursionTimeout 中仍有剩余时间时,服务器无响应或出现可重试的结果才会转到另一条路径。 文本描述标明了每个分支和结果。

通过本地数据、条件转发器、委托、服务器级转发器和根提示来解析DNS服务器查询的流程图。

DNS 服务器中的服务器级转发器

当既没有托管权威区域、匹配的条件转发区域,也没有相关的委派控制查询时,服务器级转发器处理未解决的查询。 DNS服务器向转发器发送递归查询,转发器负责完成名称解析。

通过转介集中外部查询可以减少直接的互联网暴露,整合缓存的答案,简化监控和访问控制,并减少重复的外部查询。 如果你不配置服务器级转发器,DNS Server在启用递归时会对未解析名称使用根提示,并且可用的根提示数据可用。

只允许来自可信客户端和网络的递归查询,不要向不受信任的网络暴露递归DNS服务。 使用可信转发器和防火墙规则来强制执行DNS流量边界。

服务器级转发器的选择与排序

你会按照优先顺序配置转发器的IP地址。 默认情况下,动态转发器重排序会根据响应时间保持活跃订单,并大约每15分钟将列表重置为配置后的订单。

  • 对于每个查询,DNS服务器会从活跃列表中选择转发器。
  • 如果转发器响应超过一秒,服务器会认为响应较慢以进行重排序。
  • 连续三次慢响应或超时后,服务器可以将该转发器移至活跃列表的末尾。
  • DNS 服务器无法判断无响应的转发器是离线还是速度慢。 另外要单独监控货运代理的健康状况。

Note

在Windows Server 2022及以后版本中,如果任何转发器都不应响应,DNS服务器仅会使用动态列表中的第一个服务器进行后续查询,直到DNS服务器服务重启。 要让服务器像早期版本一样循环使用所有已配置的转发器,请使用 Set-DnsServerForwarder -EnableReordering $false 禁用动态重新排序。

服务器级转发器回退到根提示

当DNS服务器用尽适用的服务器级转发器后,如果转发器不响应或只返回DNS服务器归类为可重试的结果,则默认尝试标准递归。 标准递归使用从根提示中的服务器开始的迭代查询。 这种后备条件要求以下所有条件:

  • 服务器会在期限内用尽所有适用的转发器 RecursionTimeout 。
  • 服务器允许递归。
  • UseRootHint 设置为 $true,使用 Set-DnsServerForwarder -UseRootHint $true 进行配置。
  • 服务器拥有可用的根提示数据和对所需DNS服务器的网络访问权限。

当服务器必须将未解析查询限制为仅使用其配置中的转发器时,将 UseRootHint 设置为 $false。 在这种配置下,服务器在转发器失效时不会尝试迭代解析。

DNS服务器中的条件转发器

条件转发器将特定DNS命名空间的查询路由到指定的DNS服务器。 例如,条件转发器可以将所有查询 south.contoso.com 发送给托管该命名空间的DNS服务器,而服务器通过服务器级转发器或根提示处理其他名称。

DNS 服务器将条件转发器存储为转发区。 当查询匹配条件转发器时,DNS服务器会将其发送到该区域的目标DNS服务器列表,而不是立即使用通用的服务器级转发路径。

条件转发器的托管区域限制

你不能为与同一DNS服务器托管的主、次或存根区域匹配的DNS名称创建一个条件转发器。 由于DNS服务器将条件转发器存储为转发区,服务器无法承载同名的其他区域类型和条件转发器。

例如,如果服务器作为 contoso.com 权威区域托管,你就无法在该服务器上创建一个命名 contoso.com 的条件转发器。 DNS 管理器或 Add-DnsServerConditionalForwarderZone 报告该区域已经存在,服务器继续回答来自其托管区域的 contoso.com 查询。

如果另一个DNS服务器解析了整个命名空间,先迁移区域数据并移除托管区域,再创建条件转发器。 如果其他DNS服务器只托管一个子命名空间,则保留父区域,并为子命名空间创建一个委托。

条件前发器回退与递归

条件转发器的 “使用递归 ”设置控制了如果该区域的目标DNS服务器没有响应或返回被DNS服务器视为可重试结果时,DNS服务器可以做什么。

使用递归 无终极反应后的行为 Result
已启用 只有当全服务器配置启用递归、存在适用路径且时间仍处于 RecursionTimeout时,DNS服务器才能尝试另一条递归解析路径。 解析可以沿适用的递归路径继续进行。
已禁用 DNS服务器不会尝试其他DNS服务器。 如果配置的目标DNS服务器无法提供终端结果,查询就会失败。

ForwarderTimeout 控制条件转发器的时间窗口以及尝试目标 DNS 服务器的时间安排。 DNS 服务器在 ForwarderTimeout 时间过去后,不会再次尝试条件转发器目标。 RecursionTimeout 为递归处理提供了全服务器范围内的独立限制。

DNS服务器委派与转发

如果 DNS 服务器托管父区,且被查询的名称落在某个适用的委派之下,服务器会根据该委派来定位子区的权威 DNS 服务器。 委托会创建一个区域分界:父服务器对委托记录具有权威性,但对被委托子区域内的数据不具有权威性。

如果没有委派,且查询的名称位于服务器托管的区域内,服务器仍对查询保持权威。 如果请求的名称或记录类型不存在,服务器会返回权威的负面响应,如 NXDOMAIN 或 NODATA。 它不会将查询发送给条件转发器、服务器级转发器或根提示。

例如,如果某台服务器托管 contoso.com,而其他服务器托管 south.contoso.com,则在 south 区域中为 contoso.com 创建一个委派。 父区域向子区域的权威服务器返回转介。 委托不会发送递归转发查询。

这种委派行为适用于 ForwardDelegations 禁用 时。 如果你的环境允许该设置,请在依赖该结算命令前验证委托与转发者之间的交互。

Important

如果DNS服务器也托管了子区的权威副本,而你打算将子命名空间迁移到其他服务器,请迁移并移除本地子区副本。 否则,服务器仍拥有该副本的最终决定权。

DNS 服务器根提示与迭代解析

根提示是资源记录,用于识别对DNS命名空间根具有权威权威的DNS服务器。 DNS Server 以这些作为迭代解析的起点。 根服务器通常会返回应答、指向更接近所请求名称的服务器的转介信息,或者返回 DNS 故障或否定响应。

如果你没有配置服务器级转发器,且没有委派或更具体的转发配置作为起点,服务器可能会对未解决的查询使用根提示。 如果你配置了服务器级转发器,服务器只有在用尽这些转发器之后,并且仅当递归、剩余超时时间和 UseRootHint 允许回退时,才会使用根提示作为后备。

如果DNS服务器对某个私有命名空间的根具有权威,那么它就是该命名空间的根服务器。 不要假定常规的服务器级转发或公共根提示适用于私有根。 使用委托或有意设计命名空间间的条件转发配置。

DNS 服务器超时与故障行为

超时设置决定DNS服务器是否能到达后续转发器或根提示回退。 RecursionTimeout 是递归处理的整体时间预算。 ForwardingTimeout 和 ForwarderTimeout 分别在该预算内为服务器级别的转发器和条件转发器安排单独的尝试;两者都不会重启或延长 RecursionTimeout。

设置 Scope Purpose PowerShell 参数
RecursionTimeout DNS 服务器 限制了整体递归客户端查询。 当超时结束时,递归处理停止,服务器返回 SERVFAIL。 Set-DnsServerRecursion -Timeout
ForwardingTimeout 服务器级转发器 指定DNS服务器等待每个服务器级转发器的时间,然后才尝试下一个转发器。 Set-DnsServerForwarder -Timeout
ForwarderTimeout 条件转发区 控制条件转发器定时窗口及每次目标DNS服务器尝试的调度。 DNS 服务器在超时后不会再开始新的条件转发目标尝试。 Add-DnsServerConditionalForwarderZone -ForwarderTimeout

当转发器返回终端响应时,服务器会返回该响应,无需尝试其他解析路径。 当转发器没有响应或返回 DNS 服务器判定为可重试的结果时,DNS 服务器可以在剩余时间内尝试下一个配置的服务器或可用的备用路径。

由于 RecursionTimeout 限制了整个操作,配置多个转发器并不能保证服务器查询每个转发器或尝试根提示。 如果整体超时先到期,服务器返回 SERVFAIL。 当你配置三个或更多转发器时,请检查超时值,并通过监控和环境包捕获验证有效行为。

选择DNS服务器转发设计

根据命名空间的所有者以及应接收查询的DNS服务器选择解析路径。 以下场景说明了每种设计如何影响转发和回退。

情景 分辨率设计 后备决策
集中管理通用的 DNS 解析 使用服务器级转发器,让指定的DNS服务器处理本地区域、缓存、条件转发器或委派无法解析的名称。 当直接迭代解析可接受时,仍保留根提示作为回退机制。 当策略要求所有未解决查询必须保持在转发边界内时,禁用该边界,并用网络控制强制执行该边界。
连接独立管理的内部命名空间 使用条件转发器将一个命名空间中的名称(如 south.contoso.com)直接发送到其DNS服务器,而无需托管次级区域。 仅当该命名空间的其他递归路径有效时,才启用使用递归。
通过指定的服务器解析合作伙伴命名空间 使用条件转发器来管理合作伙伴命名空间,而不是通过公共DNS层级发送查询。 当只有合作伙伴指定的 DNS 服务器应解析命名空间时,请禁用 使用递归 。
将子命名空间与托管的父区域分开 在父区中使用委派来指定子区的权威 DNS 服务器。 委托返回转介信息,而不是转发递归查询。 当你禁用 ForwardDelegations 时,解析由委派控制,因此服务器级转发器不会为该委派查询提供回退。

当设计需要冗余时,请使用多个运行正常的转发器,并确保转发和递归超时设置留出足够的时间以访问这些转发器。 分别监控响应时间、故障率和网络可达性,因为转发行为不能替代健康监测。 解析互联网名称的递归服务器通常使用公开根提示,而私有DNS层级则需要与私有命名空间匹配的根信息。