在企业中咱们可能会遇到这样一种场景,有一个域名www.basehome.com.cn,但愿公司内部的用户访问它时能解析到内部的服务器IP地址,而公司外部的用户访问它时能解析到公网上托管的服务器公网IP地址(固然前提是您公网解析的NS服务器也是您公司的这台DNS)。web
若是是这样的需求场景,通常IT会部署2台DNS服务器分别服务器于内部和外部。那么是否能够只部署一台DNS实现区份内部和外部的请求,而后按照设定的策略返回给来源客户端让它们知道各自该去访问什么IP吗?答案是Windows Server 2016/2019能够搞定。windows
简单来讲就是让一台DNS服务器实现相似脑裂的效果,这台DNS部署一张内部网卡和一张外部网卡,经过感知网卡知道请求来自内部仍是外部,而后根据设定好的策略让判断出来的请求知道去访问对应的服务器地址获得想要的结果。服务器
下面是我环境的拓扑图网络
在没有DNS策略的状况下,管理员须要在单独的Windows Server DNS服务器上分别托管这两个区域并单独管理它们。ide
使用DNS策略,这些区域如今能够托管在同一DNS服务器上。测试
如何实现,那么大体的步骤以下:网站
当DNS服务器收到来自内部网卡的请求时就查询设定的内部区域范围的记录,返回解析告诉内部客户端指向内部web01服务器3d
当DNS服务器收到来自外部网卡的请求时就查询默认区域范围里的外部IP地址给予相应,返回解析告诉外部客户端指向外部web02服务器(这与普通DNS查询解析相同)server
第一步:建立区域范围blog
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"
在默认DNS的basehome.com.cn里添加记录(没有指定zonescope就会把记录添加到默认区域)
在之前版本的DNS里,咱们都会有默认的basehome.com.cn的区域,此区域的记录在这里将默认给外部网卡提供解析服务。
Add-DnsServerResourceRecord -ZoneName "basehome.com.cn" -A -Name "www" -IPv4Address "192.168.1.10"
第三部:建立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"
好了,验证一下吧:
先看看来自内部客户端WinVista01访问www.basehome.com.cn:
再来看来自外部客户端WinVista02访问www.basehome.com.cn:
到这里需求知足了。那么我再把需求升级一下,在这样的环境效果中,我要追加只容许内部网卡接收的访问请求能够进行DNS递归查询,外部网卡接收的访问请求不容许DNS递归查询,如何实现?
知识点:递归查询是指当客户端访问www.qq.com时,服务器自己没有该域,那么服务器就表明客户端去向上一级的DNS进行查询,而后返回给客户端。
在之前版本的Windows Server中,启用递归意味着它已在整个DNS服务器上为全部区域启用。因为DNS服务器也在侦听外部查询,所以为内部和外部客户端启用了递归,使DNS服务器成为一个开放的解析器。
为了实现升级版的需求,我对Primary-DNS增长了路由器的角色和NAT网卡链接外部网络
配置好路由器
这样内部和外部的客户端均可以递归查询访问Internet的其余网站:
内部客户端WinVista01:
外部客户端WinVista02:
要实现只容许内部网卡接收的访问请求能够进行DNS递归查询,外部网卡接收的访问请求不容许DNS递归查询
第一步:先建立DNS递归范围
递归做用域是控制DNS服务器上的递归的一组设置的惟一实例。递归做用域包含转发器列表,并指定是否启用递归。DNS服务器能够有许多递归范围。
传统递归设置和转发器列表称为默认递归范围。
首先禁用默认递归设置,而后建立内部客户端的新递归范围,启用该范围的递归。
Set-DnsServerRecursionScope -Name . -EnableRecursion $False
Add-DnsServerRecursionScope -Name "InternalClients" -EnableRecursion $True
第二部:建立DNS递归策略
建立DNS服务器的递归策略,以便为符合特定条件的一组查询选择递归范围,若是您的DNS服务器对某些查询不具有权威性,则DNS服务器递归策略容许您控制如何解析查询。
在个人环境中,启用刚才建立的新的递归范围与DNS服务器的Internal网卡相关联。
Add-DnsServerQueryResolutionPolicy -Name "InternalRecursionPolicy" -Action ALLOW -ApplyOnRecursion -RecursionScope "InternalClients" -ServerInterfaceIP "EQ,172.16.1.2"
好了,验证测试下是否实现了需求目标:
内部客户端WinVista01访问www.bing.com.cn递归查询没问题:
外部客户端WinVista02访问www.bing.com.cn就没法递归查询解析了:
固然WinVista02虽然不能递归Internet查询,但访问DNS服务器上的www.basehome.com.cn是没问题的:
详细的能够参考:https://docs.microsoft.com/en-us/windows-server/networking/dns/deploy/split-brain-dns-deployment