在企业中我们可能会遇到这样一种场景,有一个域名www.basehome.com.cn,希望公司内部的用户访问它时能解析到内部的服务器IP地址,而公司外部的用户访问它时能解析到公网上托管的服务器公网IP地址(当然前提是您公网解析的NS服务器也是您公司的这台DNS)。

如果是这样的需求场景,一般IT会部署2台DNS服务器分别服务器于内部和外部。那么是否可以只部署一台DNS实现区分内部和外部的请求,然后按照设定的策略返回给来源客户端让它们知道各自该去访问什么IP吗?答案是Windows Server 2016/2019可以搞定。

简单来说就是让一台DNS服务器实现类似脑裂的效果,这台DNS部署一张内部网卡和一张外部网卡,通过感知网卡知道请求来自内部还是外部,然后根据设定好的策略让判断出来的请求知道去访问对应的服务器地址得到想要的结果。

下面是我环境的拓扑图

clip_image001

在没有DNS策略的情况下,管理员需要在单独的Windows Server DNS服务器上分别托管这两个区域并单独管理它们。

使用DNS策略,这些区域现在可以托管在同一DNS服务器上。

如何实现,那么大致的步骤如下:

  • 当DNS服务器收到来自内部网卡的请求时就查询设定的内部区域范围的记录,返回解析告诉内部客户端指向内部web01服务器

  • 当DNS服务器收到来自外部网卡的请求时就查询默认区域范围里的外部IP地址给予相应,返回解析告诉外部客户端指向外部web02服务器(这与普通DNS查询解析相同)

第一步:创建区域范围

Add-DnsServerZoneScope -ZoneName "basehome.com.cn" -Name "internal"

第二部:添加记录到区域范围

知识点:区域范围是区域的唯一实例。DNS区域可以具有多个区域范围,每个区域范围包含其自己的一组DNS记录。相同的记录可以存在于多个范围中,具有不同的IP地址或相同的IP地址。

Add-DnsServerResourceRecord -ZoneName "basehome.com.cn" -A -Name "www" -IPv4Address "172.16.1.10" -ZoneScope "internal"

clip_image002

在默认DNS的basehome.com.cn里添加记录(没有指定zonescope就会把记录添加到默认区域)

在以前版本的DNS里,我们都会有默认的basehome.com.cn的区域,此区域的记录在这里将默认给外部网卡提供解析服务。

Add-DnsServerResourceRecord -ZoneName "basehome.com.cn" -A -Name "www" -IPv4Address "192.168.1.10"

clip_image003

第三部:创建DNS策略

之前的文章介绍了以客户端子网作为区分的条件,可以识别客户端所属的子网,从而配置DNS策略以根据客户端子网进行区分;但这里我是指看DNS服务器上的网卡IP来区分响应请求的,因此我只需要针对Internal的网卡进行DNS策略设置即可,默认区域是不需要DNS策略的

Add-DnsServerQueryResolutionPolicy -Name "InternalZonePolicy" -Action ALLOW -ServerInterface "eq,172.16.1.2" -ZoneScope "internal,1" -ZoneName "basehome.com.cn"

clip_image004

好了,验证一下吧:

先看看来自内部客户端WinVista01访问www.basehome.com.cn:

clip_image005

再来看来自外部客户端WinVista02访问www.basehome.com.cn:

clip_image006

到这里需求满足了。那么我再把需求升级一下,在这样的环境效果中,我要追加只允许内部网卡接收的访问请求可以进行DNS递归查询,外部网卡接收的访问请求不允许DNS递归查询,如何实现?

知识点:递归查询是指当客户端访问www.qq.com时,服务器本身没有该域,那么服务器就代表客户端去向上一级的DNS进行查询,然后返回给客户端。

在以前版本的Windows Server中,启用递归意味着它已在整个DNS服务器上为所有区域启用。由于DNS服务器也在侦听外部查询,因此为内部和外部客户端启用了递归,使DNS服务器成为一个开放的解析器。

为了实现升级版的需求,我对Primary-DNS增加了路由器的角色和NAT网卡连接外部网络

clip_image007

配置好路由器

clip_image008

这样内部和外部的客户端都可以递归查询访问Internet的其他网站:

内部客户端WinVista01:

clip_image009

外部客户端WinVista02:

clip_image010

要实现只允许内部网卡接收的访问请求可以进行DNS递归查询,外部网卡接收的访问请求不允许DNS递归查询

第一步:先创建DNS递归范围

递归作用域是控制DNS服务器上的递归的一组设置的唯一实例。递归作用域包含转发器列表,并指定是否启用递归。DNS服务器可以有许多递归范围。

传统递归设置和转发器列表称为默认递归范围。

首先禁用默认递归设置,然后创建内部客户端的新递归范围,启用该范围的递归。

Set-DnsServerRecursionScope -Name . -EnableRecursion $False

Add-DnsServerRecursionScope -Name "InternalClients" -EnableRecursion $True

clip_image011

第二部:创建DNS递归策略

创建DNS服务器的递归策略,以便为符合特定条件的一组查询选择递归范围,如果您的DNS服务器对某些查询不具备权威性,则DNS服务器递归策略允许您控制如何解析查询。

在我的环境中,启用刚才创建的新的递归范围与DNS服务器的Internal网卡相关联。

Add-DnsServerQueryResolutionPolicy -Name "InternalRecursionPolicy" -Action ALLOW -ApplyOnRecursion -RecursionScope "InternalClients" -ServerInterfaceIP "EQ,172.16.1.2"

clip_image012

好了,验证测试下是否实现了需求目标:

内部客户端WinVista01访问www.bing.com.cn递归查询没问题:

clip_image013

外部客户端WinVista02访问www.bing.com.cn就无法递归查询解析了:

clip_image014

当然WinVista02虽然不能递归Internet查询,但访问DNS服务器上的www.basehome.com.cn是没问题的:

clip_image015

详细的可以参考:https://docs.microsoft.com/en-us/windows-server/networking/dns/deploy/split-brain-dns-deployment