Windows 10 名称解析跳过/忽略子网

Windows 10 名称解析跳过/忽略子网

这是一个相当复杂的问题,但我会尽力让它容易理解:

我有三个子网。我们将它们称为 10.10.0.0/22、10.20.0.0/22 和 10.30.0.0/16。我有两个 AD 域,但我认为这并不重要。

10.30.0.x子网是我网络上大多数机器所在的位置。10.10 和 10.20 子网专用于服务器之间的大量流量。(存储和虚拟机迁移。)

域控制器(和 DNS 服务器)在所有三个子网上都有接口,因此它们可以对所有三个子网上的计算机进行身份验证。因此,我们在 DNS 服务器上启用了子网优先级,这意味着它们将尝试对 DNS 结果进行排序,优先考虑客户端的子网。例如,我从 10.30 子网向 server.company.com 发出请求(它也在所有三个子网上都有接口),它将返回该计算机的所有三个 IP 地址,但返回顺序为 10.30.0.5、10.20.0.5、10.10.0.5。(最后两个可以颠倒)

DNS 中的一切似乎都按预期运行。我的工作站是仅有的在 10.30 子网上。但是,当我 ping server.company.com 时,它总是解析为 10.20.0.5 或 10.10.0.5,并且绝不到 10.30.0.5。我运行了 Wireshark 捕获 DNS 流量,DNS 服务器肯定按正确顺序返回结果。但是,我的客户端完全忽略了 10.30 条目。它始终解析为 10.20 或 10.10,具体取决于 DNS 回复中的下一个。nslookup 查询似乎总是正确的,但 nslookup 实际上并没有解析查询,它只提供 DNS 服务器的答案,据我所知,这是正确的。

我运行的是 Windows 10,安装了所有可用的 Windows 更新。(无内部组件)我已确认至少有四台其他运行 Windows 10 的机器也存在同样的行为,但其他一些运行 Windows 10 的机器运行正常。我在 Windows 8、7、所有最新版本的服务器和几台 Linux 机器上进行了测试,所有机器都正确解决了问题。它只出现在一些 Windows 10 机器上,尽管我不能完全排除它在其他地方发生的可能性。

奇怪的地方就在这里:我可以编辑我机器上的 HOSTS 文件,如果 10.30 条目是服务器的唯一条目,它就会正确解析。但如果有其他选项,它会选择那个。如果 10.30 条目在列表中排在第一位,那就没有区别了。

然后就很奇怪了:我 100% 的时间都可以顺利通过 RDP 连接到 server.company.com。我打开一个 cmd 窗口,然后或者tracertserver.company.com,它解析为 10.10.0.5。我输入mstsc -v:10.10.0.5后超时,因此无法通过该地址访问。(也不应该)但是,mstsc -v:10.30.0.5mstsc -v:server.company.com实际上可以工作,这意味着 ping 似乎没有使用与 Microsoft RDP Client 相同的解析机制。我也没有清除 DNS 缓存。事实上,当我输入时,条目按正确的顺序列出ipconfig /displaydns。服务器管理器 (RSAT) 似乎可以从我的工作站管理服务器,但 Hyper-V 管理器不能。RPC 似乎可以工作,但我收到一些功能的奇怪身份验证错误。由于某种原因,一些应用程序完全跳过了 10.30 子网。

组策略中是否有某些内容可以告诉 Windows 降低某些子网的优先级?所有子网都列在 Active Directory 站点和服务中,我认为我在那里没有做任何特别的事情。(只有一个站点。)还有其他什么可能导致名称解析因某种原因跳过子网吗?

编辑:我非常感谢建议不要在 Active Directory 中使用多宿主 DC,但是,这样做是出于必要,我不认为这是导致问题的因素。Wireshark 跟踪结果显示,DNS 列表以正确的顺序返回,本地子网是第一个条目。但是,Windows(看起来特别像 ICMP)选择忽略该条目并使用返回的第二个条目。(除非 Windows 使用其他地址解析方式,并且在您询问之前,NetBIOS 已被禁用。:))

答案1

如果你确实需要多宿主你的 DC,请按照以下步骤操作。我从以下网址获取了这些步骤那里。该文档链接至旧 KB,但它是由一位知名博主更新的文档。

以下是配置多宿主 DC 的手动步骤

  1. 确保所有 NICS 仅指向您的内部 DNS 服务器,而不指向其他服务器,例如您的 ISP 的 DNS 服务器的 IP 地址。

  2. 在网络和拨号属性、高级菜单项、高级设置中,将内部 NIC(AD 所在的网络)移至绑定顺序的顶部(列表顶部)。

  3. 禁用外部 NIC 的注册功能。如前所述,该过程涉及识别外部 NIC 的 GUID 编号。以下链接将向您展示如何操作:

246804 – 如何启用/禁用 Windows 2000 动态 DNS 注册(每个 NIC 也一样): http://support.microsoft.com/?id=246804

  1. 禁用外部 NIC 上的 NetBIOS。具体方法是选择在“IP 属性”、“高级”中禁用 NetBIOS,然后您会在“WINS”选项卡下找到它。

如果这是 RRAS 服务器,您可能需要查看以下文章中的步骤 3,以了解如何在 RRAS 接口上禁用 NetBIOS。

第 11 章 – TCP/IP 上的 NetBIOS http://technet.microsoft.com/en-us/library/bb727013.aspx

或者在注册表中启用/禁用接口上的 NetBIOS:

要在注册表中执行此操作,但您需要识别该接口的 GUID - (这可能不适用于 PPP 接口)HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\Parameters\Interfaces,找到 NetbiosOptions 设置为 0 的 GUID 并将其设置为 2。使用 WMIC:

首先,获取接口列表:wmic nicconfig get caption,index,TcpipNetbiosOptions

然后在下一个命令中使用“索引号”:wmic nicconfig where index=1 call SetTcpipNetbios 2

SetTcpopNetbios 选项包括:

0 – 使用来自 DHCP 服务器的 NetBIOS 设置 1 – 启用 TCP/IP 上的 NetBIOS 2 – 禁用 TCP/IP 上的 NetBIOS

有关 wmic 命令和注册表项的更多信息,请参阅以下论坛主题链接:

主题 – 配置 TCP/IP 上的 NetBIOS http://social.technet.microsoft.com/Forums/en-US/winservercore/thread/d18bd172-e1a0-4a61-ba52-0952a1e3cabc/

配置 TCP/IP 以使用 WINS http://technet.microsoft.com/en-us/library/cc757386(WS.10).aspx

注意:Windows 的标准服务称为“浏览器服务”,它提供您在“网上邻居”(或旧称“网上邻居”)中看到的计算机、工作组和域名列表。浏览器服务依赖于 NetBIOS 服务。NetBIOS 服务的一个主要要求是,一台计算机只能有一个名称对应一个 IP 地址。这有点像指纹。您不能有两个名叫 Darrell 的兄弟。多宿主计算机会导致自身出现重复名称错误,因为 Windows 在浏览列表(网上邻居)中看到自己具有相同的名称,但 IP 不同。您只能有一个,因此会产生错误。

  1. 禁用“文件和打印服务”并禁用外部 NIC 上的“MS 客户端服务”。这可以通过在 NIC 属性中取消选中常规属性页面下的相应服务来完成。如果您需要外部 NIC 上的这些服务(这不太可能),这些服务允许其他计算机连接到您的计算机以访问您计算机上的资源(共享文件夹、打印机等),那么您可能需要保持它们处于启用状态。

  2. 在 IP 属性、高级设置、“DNS”选项卡下取消选中“注册此连接”。

  3. 删除外网卡IP地址,禁用Netlogon注册,并手动创建所需记录

    a. 在区域名称 (您的 DNS 域名) 下的 DNS 中,删除“LdapIpAddress”的外部 NIC 的 IP 引用。

    b. 如果这是 GC,您还需要删除 GC IP 记录(“GcIpAddress”)。为此,在 DNS 控制台中,在区域名称下,您将看到 _msdcs 文件夹。在 _msdcs 文件夹下,您将看到 _gc 文件夹。在右侧,您将看到引用 GC 地址的 IP 地址。这称为 GcIpAddress。删除引用外部 NIC 的 IP 地址。

        1. To stop these two records from registering that information, use the steps provided in the links below:
    
            Private Network Interfaces on a Domain Controller Are Registered in DNS
            http://support.microsoft.com/?id=295328 
    
         2.. The one section of the article that disables these records is done with this registry entry:
    
               HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters
               (Create this Multi-String Value under it):
                Registry value: DnsAvoidRegisterRecords
                Data type: REG_MULTI_SZ
                Values: LdapIpAddress
                              GcIpAddress
    
                 The following link provides more information on the LdapIpAddress and GcIpAddress, as well as other Netlogon Service records:
    
                  Restrict the DNS SRV resource records updated by the Netlogon service[includingGC]:
                  http://technet.microsoft.com/en-us/library/cc778029(WS.10).aspx
    
    
            3. Then you will need to manually create GcIpAddress and IpAddress records in DNS with the IP addresses that you need for the DC. To create the LdapIpAddress, manually create a new host under the domain, but leave the “hostname” field blank, and provide the internal IP of the DC, which results in a record that  looks like:
    

    (与父级相同) 192.168.5.200(本例中使用 192.168.5.200)

             4. You need to also manually create the GcIpAddress as well, if this is a GC. That would be under the _msdcs._gc SRV record under the zone. It is created in the same fashion as the LdapIpAddress mentioned above.
    
  4. 在 DNS 控制台中,右键单击服务器名称,选择属性,然后在“接口”选项卡下,强制它仅监听内部 NIC 的 IP 地址,而不是外部 NIC 的 IP 地址。

  5. 由于这也是一个 DNS 服务器,所以所有 NIC 的 IP 都会注册,即使您在 NIC 属性中告诉它不要注册。请参阅此内容以了解如何停止该行为(此过程适用于 Windows 2000,但也适用于 Windows 2003):

275554 – 您选择不注册连接地址后,主机的 A 记录会在 DNS 中注册: http://support.microsoft.com/?id=275554

  1. 禁用 DNS 服务器上的循环功能。操作方法:(此步骤于 2010 年 5 月添加)1. 单击“开始”,单击“设置”,单击“管理工具”,然后单击“DNS”。2. 打开 DNS 服务器名称的属性。

  2. 如果您还没有这样做,请配置转发器。您可以使用 4.2.2.2 和 4.2.2.3,如果您不确定要转发到哪个 DNS,直到您获得 ISP 的 DNS 地址。如何设置转发器?好问题。根据您的操作系统,选择以下文章之一,具体取决于您的操作系统。

300202 – 如何:在 Windows 2000 中配置 DNS 以进行 Internet 访问 http://support.microsoft.com/?id=300202

323380 – 如何:在 Windows Server 2003 中配置 Internet 访问的 DNS(如何配置转发器): http://support.microsoft.com/d/id?=323380

配置 DNS 服务器以使用转发器 - Windows 2008 和 2008 R2 http://technet.microsoft.com/en-us/library/cc754941.aspx

Active Directory 和 NAT

我想谈一下关于通过 NAT 进行 AD 通信的这个被忽视的事实。

如果要在使用必须穿越 NAT 的 AD 身份验证 (Kerberos) 的 AD 基础架构中提供计划资源,则基本上行不通。这是因为安全 RPC 通信和 NAT 无法转换由于加密而产生的流量。如果您确实需要使其工作,则有解决方案可以解决它,例如跨 NAT 设备在服务之间建立直接 VPN,或直接连接它们的附加 NIC。有关更多信息,请参阅此链接,以及 Microsoft 对此的看法和解决方案:

Active Directory over NAT 的支持范围说明 http://support.microsoft.com/default.aspx?scid=kb;en-us;978772&sd=rss&spid=12925

多宿主域控制器上的 Active Directory 通信失败 http://support.microsoft.com/kb/272294

多宿主 Windows 计算机上的源 IP 地址选择

人们经常对计算机在发送流量时如何选择使用哪个适配器感到困惑。本博客介绍了在多宿主计算机上为出站连接选择网络适配器的过程,以及如何为该连接选择本地源 IP 地址。

多宿主 Windows 计算机上的源 IP 地址选择 http://blogs.technet.com/b/networking/archive/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer.aspx

答案2

根据这篇文章Windows 10 中的客户端 DNS 优先级

不幸的是,有一个问题;截至今天,Windows 10 中 RFC 的实现,或者至少是规则 9 的实现,从根本上讲是错误的。如前所述,规则 9 将客户端 IP 地址与从 DNS 查询中检索到的每个地址进行比较,以识别具有最长匹配前缀的值。此比较基于 IPv4 地址的 IPv6 转换(即使未启用 IPv6),但不幸的是,该比较不是基于 IPv6 地址的长度,而是错误地使用了 IPv4 地址的长度(即,实际上只有转换后的 IPv6 地址的一部分用于比较)。微软的产品团队已经确认了这个错误,并开发了一个私人修补程序,预计将在未来几周内向公众发布

这是另一篇文章中的临时解决方案(直到重新启动):

netsh int ipv6 set locality state=disabled

(C)DNS 子网优先级在 Windows 10 上不起作用

答案3

尝试:NETSH winsock 重置目录并重新启动

答案4

好的,多宿主与此无关,因为我的一些 Win 10 客户端也遇到了同样的问题。我尝试了所有我能找到或想到的解决方案 - DNS 服务器设置为没有循环和 DNS 子网优先级,我调整了服务器和主机上的注册表设置以将 DNS 子网优先级推至开启状态(设置为正确的掩码长度,虽然我们在 /24 上,所以它无论如何都应该默认正确)。这实际上很常见,快速谷歌一下就会发现,这与时髦的网络设置无关 - 你可以在足够复杂的网络上得到同样的事情,以实现子网优先级,但这只是一些客户端。

这个问题肯定是 100% 客户端问题。我们只在 Win 10 机器上发现这个问题(我们在 Win 8 上也遇到过类似的问题,但通过 reg hacks 解决了 - Win 10 只是嘲笑它们)。DNS 查询返回了正确的答案(我也用 Wireshark 确认了这一点),客户端在获取 IP 后会指向正确的地址 4-5 秒,然后更改为错误的子网响应。

目前,我通过破解单个客户端上的 hosts 文件来解决这个问题;重启后,它总是指向正确的位置。幸运的是,我只有 250 台左右的机器,其中到目前为止只有大约 15 台机器使用 Win 10,其中只有大约一半受到影响,所以目前是可以管理的。但是,对于较大的部署或移动用户来说,这不是一个真正可行的解决方案。

但是,是的,只是想让你知道,这不仅仅是你的问题,这不是由于你的不寻常的网络设置造成的,也不值得查看 DNS,因为 DNS 显然不是导致这个问题的原因。

相关内容