仮想スイッチ フィルターの使用
仮想スイッチ フィルターの概要
仮想スイッチ フィルターは、Windows 8 以降のバージョンの Windowsでサポートされています。
この WFP 機能を使用すると、MAC ヘッダー、IP ヘッダー、上位プロトコル ポートのフィールドだけでなく、仮想ポート (VPort) や仮想マシン識別子 (VM ID) などの仮想スイッチ固有のフィールドでフィルター処理できます。 これらのレイヤーは、仮想スイッチを通過するすべてのパケットに対してパケットごとに呼び出されます。 これらのレイヤーは、仮想スイッチ拡張フィルターという 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 は OID 要求ハンドラーに STATUS_PENDING を返します。 コールアウト ドライバーは、保留中の操作を完了するために 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 (既定のポート ID) からのトラフィックは信頼されるため、フィルター処理しないでください。 これは、通常、ポート 0 経由のトラフィックはドライバー スタック内の他の拡張機能から送信され、データ パスによって特権と信頼として扱われるためです。 仮想スイッチ拡張機能は、制御パケットの送信元などの状況でポート 0 を慎重に使用します。これは、基になる拡張機能によってフィルター処理および拒否されないようにする必要があります。 Hyper-V 拡張可能スイッチのソース ポートの変更の詳細については、「パケットの拡張可能スイッチの送信元ポート データの変更」を参照してください。
コールアウト照合ルール
フィルター処理に一致するルールを定義する場合、仮想スイッチのコールアウトでは、MAC アドレスを比較の基準として使用しないでください。 MAC アドレスは実行時に変更される可能性があり、一部のポートでは複数の MAC アドレスからのトラフィックが生成される場合があります。 代わりに、コールアウトでは、NIC ID などのより永続的な照合ルールを使用する必要があります。これは変更されません。
I/O 仮想化 (IOV) と WFP の共存
WFP は IOV スイッチで有効にできず、有効にしようとすると OS によってブロックされます。
WFP の有効化または無効化
WFP 仮想スイッチ コールアウト インストーラーで WFP 拡張機能が有効な状態を変更しないでください。つまり、WFP 自体の有効と無効を切り替えないでください。