Windows フィルタリング プラットフォームの拡張可能なヘルパー クラス

Windows フィルタリング プラットフォーム (WFP) には、フィルター プラットフォーム ヘルパー クラス (FPHC) と呼ばれるネットワーク診断フレームワーク (NDF) ヘルパー クラスが含まれています。 FPHC は、WFP によって発生する接続の問題の根本原因を特定するのに役立ちます。 サードパーティのファイアウォール開発者は、独自の NDF ヘルパー クラスを実装できます。 FPHC の拡張性により、これらのサード パーティのヘルパー クラスを診断中に呼び出すことができます。

このトピックでは、WFP API に関する知識を前提としています。

FPHC を拡張する理由

WFP API を呼び出すアプリケーションを記述するすべての開発者は、FPHC を拡張する NDF ヘルパー クラスを記述する必要があります。

FPHC は、接続の問題の原因として WFP を特定できます。 使用可能な場合、FPHC は、ネットワーク トラフィックをブロックしているフィルターを作成したプロバイダーを識別することもできます。 FPHC はこの情報を NDF に渡します。NDF は、これにより、WFP が接続の問題を引き起こしていることをユーザーに通知し、トラフィックをブロックしているプロバイダーの名前を示すことができます。

ただし、FPHC はユーザーに是正措置を提案することも、フィルターがユーザーへのトラフィックをブロックしている理由を提供することもできません。 これらのタスクを実行できるのは FPHC 拡張機能だけです。

WFP API を呼び出すサード パーティ製のファイアウォール アプリケーションについて考えてみましょう。 サードパーティのファイアウォールで FPHC 拡張機能が実装されている場合は、NDF によって識別される接続の問題を処理するためのカスタム アクションを実装できます。 サードパーティのファイアウォールによってアプリケーションがブロックされたことを NDF が診断すると、FPHC 拡張機能はブロック イベントを処理できます。 FPHC 拡張機能がイベントを処理する方法の 1 つは、ファイアウォールを使用してプログラムのブロックを解除し、ユーザーの確認時にプログラムのブロックを解除するプロンプトをユーザーに表示することです。 または、FPHC 拡張機能は、ファイアウォールによってマルウェアと見なされたためにアプリケーションがブロックされたなど、アプリケーションがブロックされた理由をユーザーに通知することで、イベントを処理できます。

WFP 診断について

ネットワークの問題を診断するために NDF が呼び出されると、ヘルパー クラスに連絡して問題の原因を特定します。 上位レベルのヘルパー クラスは、ネットワーク障害が WFP によって発生する可能性があると判断した場合、利用可能な情報に基づいて FPHC の仮説を生成します。 NDF は、この仮説を複数のイベント属性の形式で FPHC に渡します。 これらの属性については、後述の「FPHC イベント属性」セクションで詳しく説明します。

ネットワークの問題は、特定の接続試行に影響を与える接続の問題として記述できます。 たとえば、ユーザーが誤って [許可 しない] をクリックしてアプリケーションを誤ってブロックしてしまうことがあります。 その後、ファイアウォールは、アプリケーションが任意のポートにバインドされるのをブロックします。 アプリケーションがブロックされている理由がわからないユーザーは、アプリケーションによって提供されるエントリ ポイントを通じて問題の診断を試みる可能性があります。 FPHC はログを確認し、一致するものが見つかると、その特定のフィルターのフィルター ID とプロバイダー ID が取得されます。 この時点で、FPHC はそのフィルターの所有者を認識し、診断プロセスを適切なヘルパー クラスに引き継ぎ、さらに診断を行います。

属性と一致する WFP イベント ログの最新のイベントは、ネットワークの問題に関連するものとして選択されます。 一致するイベントが見つからない場合、イベントが発生した時刻が WFP ログでカバーされている場合、FPHC は NDF に正常であることを示します。 一致するイベントが見つからず、WFP ログにイベントが発生した時刻が含まれていない場合、FPHC は不確定状態を NDF に返します。

一致するイベントが見つかった場合、FPHC はフィルターのプロバイダー ID を使用します。これにより、イベントは接続をブロックしたセキュリティ規則のプロバイダーを識別します。 FPHC は、そのプロバイダーのヘルパー クラス拡張機能が存在するかどうかを確認します。 見つかった場合、FPHC はそのプロバイダーの仮説を生成し、NDF は拡張機能を呼び出します。 拡張機能は、ユーザーに役立つ診断と修復の情報を返す必要があります。

ヘルパー クラスの登録

FPHC 拡張機能は、「NDF ヘルパー クラス拡張の登録」の説明に従って登録する必要があります。 ヘルパー クラスを実装する開発者は、必要に応じて拡張機能が NDF によって呼び出されるように拡張機能を登録する必要があります。 以下で説明する一致する属性は、HKLM\System\CurrentControlSet\Control\NetDiagFx\VendorName\HostDLLs\Helper Class DLL\HelperClasses\Helper Class Name\MatchAttributes の下のレジストリに格納する必要があります。

次の表は、WFP イベント ログの診断で使用する仮説を識別するために使用される一致する属性を示しています。

名前 タイプ 説明
ProviderID REG_SZ FPHC 拡張機能の GUID。 この値は、WFP プロバイダー GUID と同じである必要があります。
この文字列では大文字と小文字が区別されます。 大文字で囲む中かっことハイフンを使用してレジストリに格納する必要があります。 たとえば、{C200E360-38C5-11CE-AE62-08002B2B79EF} は有効な ProviderID です。

ブロッキング フィルターの ProviderID が登録済みヘルパー クラスの ProviderID と一致する場合、FPHC はそのヘルパー クラスを呼び出すように NDF に通知し、FPHC の診断機能を拡張します。

FPHC イベント属性

次の表に、一致する各イベントに関連付けられているイベント属性を示します。 各イベント属性は、HELPER_ATTRIBUTE 構造体に格納されます。 これらの属性は、一致するイベントが見つかると、NDF によって FPHC に渡されます。 これらは、FPHC 拡張機能に渡すことができます。

Attribute ATTRIBUTE_TYPE 説明
プロバイダーの GUID AT_GUID フィルターに関連付けられているプロバイダーの GUID。
タイムスタンプ AT_OCTET_STRING イベントが発生した時刻を指定する FILETIME 型のバッファー。 このタイム スタンプを使用して、イベントを一意に識別できます。
ipProtocol AT_UINT32 UINT8 形式のトランスポート層プロトコル。
LocalAddr AT_SOCKADDR DIAG_SOCKADDR 構造体に格納されているローカル IP アドレスとポート。
RemoteAddr AT_SOCKADDR DIAG_SOCKADDR 構造体に格納されているリモート IP アドレスとポート。
userId AT_OCTET_STRING userid を表す SID 型のバッファー。 userId の長さが 0 の場合、SID は使用できません。
appId AT_STRING 取得したアプリケーション識別子を格納するバッファー。 appId の値が L"" の場合、アプリケーション識別子は使用できません。

FPHC イベントの処理

ユーザーに診断と修復の情報を提案する前に、FPHC 拡張機能は、FPHC 通知によって提供されるデータよりも多くのデータを収集する必要があります。 このデータは、WFP イベント管理機能から取得できます。 これらの関数は、Net イベントの表示サンプルで示されています。

SDK には、より詳細なイベント管理サンプルが含まれています。 サンプルのソース コードは、SDK のインストール場所の C:\Program Files\Microsoft SDKs\Windows\<version number>\Samples\NetDs\WFP\DiagEvents にあります。 Windows Vista SDK はダウンロード センターから入手できます。

組み込みの FPHC 診断

FPHC 拡張機能がない場合、FPHC は以下に示すシナリオを診断できます。 FPHC によって診断されたほとんどの接続エラーは、ファイアウォールによってトラフィックがブロックされるために発生します。 IPsec のシナリオはあまり一般的ではありません。

次の表は、FPHC によって診断できる接続エラーの原因となるいくつかのシナリオと、NDF に渡される説明および修復情報を示しています。

シナリオ 低い正常性の説明 修復情報
ファイアウォールのドロップ このコンピューターのファイアウォール設定によって接続がブロックされています。 ファイアウォール設定を確認します。
メイン モード エラー IPsec セキュリティ ポリシーが一致しないため、接続できません。 IPsec ポリシー所有者に問い合わせてください。
クイック モード エラー IPsec セキュリティ ポリシーが一致しないため、接続できません。 IPsec ポリシー所有者に問い合わせてください。
ユーザー モード エラー IPsec セキュリティ ポリシーが一致しないため、接続できません。 IPsec ポリシー所有者に問い合わせてください。
資格情報の失敗 このコンピューターのルート証明機関 (CA) がリモート コンピューターのルート CA と一致しないため、接続できません。 信頼されたルート証明書を更新します。
期限切れの証明書 IPsec 認証に使用される証明書の有効期限が切れています。 証明書を要求します。
その他の証明書エラー IPsec 認証に有効な証明書が見つかりませんでした。 証明書を要求します。
Kerberos エラー コンピューターはこのドメインの一部ではありません。 このコンピューターをドメインに参加させます。
事前共有キー 事前共有キーをリセットします。 事前共有キーをリセットします。

Windows フィルタリング プラットフォーム

NDF ヘルパー クラス拡張機能の設計

NDF ヘルパー クラス拡張機能の登録

NDF ヘルパー クラスの例