使用虚拟交换机筛选

虚拟交换机筛选概述

Windows 8 及更高版本的 Windows 支持虚拟交换机筛选。

此 WFP 功能允许筛选 MAC 标头、IP 标头和上层协议端口的字段,以及虚拟交换机特定的字段,例如虚拟端口 (VPort) 和虚拟机标识符 (VM ID) 。 对于遍历虚拟交换机的所有数据包,将按数据包调用这些层。 这些层是从虚拟交换机扩展筛选器(一种 NDIS 轻型筛选器 (LWF) 驱动程序)访问的。

标注驱动程序调用 FwpsvSwitchEventsSubscribe0 函数来注册虚拟交换机层事件的回调入口点。

回调通知函数的入口点在 FWPS_VSWITCH_EVENT_DISPATCH_TABLE0 结构中指定。 可用的回调函数包括:

FWPS_VSWITCH_EVENT_TYPE 枚举定义虚拟交换机通知函数的 eventType 参数的值。

标注驱动程序最终必须调用 FwpsvSwitchEventsUnsubscribe0 以释放系统资源。

如果标注驱动程序从 WFP 通知函数返回STATUS_PENDING,则 WFP 会将STATUS_PENDING返回到 OID 请求处理程序。 标注驱动程序必须调用 FwpsvSwitchNotifyComplete0 函数才能完成挂起的操作。 在 FwpsvSwitchNotifyComplete0 调用后,WFP 调用 NdisFOidRequestComplete 函数以完成虚拟交换机的 OID。

回调不应在通知函数的上下文中同步添加或删除 WFP 筛选器。 此外,如果通知函数允许回调返回STATUS_PENDING,并且标注返回STATUS_PENDING,则标注在完成通知之前不应添加或删除 WFP 筛选器。

WFP 虚拟交换机筛选器层和字段

用于虚拟交换机筛选的运行时筛选层标识符包括:

  • FWPS_LAYER_INGRESS_VSWITCH_ETHERNET
  • FWPS_LAYER_EGRESS_VSWITCH_ETHERNET
  • FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4
  • FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6
  • FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4
  • FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6

用于筛选虚拟交换机的数据字段标识符包括:

WFP 虚拟交换机标注编写器指南

端口 0 流量

对于 WFP 虚拟交换机标注,来自端口 0 (默认端口 ID) 的流量受信任,不应进行筛选。 这是因为,通常,通过端口 0 的流量来自驱动程序堆栈中的其他扩展,因此数据路径将其视为特权和受信任的。 对于发出控制数据包等情况,虚拟交换机扩展将谨慎使用端口 0,不应由任何基础扩展筛选和拒绝该数据包。 有关 Hyper-V 可扩展交换机源端口模式的详细信息,请参阅 修改数据包的可扩展交换机源端口数据

标注匹配规则

定义筛选的匹配规则时,虚拟交换机标注不应使用 MAC 地址作为比较的基础。 MAC 地址可以在运行时更改,某些端口可能会从多个 MAC 地址生成流量。 相反,标注应使用更持久的匹配规则,例如 NIC ID,该规则不会更改。

I/O 虚拟化 (IOV) 和 WFP 共存

无法在 IOV 交换机上启用 WFP,如果尝试启用它,则 OS 会阻止它。

启用或禁用 WFP

WFP 虚拟交换机标注的安装程序不应修改 WFP 扩展已启用状态;也就是说,它们不应启用或禁用 WFP 本身。