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 or _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_V4FWPM_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 以降では、パケットを複製し、headerIncludeHeaderSize パラメーターが複製されたパケットの IP ヘッダー サイズに設定されている FwpsConstructIpHeaderForTransportPacket0 関数を呼び出して、これを行います。

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

IPsec ESP パケットの操作

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