プロキシ接続追跡の使用

プロキシ接続の追跡は、Windows 8 以降のバージョンの Windows でサポートされています。

この WFP 機能は、接続の最初のリダイレクトから宛先への最終接続までのリダイレクト"レコード"の追跡を支援します。 WFP では、コールアウト ドライバーが接続をリダイレクトすることもできます。

プロキシ接続の追跡

複数のプロキシ (たとえば、異なる ISV によって開発されたプロキシ) が存在する場合、1 つのパーティが最終的な宛先と通信するために使用する接続は、2 番目のパーティによってリダイレクトされる可能性があります。そして、その新しい接続が元のパーティによって再びリダイレクトされる可能性があります。 接続追跡を行わないと、元の接続が無限プロキシ ループに陥り、最終的な宛先に到達しない可能性があります。

接続追跡をサポートするためのデータ フィールド識別子への追加には以下が含まれます:

FWPS_FIELD_Xxx_ALE_ORIGINAL_APP_ID
プロキシ接続用の元のアプリケーションの完全パス。 アプリケーションがプロキシされていない場合、このパスは xxx_ALE_APP_ID と同じです。

FWPS_FIELD_Xxx_PACKAGE_ID
パッケージ識別子は、関連付けられている AppContainer プロセスを識別するセキュリティ識別子 (SID) です。

接続のリダイレクト

コールアウト ドライバーは FwpsRedirectHandleCreate0 関数を呼び出して、TCP 接続のリダイレクトに使用できるハンドルを作成します。

ここでは、次のトピックについて説明します。

リダイレクト ハンドルの使用

リダイレクト状態のクエリ

リダイレクト ハンドルの使用

ALE 接続リダイレクト コールアウトは、接続をローカル プロセスにリダイレクトする前に、FwpsRedirectHandleCreate0 関数を使用してリダイレクト ハンドルを取得し、そのハンドルをFWPS_CONNECT_REQUEST0 構造体に配置する必要があります。 コールアウトは、ALE 接続リダイレクト レイヤーの classifyFn の構造を変更します。

FWPS_CONNECT_REQUEST0 構造体には、リダイレクト用の次のメンバーが含まれています。

用語 説明

localRedirectHandle

FwpsRedirectHandleCreate0 関数を呼び出してコールアウト ドライバーが作成したリダイレクト ハンドル。

localRedirectContext

ExAllocatePoolWithTag 関数を呼び出してコールアウト ドライバーが割り当てたコールアウト ドライバー コンテキスト領域。

localRedirectContextSize

提供されたコールアウトのコンテキスト領域のサイズ(バイト単位)。

コールアウト ドライバーは、リダイレクト ハンドルの使用終了後、FwpsRedirectHandleDestroy0 関数を呼び出してハンドルを破棄する必要があります。

リダイレクト状態のクエリ

コールアウト ドライバーは、FwpsQueryConnectionRedirectState0 関数を呼び出して、接続のリダイレクト状態を取得します。 FWPS_CONNECTION_REDIRECT_STATE リストは、FwpsQueryConnectionRedirectState0 関数への呼び出しの戻り値の型です。

リダイレクト ステータスが FWPS_CONNECTION_NOT_REDIRECTED の場合、ALE_CONNECT_REDIRECT コールアウトは接続のプロキシに進むことができます。

リダイレクト ステータスが FWPS_CONNECTION_REDIRECTED_BY_SELF の場合、ALE_CONNECT_REDIRECT コールアウトは FWP_ACTION_PERMIT/FWP_ACTION_CONTINUE を返す必要があります。

リダイレクト ステータスが FWPS_CONNECTION_REDIRECTED_BY_OTHER の場合、ALE_CONNECT_REDIRECT コールアウトは、他のインスペクターの結果を信頼していない場合、接続のプロキシに進むことができます。

リダイレクト ステータスが FFWPS_CONNECTION_PREVIOUSLY_REDIRECTED_BY_SELF の場合、ALE_CONNECT_REDIRECT コールアウトは、他のインスペクターの結果が受け入れられない場合でも、リダイレクトを実行することはできません。 この場合、(ALE_AUTH_CONNECT レイヤーで) 接続を許可またはブロックする必要があります。