通过 DNS 代理对子域名进行条件转发

通过 DNS 代理对子域名进行条件转发

我有一个 Windows AD 域:contoso.local 我想some.contoso.local通过转发 DNS 服务器将所有请求转发到另一个 DNS 服务器:

contoso.Local.DNS => Proxy.DNS => some.contoso.local.DNS

contoso.Local.DNS => some.contoso.local.DNS由于某种原因,我无法允许直接转发。Proxy.DNS是必需的。

Proxy.DNS是带配置的简单 Bind9 机器(部分)

zone "some.contoso.local" {
  type forward;
  forward only;
  forwarders { 1.2.3.4; }
}

contoso.Local.DNSNS 记录上写着some.contoso.local NS ip.of.Proxy.DNS

问题:

  • 当我a.some.contoso.local直接通过查询时Proxy.DNS,一切正常。
  • 当我查询时,a.some.contoso.local出现contoso.Local.DNS查询错误。

我认为原因是contoso.Local.DNS将查询发送到Proxy.DNSflags = 0x0000然后nslookup客户端设置flags = 0x0100。这一位的意思是Allow recursive requestDNS 标志

我可以以某种方式解决这个问题

  • 告诉 Windows DNS 设置位Allow recursive request
  • 让 Bind9 忽略此位未设置
  • 或者其他什么?

答案1

跟踪NS记录是递归解析的一部分 —— 因此此时已经决定由contoso.local.DNS递归解析器负责整个查询。

因此,发出的查询不是最终查询,而是下一步,代理无法知道客户端想要什么。同时,只转发服务器不期望查询带有“需要递归”的明确信息,因为它们所能做的就是转发到另一个(递归)服务器,该服务器可能对当前查询具有权威性,也可能不具有权威性——但作为递归查找的一部分,查询始终需要指向具有权威性的服务器。

由于只进服务器永远不具有权威性,因此它需要拒绝非递归查询,这就是您所看到的 - 但更改标志是不够的。

答案2

[回答我自己]您应该同时创建:NS 记录和条件转发器。

第一的你创造国家标准记录(在 Windows 服务器上)some.contoso.localcontoso.local.DNS右键单击区域名称->新建委派...) 并指定服务器的名称some.contoso.local.DNS(该区域的真正主服务器)。

这将保证在区域的区域传输的情况下contoso.local,辅助服务器将收到some.contoso.local由 托管的信息some.contoso.local.DNS,并将避免类似的答案no such host

为了避免验证(如果some.contoso.local.DNS无法访问服务器contoso.local.DNS),您应该通过 PowerShell 创建此记录。


到这一步,如果你没有使用代理,就完成了。Windows DNS 将自动转发到指定的 NS,但这些查询将不可转发。

如果您需要将查询不是直接转发到 NS 服务器而是通过代理转发,请参阅下一步。


第二:仅当完成第一步后,Windows Server DNS MMC Snap-In 才允许您为区域创建条件转发器,some.contoso.local以转发到您想要的任何服务器。您在此处写入转发器Proxy.DNS:这将解决 some.contoso.local.DNS服务器无法从contoso.local.DNS服务器访问的问题:所有查询都将以这种方式不加修改地转发:

Client => contoso.Local.DNS => Proxy.DNS => some.contoso.local.DNS

相关内容