本文解决了使用第三方 VPN 客户端连接到域网络时,Windows 防火墙配置文件无法从“公共”或“专用”切换到“域”的问题。

适用于:Windows 10 - 所有版本
原始 KB 数: 4550028

症状

使用第三方虚拟专用网络 (VPN) 客户端连接到域网络。 在这种情况下,Windows 防火墙并不总是按预期从公共或专用配置文件切换到域配置文件。

原因

某些第三方 VPN 客户端中的时差有时会导致此问题。 当客户端将必要的路由添加到域网络时,会出现延迟。

解决方案

若要解决此问题,我们建议你联系 VPN 提供商以获取解决方案,以减少添加域路由导致的时差。

对于 VPN 提供程序,可以使用回调 API 在 VPN 适配器到达 Windows 后立即添加路由。 例如:

  • NotifyUnicastIpAddressChange:提醒调用方任何 IP 地址发生任何更改,包括 DAD 状态的更改。

  • NotifyIpInterfaceChange:注册回调,以通知所有 IP 接口的更改。

在用户模式下,存在 IpHelper API。 例如:

  • NotifyAddrChanget:通知用户地址更改。

解决方法

 重要

请仔细遵循本部分中的步骤进行操作。 对注册表修改不当可能会导致严重问题。 修改之前,备份注册表以便在发生问题时进行还原

若要解决此问题,请禁用负缓存,以帮助网络位置感知 (NLA) 服务重试域检测。 为此,请使用以下方法。

  • 首先,通过将 NegativeCachePeriod 注册表项添加到以下子项来禁用域发现负缓存:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters

    名称: NegativeCachePeriod
    类型: REG_DWORD
    值 数据: 0 (默认值: 45 秒;设置为 0 以禁用缓存)

  • 如果问题未解决,请通过将 MaxNegativeCacheTtl 注册表项添加到以下子项来进一步禁用 DNS 负缓存:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters

    名称: MaxNegativeCacheTtl
    类型: REG_DWORD
    值 数据: 0 (默认值: 5 秒;设置为 0 以禁用缓存)

更多信息

发生此问题时,事件流如下所示:

  • 用户连接到 VPN。

  • 在 VPN 隧道设置期间,会创建 VPN 接口并为其分配 IP 地址,并将必要的路由添加到接口。 以下情况适用:

    • 该地址属于特定类型,例如 DHCP、IPv6 链路本地和 IPv6 临时。

    • 为该地址启用乐观重复地址检测 (DAD) 。

    • TCP/IP 在以下任一情况下会立即添加主机路由和链路上子网路由:

      否则,TCP/IP 会在 DAD 成功完成后添加这些路由。

    • VPN 客户端负责 VPN 网络的必要路由,例如使 VPN 接口可路由到 VPN DNS 服务器。

  • 第一个路由更改触发网络连接状态指示器 (NCSI) 检测。 网络位置感知 (NLA) 服务尝试向域控制器进行身份验证,以将正确的配置文件分配给防火墙。

  • 身份验证首先让 NLA 服务调用 DsGetDcName 函数来检索 DC 名称。 它通过名称的 DNS 名称解析完成,例如 as_ldap._tcp。CNNDC._sites.dc._msdcs。<domainname>。

  • 如果在将指向 VPN DNS 服务器的必要 VPN 路由添加到 VPN 接口之前发生此名称解析,则此 DNS 名称解析将失败。 它返回“DsGetDcName 函数失败,ERROR_NO_SUCH_DOMAIN”。然后,缓存此结果。

  • DNS 名称解析失败也可能创建负 DNS 缓存。 当 NLA 服务重试域检测时,负缓存会导致其他故障。