共用方式為


開發 IPsec-Compatible 標註驅動程式

與 IPsec 相容的圖層

若要完全相容於從 Windows Vista 和 Windows Server 2008 開始的 IPsec 實作,應該在下列其中一個執行階段篩選層註冊擴充程序驅動程式:

TCP 封包篩選
串流層:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

非 TCP 和非錯誤 ICMP 封包篩選
Datagram-Data 層:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS層〔DATAGRAM數據V6〕

  • FWPS_LAYER_DATAGRAM_DATA_V4_丟棄

  • 不改變原翻譯,保留為 FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

除了從數據報數據層接收並注入封包之前必須重建封包的情況外,註冊在這些數據層的 Callout 驅動程式與 IPsec 相容。

與 IPsec 不相容的圖層

網路和轉送層與 IPsec 不相容,因為在這些層 IPsec 流量尚未解密或驗證。 IPsec 原則會在傳輸層強制執行,這會在網路層分類作業之後發生。

下列運行時間篩選層與 IPsec 不相容,因為 Windows 中的 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. 除了在傳輸層(FWPS_LAYER_XXX_TRANSPORT_V4 或 _V6)之外,還需要在 ALE 呼叫層註冊接收/接受授權層(FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6)。

  2. 若要防止對內部 Windows IPsec 處理的干擾,請在優先順序低於 FWPM_SUBLAYER_UNIVERSAL的子層註冊呼叫。 使用 FwpmSubLayerEnum0 函式來尋找子圖層的權數。 如需此函式的相關信息,請參閱 Microsoft Windows SDK 中的 Windows 篩選平臺 檔。

  3. 必須在 ALE 授權接收/接受層(FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6)檢查需要 ALE 分類的傳入傳輸資料包。 必須允許這類資料包從外部傳輸層進入。 從 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 堆棧,則必須重建 IP 標頭以移除 AH/ESP 標頭。 從 Windows Vista SP1 和 Windows Server 2008 開始,您可以複製封包並呼叫 FwpsConstructIpHeaderForTransportPacket0 函式,其具有 標頭IncludeHeaderSize 參數設定為複製封包的 IP 標頭大小。

  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 結構的數據長度,以取得正確長度。