我需要提供一种 DNS 裂脑场景,其具有两个主要目标:
- “特殊” DNS 客户端(基于其子网)必须将一个域中的某些 A 记录解析为与其他客户端不同的 IP 地址
- 无论哪个客户端提出请求,同一域中的所有其他记录都必须得到同等解析。
换句话说,我想创建一种“DNS 重写”或覆盖,其中对于某些客户端来说,一些记录会有所不同。我希望通过 Server 2016 中的 DNS 策略来实现这一点,该策略将“裂脑/视界”描述为预期场景之一,例如https://blogs.technet.microsoft.com/networking/2015/05/12/split-brain-dns-deployment-using-windows-dns-server-policies/- 但似乎我无法实现目标2。
在我的测试中,我创建了一个 ZoneScope,其中包含要返回给匹配客户端的备选 IP 地址,并根据客户端子网查询解析策略,从而实现了目标 1)。但是,如果客户端匹配为来自“特殊”子网,则它只能解析来自特殊 ZoneScope 的记录,而不能解析来自“默认”范围的记录 - 因此无法实现目标 2。
是否有我遗漏的配置步骤,如果我的特殊区域范围不包含匹配的记录,该步骤将允许回退到默认区域范围?我被告知这可以通过带有响应区域策略的 BIND DNS 轻松完成,但如果可能的话,我还是想坚持使用 MS。此外,使用主机文件是不可能的,因为那些“特殊”服务器并不完全在我们的控制之下。
重现步骤
#define subnet of restricted servers
Add-DnsServerClientSubnet -name SpecialServers -IPv4Subnet 192.168.0.0/24
#define ZoneScope for the special records
Add-DnsServerZoneScope -ZoneName "test.local" -Name "SpecialZoneScope"
#Prepare some testing records in the default scope
Add-DnsServerResourceRecord -ZoneName "test.local" -A -Name HostA -IPv4Address 1.1.1.1
Add-DnsServerResourceRecord -ZoneName "test.local" -A -Name HostB -IPv4Address 1.1.1.2
#Prepare alternative record in SpecialZoneScope
Add-DnsServerResourceRecord -ZoneName "test.local" -ZoneScope "SpecialZoneScope" -A -Name HostA -IPv4Address 20.20.20.1
#Define query resolution policy
Add-DnsServerQueryResolutionPolicy -Name "SplitBrainZonePolicy" -Action ALLOW -ClientSubnet "eq,SpecialServers" -ZoneScope "SpecialZoneScope,1" -ZoneName "test.local"
结果:
来自“常规”客户端的 nslookup:
> HostA.test.local
Server: dns.test.local
Address: ****
Name: HostA.test.local
Address: 1.1.1.1
> HostB.test.local
Server: dns.test.local
Address: ****
Name: HostB.test.local
Address: 1.1.1.1.2
来自“默认”区域范围的两个记录均被正确返回。
来自“特殊”子网中的客户端的 nslookup:
> HostA.test.local
Server: dns.test.local
Address: ****
Name: HostA.test.local
Address: 20.20.20.1
> HostB.test.local
Server: dns.test.local
Address: ****
*** dns.test.local can't find HostB.test.local: Non-existent domain
HostA 按照预期使用来自 SpecialZoneScope 的备用 IP 进行解析,而 HostB 则根本没有被解析。
答案1
是的,您绝对可以这样做。您做对了所有事情,只是您忘记将查询解析策略限制为区域范围内的特定记录。您可以通过-FQDN
如下所示的参数来执行此操作。
Add-DnsServerQueryResolutionPolicy -Name "SplitBrainZonePolicy" -Action ALLOW -FQDN "eq,HostA.test.local" -ClientSubnet "eq,SpecialServers" -ZoneScope "SpecialZoneScope,1" -ZoneName "test.local"
解释
您试图将区域范围视为覆盖在原始区域上的一种“透明度”,但事实并非如此。
这是一个不透明的替代区域(有点像文件上的替代数据流)。针对该区域范围的查询永远不会“回退”到默认区域。
因此,当你创建查询解析策略时,你正在定义特定查询所遵循的规则选择区域范围。
通过定义仅有 1 条记录的区域范围HostA
,然后定义将来自特定 IP 的所有查询发送到该区域的 QRP,您实际上是在说他们只能看到该记录。
将 FQDN 添加到 QRP 意味着只有来自指定子网的客户端也在询问 HostA.test.local
,将被发送到备用区域范围。
当然,如果区域中有更多记录,则需要指定多个记录或创建多个 QRP。您也可以使用通配符。