使用虚拟交换机筛选

虚拟交换机过滤概述

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,如果尝试启用它,会被操作系统阻止。

启用或禁用 WFP

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