次の方法で共有


IPsec 互換コールアウト ドライバーの開発

IPsec と互換性のあるレイヤー

Windows Vista および Windows Server 2008 で始まる IPsec の Windows 実装と完全に互換性を持つには、コールアウト ドライバーを次のいずれかの実行時フィルターレイヤーに登録する必要があります。

TCP パケットフィルタリング
ストリーム レイヤー:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

非 TCP およびエラー以外の ICMP パケットのフィルタリング
データグラムデータのレイヤー:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

受信パケットをデータグラム データ層から受信挿入する前に再構築する必要がある場合を除き、これらのデータ 層に登録されているコールアウト ドライバーは IPsec と互換性があります。

IPsec と互換性のないレイヤー

これらのレイヤーでは IPsec トラフィックがまだ復号化または検証されていないため、ネットワーク層と転送レイヤーは IPsec と互換性がありません。 IPsec ポリシーは、ネットワーク層の分類操作の後に発生するトランスポート層で適用されます。

次のランタイム フィルター レイヤーは、Windows の IPsec 処理が次のレイヤーの下に発生するため、IPsec と互換性がありません。

FWPS_LAYER_INBOUND_IPPACKET_V4

FWPS_LAYER_INBOUND_IPPACKET_V6

FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD

FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD

FWPS_LAYER_OUTBOUND_IPPACKET_V4

FWPS_LAYER_OUTBOUND_IPPACKET_V6

FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD

FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD

トランスポート レイヤーに関する特別な考慮事項

トランスポート層 (FWPS_LAYER_XXX_TRANSPORT_V4 または_V6) に登録されているコールアウト ドライバーを IPsec と互換性のあるものにするには、次のガイドラインに従います。

  1. ALE で受信/受け入れレイヤー (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 または FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) を承認するコールアウトを登録します。また、トランスポート レイヤー (FWPS_LAYER_XXX_TRANSPORT_V4 or _V6) も承認します。

  2. 内部 Windows IPsec 処理との干渉を防ぐには、FWPM_SUBLAYER_UNIVERSALよりも重みが低いサブレイヤーにコールアウトを登録します。 FwpmSubLayerEnum0 関数を使用して、サブレイヤーの重みを見つけます。 この関数の詳細については、Microsoft Windows SDK の Windows フィルタリング プラットフォームの ドキュメントを参照してください。

  3. ALE 分類を必要とする受信トランスポート パケットは、ALE 承認受信/受け入れ層 (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 または FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) で検査する必要があります。 このようなパケットは、受信トランスポート 層から許可する必要があります。 Windows Vista Service Pack 1 (SP1) および Windows Server 2008 以降では、FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED メタデータ フラグを使用して、受信パケットが FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 および FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 フィルター レイヤーに示されるかどうかを判断します。 このメタデータ フラグは、Windows Vista で使用された FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY 条件フラグを置き換えます。

  4. 内部 Windows IPsec 処理との干渉を防ぐために、IPsec トラフィックがまだデトンネルされていない場合は、トランスポート 層で IPsec トンネル モード トラフィックをインターセプトしないでください。 次のコード例は、このようなパケットをバイパスする方法を示しています。

    FWPS_PACKET_LIST_INFORMATION0 packetInfo = {0};
    FwpsGetPacketListSecurityInformation0(
     layerData,
        FWPS_PACKET_LIST_INFORMATION_QUERY_IPSEC |
        FWPS_PACKET_LIST_INFORMATION_QUERY_INBOUND,
        &packetInfo
        );
    
    if (packetInfo.ipsecInformation.inbound.isTunnelMode &&
        !packetInfo.ipsecInformation.inbound.isDeTunneled)
    {
     classifyOut->actionType = FWP_ACTION_PERMIT;
     goto Exit;
    }
    
  5. IPsec で保護されたパケットが復号化され、トランスポート 層で検証されると、AH/ESP ヘッダーは IP ヘッダーに残ります。 このようなパケットを TCP/IP スタックに戻す必要がある場合は、AH/ESP ヘッダーを削除するために IP ヘッダーを再構築する必要があります。 Windows Vista SP1 および Windows Server 2008 以降では、パケットを複製し、複製されたパケットの IP ヘッダー サイズに headerIncludeHeaderSize パラメーターを設定した FwpsConstructIpHeaderForTransportPacket0 関数を呼び出すことでこれを実行できます。

  6. ALE 受信/受け入れ層では、コールアウトは、FWP_CONDITION_FLAG_IS_IPSEC_SECURED フラグが設定されているかどうかを確認することで、IPsec で保護されたトラフィックを検出できます。 トランスポート 層では、FwpsGetPacketListSecurityInformation0 関数を呼び出し、queryFlags パラメーターで FWPS_PACKET_LIST_INFORMATION0 フラグが設定されているかどうかを確認することで、IPsec で保護されたトラフィックを検出できます。

IPsec ESP パケットの操作

暗号化解除されたカプセル化セキュリティ ペイロード (ESP) パケットがエンジンによって示されると、末尾の ESP データを除外するように切り捨てられます。 エンジンがこのようなパケットを処理する方法により、NET_BUFFER 構造体の MDL データに正しいパケット長が反映されません。 NET_BUFFER_DATA_LENGTH マクロを使用して、NET_BUFFER 構造体のデータ長を取得することで、正しい長さを取得できます。