我有一个 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.DNS
NS 记录上写着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.DNS
,flags = 0x0000
然后nslookup
客户端设置flags = 0x0100
。这一位的意思是Allow recursive request
。
我可以以某种方式解决这个问题
- 告诉 Windows DNS 设置位
Allow recursive request
或 - 让 Bind9 忽略此位未设置
- 或者其他什么?
答案1
跟踪NS
记录是递归解析的一部分 —— 因此此时已经决定由contoso.local.DNS
递归解析器负责整个查询。
因此,发出的查询不是最终查询,而是下一步,代理无法知道客户端想要什么。同时,只转发服务器不期望查询带有“需要递归”的明确信息,因为它们所能做的就是转发到另一个(递归)服务器,该服务器可能对当前查询具有权威性,也可能不具有权威性——但作为递归查找的一部分,查询始终需要指向具有权威性的服务器。
由于只进服务器永远不具有权威性,因此它需要拒绝非递归查询,这就是您所看到的 - 但更改标志是不够的。
答案2
[回答我自己]您应该同时创建:NS 记录和条件转发器。
第一的你创造国家标准记录(在 Windows 服务器上)some.contoso.local
:contoso.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