Windows 筛选平台可扩展帮助程序类

Windows 筛选平台 (WFP) 包含一个网络诊断框架 (NDF) 帮助程序类,名为筛选平台帮助程序类 (FPHC)。 FPHC 可帮助确定 WFP 所致连接问题的根本原因。 第三方防火墙开发人员可实现自己的 NDF 帮助程序类。 FPHC 扩展性可实现在诊断期间调用这些第三方帮助程序类。

本主题假设读者已熟悉 WFP API

为什么要扩展 FPHC?

编写调用 WFP API 的应用程序的所有开发人员都应编写可扩展 FPHC 的 NDF 帮助程序类。

FPHC 能够确定 WFP 是否是连接问题的原因。 在可能的情况下,FPHC 还可确定是哪个提供程序创建了导致网络流量受阻的筛选器。 FPHC 会将此信息传递给 NDF,后者随后可通知用户 WFP 正在导致连接问题并告知导致网络流量受阻的提供程序的名称。

但 FPHC 无法向用户建议纠正措施,也无法告知用户筛选器阻止流量的原因。 只有 FPHC 扩展才能执行这些任务。

想象一个调用 WFP API 的第三方防火墙应用程序。 如果第三方防火墙实现了 FPHC 扩展,则可实现自定义操作来处理由 NDF 标识的连接问题。 当 NDF 诊断到应用程序被第三方防火墙阻止时,FPHC 扩展便能够处理相关的阻止事件。 FPHC 扩展处理事件的方式之一是提示用户使用防火墙取消对某个程序的阻止,然后在用户确认后取消对该程序的阻止。 FPHC 扩展也可通过另一种方式来处理事件:通知用户应用程序受阻的原因,例如应用程序受阻是因为应用程序被防火墙视为恶意软件。

关于 WFP 诊断

当调用 NDF 来诊断网络问题时,会联系帮助程序类来确定问题的原因。 如果更高级别的帮助程序类确定网络故障可能由 WFP 引起,则会根据可用信息为 FPHC 生成假设。 NDF 以多个事件属性的形式将此假设传递给 FPHC。 以下 FPHC 事件属性部分详细介绍了这些属性。

网络问题指对一次具体的连接尝试造成影响的连接问题。 例如,用户可能会无意中单击“不允许”,导致意外阻止某个应用程序。 防火墙随后阻止该应用程序绑定到任何端口。 而用户此时不知道应用程序为何受阻,可能会尝试通过应用程序提供的入口点诊断该问题。 FPHC 会查看日志,如果找到匹配项,会检索相关特定筛选器的筛选器 ID 和提供程序 ID。 此时,FPHC 知晓了该筛选器的所有者是谁,于是将诊断过程移交给合适的帮助程序类进行进一步诊断。

WFP 事件日志中与相关属性匹配的最新事件被选定为与相关网络问题相关的事件。 如果未发现匹配的事件,且 WFP 日志中含发生事件的时间,则 FPHC 向 NDF 指示它正常。 如果未发现匹配的事件,且 WFP 日志不含事件发生的时间,则 FPHC 会向 NDF 返回不确定状态。

如果发现匹配事件,FPHC 会使用导致事件的筛选器的提供程序 ID 来标识阻止连接的安全规则的提供程序。 然后,FPHC 检查是否有用于该提供程序的帮助程序类扩展。 如果有,FPHC 将为该提供程序生成一个假设,然后 NDF 会调用该扩展。 该扩展应向用户返回有用的诊断和修复信息。

帮助程序类注册

须按注册 NDF 帮助程序类扩展中所述来注册 FPHC 扩展。 实现帮助程序类的开发人员须注册其扩展,以确保扩展会在适当的时候由 NDF 调用。 下面所述的匹配属性须存储在注册表和以下路径中:HKLM\System\CurrentControlSet\Control\NetDiagFx\VendorName\HostDL\Helper Class DLL\HelperClasses\Helper Class Name\MatchAttributes

下表显示了 WFP 事件日志中用于在诊断中标识要使用的假设的匹配属性。

名称 Type 描述
ProviderID REG_SZ FPHC 扩展的 GUID。 此值必须与 WFP 提供程序 GUID 相同。
此字符串区分大小写。 它应带有大括号和连字符并以大写形式存储在注册表中。 例如,{C200E360-38C5-11CE-AE62-08002B2B79EF} 是有效的 ProviderID。

当阻止的筛选器的 ProviderID 与注册的帮助程序类的 ProviderID 匹配时,FPHC 会通知 NDF 调用该帮助程序类,从而扩展 FPHC 的诊断功能。

FPHC 事件属性

下表列出了与每个匹配事件关联的事件属性。 每个事件属性以 HELPER_ATTRIBUTE 结构存储。 发现一个匹配事件时,NDF 会将这些属性传递给 FPHC。 接着这些属性被传递给 FPHC 扩展。

属性 ATTRIBUTE_TYPE 说明
提供程序 GUID AT_GUID 与筛选器关联的提供程序的 GUID。
Timestamp AT_OCTET_STRING FILETIME 类型的缓冲区,指定事件发生的时间。 此时间戳可用于唯一标识事件。
ipProtocol AT_UINT32 传输层协议(采用 UINT8 格式)。
LocalAddr AT_SOCKADDR 本地 IP 地址和端口,以 DIAG_SOCKADDR 结构存储。
RemoteAddr AT_SOCKADDR 远程 IP 地址和端口,以 DIAG_SOCKADDR 结构存储。
userId AT_OCTET_STRING 表示 userid 的 SID 类型的缓冲区。 如果 userId 长度为 0,则 SID 不可用。
appId AT_STRING 用于存储检索到的应用程序标识符的缓冲区。 如果 appId 的值为“L”,则应用程序标识符不可用。

处理 FPHC 事件

在向用户建议诊断和修复信息之前,FPHC 扩展应收集比 FPHC 通知提供的数据更多的数据。 可通过 WFP 事件管理功能获取此数据。 显示 Net 事件示例中演示了这些功能。

SDK 中有更详细的事件管理示例。 该示例的源代码位于以下 SDK 安装路径:C:\Program Files\Microsoft SDKs\Windows\<version number>\Samples\NetDs\WFP\DiagEvents。 Windows Vista SDK 可通过下载中心获取。

内置 FPHC 诊断

在没有 FPHC 扩展的情况下,FPHC 可诊断下列方案。 FPHC 诊断到的大多数连接失败都是因防火墙阻止流量所致。 IPsec 方案不太常见。

下表显示了一些发生了 FPHC 可诊断的连接失败的方案,以及相关说明和传递给 NDF 的修复信息。

方案 弱运行状况描述 修复信息
防火墙删除 此计算机上的防火墙设置正在阻止连接。 请验证防火墙设置。
主模式失败 由于与 IPsec 安全策略不匹配,无法连接。 请联系 IPsec 策略所有者。
快速模式失败 由于与 IPsec 安全策略不匹配,无法连接。 请联系 IPsec 策略所有者。
用户模式失败 由于与 IPsec 安全策略不匹配,无法连接。 请联系 IPsec 策略所有者。
凭据失败 由于此计算机上的根证书颁发机构 (CA) 与远程计算机上的根 CA 不匹配,无法连接。 更新受信任的根证书。
过期的证书 用于 IPsec 身份验证的证书已过期。 申请证书。
其他证书失败 找不到用于 IPsec 身份验证的有效证书。 申请证书。
Kerberos 失败 该计算机不属于此域。 将此计算机加入一个域。
预共享密钥 重置预共享密钥。 重置预共享密钥。

Windows 筛选平台

设计 NDF 帮助程序类扩展

注册 NDF 帮助程序类扩展

NDF 帮助程序类示例