虛擬交換器篩選概觀
Windows 8 和更新版本的 Windows 支援虛擬交換器篩選。
此 WFP 功能允許篩選 MAC 標頭、IP 標頭和上層通訊協定埠的欄位,以及虛擬交換器特定欄位,例如虛擬埠 (VPort) 和虛擬機識別碼 (VM 識別符)。 系統會針對所有通過虛擬交換器的封包,在每個封包的基礎上調用這些層。 這些層是從虛擬交換器擴充篩選器存取的,這是一種 NDIS 輕量型篩選器 (LWF) 驅動程式。
圖說驅動程式會呼叫 FwpsvSwitchEventsSubscribe0 函式,以註冊虛擬交換器層事件的回呼進入點。
回呼通知函式的進入點是在 FWPS_VSWITCH_EVENT_DISPATCH_TABLE0 結構中指定。 可用的回呼函式包括:
- FWPS_VSWITCH_FILTER_ENGINE_REORDER_CALLBACK0
- FWPS_VSWITCH_INTERFACE_EVENT_CALLBACK0
- FWPS_VSWITCH_LIFETIME_EVENT_CALLBACK0
- FWPS_VSWITCH_POLICY_EVENT_CALLBACK0
- FWPS_VSWITCH_PORT_EVENT_CALLBACK0
- FWPS_VSWITCH_RUNTIME_STATE_RESTORE_CALLBACK0
- FWPS_VSWITCH_RUNTIME_STATE_SAVE_CALLBACK0
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
- FWPS_FIELDS_EGRESS_VSWITCH_ETHERNET
- FWPS_FIELDS_EGRESS_VSWITCH_TRANSPORT_V4
- FWPS_FIELDS_EGRESS_VSWITCH_TRANSPORT_V6
- FWPS_FIELDS_INGRESS_VSWITCH_ETHERNET
- FWPS_FIELDS_INGRESS_VSWITCH_TRANSPORT_V4
- FWPS_FIELDS_INGRESS_VSWITCH_TRANSPORT_V6
WFP 虛擬交換通話通知撰寫指引
埠 0 流量
對於 WFP 虛擬交換呼叫,來自埠 0(預設埠標識符)的流量受到信任,不應過濾。 這通常是因為透過埠 0 的流量源自驅動程式堆疊中的其他延伸模組,因此數據路徑會被視為特殊許可權且受信任。 虛擬交換器擴充功能會僅在必要時使用埠 0,例如在產生控制封包的情況下,任何基礎延伸模組不應加以篩選或拒絕。 如需 Hyper-V 可延伸交換器來源埠修改的詳細資訊,請參閱 修改封包的可延伸交換器來源埠數據。
註解比對規則
定義篩選的比對規則時,虛擬交換器調用功能不應使用 MAC 位址作為比較的基礎。 MAC 位址可以在運行時間變更,某些埠可能會從多個 MAC 位址產生流量。 相反地,標註應該使用更持久的比對規則,例如 NIC 識別碼這樣不會改變的方式。
I/O 虛擬化 (IOV) 和 WFP 共存
在 IOV 交換器上無法啟用 WFP,如果嘗試啟用它,OS 就會封鎖它。
啟用或停用 WFP
WFP 虛擬交換器回呼的安裝程式不應修改 WFP 擴充功能的啟用狀態;也就是說,它們不應該啟用或停用 WFP 本身。