Windowsネットワークの理解_WFP

  • Windowsネットワークの理解_WFP

Windowsネットワークの理解

  • Windowsネットワークの理解

WFP

名詞の説明

https://learn.microsoft.com/en-us/windows/win32/fwp/object-model https://learn.microsoft.com/en-us/windows/win32/fwp/basic-operation https://learn.microsoft.com/en-us/windows-hardware/drivers/network

callout: CalloutはWindows Filtering Platformの機能を拡張する機能を提供します。Calloutは一連のcallout関数とcalloutを一意に識別するGUIDキーで構成されます。 callout driver: Callout driverはWindows Filtering Platformにcalloutを登録するドライバです。Callout driverはフィルタドライバの一種です。 callout function: Callout functionはWindows Filtering Platformから特定のタスクを実行するために呼び出される関数です。Callout functionはcalloutに関連付けられています。 filter: フィルタはWindows Filtering Platformからフィルタリング操作を実行するために呼び出される一連の関数です。フィルタは一連のフィルタ関数とフィルタを一意に識別するGUIDキーで構成されます。 filter engine: フィルタエンジンはWindows Filtering Platformのコンポーネントで、フィルタリング操作を実行します。フィルタエンジンはWindows Filtering Platformに登録されたフィルタ関数を呼び出す責任があります。 filter layer: フィルタレイヤーはWindows Filtering Platformからフィルタリング操作を実行するために呼び出される一連の関数です。フィルタレイヤーは一連のフィルタレイヤー関数とフィルタレイヤーを一意に識別するGUIDキーで構成されます。

Dispatcherキューは可能な限り早くコールバックをトリガーする形式で、キューが満杯になるのを待つ必要はありません。したがってリアルタイム性を満たすことができます。 ユーザーのコールバックが遅い場合、ブロックされたパケットは次のキューにできるだけ挿入され、キューの上限は256です。さらに多くのブロックされたパケットはシステムによってキャッシュされ、粗いテストではキャッシュ能力は16500で、システムのキャッシュ能力はマシンの性能や構成によって異なる可能性があります。 ユーザーのコールバックがパケットを処理する際、2つのパケットエンティティが存在します: カーネルパケットはキューの処理が完了した後に一括で解放されます。したがって、コールバックが遅い場合、一度のコールバック実行で最大256個のパケットキャッシュ能力がシステムでロックされます。 コールバック中のコピーは単一パケットの処理が完了するとすぐに解放されます。

FwppNetEvent1Callbackでパケットをコピーして組み立て、元のパケットを操作しないので、業務に影響を与えません。

サブスクリプションはテンプレートフィルタを使用して、処理する必要のあるパケットを減らすことができます:

https://learn.microsoft.com/en-us/windows/win32/api/fwpmtypes/ns-fwpmtypes-fwpm_net_event_enum_template0

filterCondition

FWPM_FILTER_CONDITION0構造体の配列で、異なるフィルタ条件を含みます(重複したフィルタ条件はエラーを発生させます)。アクションを実行するにはすべての条件が真である必要があります。つまり、条件はANDで結合されます。条件が指定されていない場合、アクションは常に実行されます。

同じfilterは使用できません すべてのフィルタ間の関係は「AND」で、すべてを満たす必要があります Microsoftのドキュメントでは8種類のフィルタがサポートされていると表示されていますが、実際にはサポートされているフィルタはさらに多くなる可能性があります。

FWPM_CONDITION_IP_PROTOCOL

RFC 1700で指定されたIPプロトコル番号。 FWPM_CONDITION_IP_LOCAL_ADDRESS

ローカルIPアドレス。 FWPM_CONDITION_IP_REMOTE_ADDRESS

リモートIPアドレス。 FWPM_CONDITION_IP_LOCAL_PORT

ローカルトランスポートプロトコルポート番号。ICMPの場合はメッセージタイプ。 FWPM_CONDITION_IP_REMOTE_PORT

リモートトランスポートプロトコルポート番号。ICMPの場合はメッセージコード。 FWPM_CONDITION_SCOPE_ID

インターフェースIPv6スコープ識別子。内部使用のために予約されています。 FWPM_CONDITION_ALE_APP_ID

アプリケーションのフルパス。 FWPM_CONDITION_ALE_USER_ID

ローカルユーザーの識別。 システムに登録されたサブスクリプションを列挙したところ、すでに2つのサブスクリプションがあることがわかりました。そのsessionKey GUIDを確認しても誰が登録したかは特定できませんでしたが、分析した結果、2つのサブスクリプションはそれぞれ以下の機能を実装していることがわかりました:

すべてのFWPM_NET_EVENT_TYPE_CLASSIFY_DROPのパケットをサブスクライブし、すべての破棄されたパケットを統計しました。 すべてのFWPM_NET_EVENT_TYPE_CLASSIFY_ALLOWのパケットをサブスクライブし、トラフィック統計に使用できます。 これらのサブスクリプションで使用されたcondition filterはFWPM_CONDITION_NET_EVENT_TYPE(206e9996-490e-40cf-b831-b38641eb6fcb)で、Microsoftのドキュメントで言及されている8つ以外にもフィルタが実装可能であることがわかりました。

さらに調査した結果、ユーザーモードのAPI呼び出しではドロップイベントのみを取得でき、非ドロップイベントはカーネルモードで取得する必要があることがわかりました。したがって、マイクロセグメンテーションではFWPM_CONDITION_NET_EVENT_TYPEを使用してイベントを取得することはできません。