DNS的SRV记录,用于客户端来定位服务器,请求LDAP服务,请求kerberos服务。再加上站点的概念,那么事情就变得更加美好了。客户端总是去请求本站点内的DC服务器,加快登录速度,人人都满意,于是IT运行起来也顺畅了。但是以下的情况,事情就可能变得复杂起来了:
1、客户端在加入域时,他并不知道自己处于什么站点,本来处在A站,最理想的也是找A站点的服务器做加域操作,但事实会这样嘛;
2、如果客户端所在的A站点中的域控出现问题,离线了,那么客户端登录时,验证是找B站点还是找C站点的服务器,假设AB之间的连接速度优于AC之间的速度,是不是一定找B站点做验证;
要回答上面的两个问题,我们首先要明白客户端是去获取哪些SRV记录的。默认情况下,DC都会在DNS站点中通过netlogon服务注册相应的SRV记录,
_ldap._tcp.<SITE>._sites.dc._msdcs.<DOMAIN>.<TLD>
_ldap._tcp.dc._msdcs. <DOMAIN>.<TLD>
客户端如果知道他是在哪个站点,那么他也是先查寻第一条SRV记录,找到相应的DC来请求服务。
如果当前站点中没有服务器或是离线了,那么他会开始查找第二条SRV记录,问题就出在这个过程中,因为每个站点中的DC都会在此注册相应的记录,客户端选取DC时也是依据SRV记录的优先级来排列,如果优先级一致,那么客户端就会随机找一台DC来做验证。这样一随机,就会出现上面的两个问题,两个无法保证,于是IT的世界也不和谐了。
要解决以上的问题,我们在规划DC时,可以采用主站点和分支机构的经典架构,主站点与所有分支机构都通过WAN来链接,同时让分支机构的DC不去注册_ldap._tcp.dc._msdcs. <DOMAIN>.<TLD>记录,这样一来,如果分支机构的站点中DC离线时,那么他只会去找主站点的DC做验证,而不会找其它站点的DC。于是问题就很明确了,如何使分支站点的DC不注册_ldap._tcp.dc._msdcs. <DOMAIN>.<TLD>记录?组策略中提供了相应的选项:计算机设置/管理模板/系统/网络登录/DC定位程序DNS记录/DC定位程序不是由DC注册,给个截图,看个明白
启用这个策略,同时添加上不需要注册的SRV记录,怎么添加,kb306602有一个详细的说明,我们这里把它复制过来
Domain Controller-Specific Records
Mnemonic | Type | DNS Record |
---|---|---|
LdapIpAddress | A | <DnsDomainName> |
Ldap | SRV | _ldap._tcp.<DnsDomainName> |
DcByGuid | SRV | _ldap._tcp.<DomainGuid>.domains._msdcs.<DnsForestName> |
Kdc | SRV | _kerberos._tcp.dc._msdcs.<DnsDomainName> |
Dc | SRV | _ldap._tcp.dc._msdcs.<DnsDomainName> |
Rfc1510Kdc | SRV | _kerberos._tcp.<DnsDomainName> |
Rfc1510UdpKdc | SRV | _kerberos._udp.<DnsDomainName> |
Rfc1510Kpwd | SRV | _kpasswd._tcp.<DnsDomainName> |
Rfc1510UdpKpwd | SRV | _kpasswd._udp.<DnsDomainName> |
Global Catalog-Specific Records
Mnemonic | Type | DNS Record |
---|---|---|
Gc | SRV | _ldap._tcp.gc._msdcs.<DnsForestName> |
GcIpAddress | A | gc._msdcs.<DnsForestName> |
GenericGc | SRV | _gc._tcp.<DnsForestName> |
当然,最后补充一点关于问题1的,我们可以使用netdom join命令来指定本站点的域控执行加域操作,语法如下