IPsec と互換性のあるレイヤー
Windows Vista および Windows Server 2008 で始まる IPsec の Windows 実装と完全に互換性を持つには、コールアウト ドライバーを次のいずれかの実行時フィルターレイヤーに登録する必要があります。
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 と互換性のあるものにするには、次のガイドラインに従います。
ALE で受信/受け入れレイヤー (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 または FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) を承認するコールアウトを登録します。また、トランスポート レイヤー (FWPS_LAYER_XXX_TRANSPORT_V4 or _V6) も承認します。
内部 Windows IPsec 処理との干渉を防ぐには、FWPM_SUBLAYER_UNIVERSALよりも重みが低いサブレイヤーにコールアウトを登録します。 FwpmSubLayerEnum0 関数を使用して、サブレイヤーの重みを見つけます。 この関数の詳細については、Microsoft Windows SDK の Windows フィルタリング プラットフォームの ドキュメントを参照してください。
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 条件フラグを置き換えます。
内部 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; }IPsec で保護されたパケットが復号化され、トランスポート 層で検証されると、AH/ESP ヘッダーは IP ヘッダーに残ります。 このようなパケットを TCP/IP スタックに戻す必要がある場合は、AH/ESP ヘッダーを削除するために IP ヘッダーを再構築する必要があります。 Windows Vista SP1 および Windows Server 2008 以降では、パケットを複製し、複製されたパケットの IP ヘッダー サイズに headerIncludeHeaderSize パラメーターを設定した FwpsConstructIpHeaderForTransportPacket0 関数を呼び出すことでこれを実行できます。
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 構造体のデータ長を取得することで、正しい長さを取得できます。