開發IPsec-Compatible注標驅動程式
與 IPsec 相容的層
若要與從 Windows Vista 和 Windows Server 2008 開始的 IPsec Windows 實作完全相容,圖說文字驅動程式應該在下列其中一個執行時間篩選層註冊:
FWPS_LAYER_STREAM_V4
FWPS_LAYER_STREAM_V6
非 TCP 和非錯誤 ICMP 封包篩選
Datagram-Data層:
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 原則會在傳輸層強制執行,這會在網路層分類作業之後發生。
下列執行時間篩選層與 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或與 IPsec 相容_V6) ,請遵循下列指導方針:
除了傳輸層 (FWPS_LAYER_XXX之外,在 ALE 授權接收/接受層 (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4或FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) 註冊圖說文字_TRANSPORT_V4或_V6) 。
若要避免干擾內部 Windows IPsec 處理,請在重量低於FWPM_SUBLAYER_UNIVERSAL的子層註冊圖說 文字。 使用 FwpmSubLayerEnum0 函式來尋找子圖層的權數。 如需此函式的相關資訊,請參閱Microsoft Windows SDK中的Windows 篩選平台檔。
必須在 ALE 授權接收/接受層 (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4或 FWPS_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_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 堆疊,則必須重建 IP 標頭以移除 AH/ESP 標頭。 從 WINDOWS Vista SP1 和 Windows Server 2008 開始,您可以複製封包並呼叫 FwpsConstructIpHeaderForTransportPacket0 函式,其 headerIncludeHeaderSize 參數設定為複製封包的 IP 標頭大小。
在 ALE 接收/接受層,圖說文字可以藉由檢查是否已設定 FWP_CONDITION_FLAG_IS_IPSEC_SECURED 旗標來偵測受 IPsec 保護的流量。 在傳輸層,圖說文字可以呼叫FwpsGetPacketListSecurityInformation0函式,並檢查查詢Flags參數中是否已設定FWPS_PACKET_LIST_INFORMATION0旗標,來偵測受 IPsec 保護的流量。
使用 IPsec ESP 封包
當引擎指出封裝安全性承載 (ESP) 封包時,它會將其截斷,以排除尾端 ESP 資料。 由於引擎處理這類封包的方式, NET_BUFFER 結構中的 MDL 資料不會反映正確的封包長度。 您可以使用 NET_BUFFER_DATA_LENGTH 宏來擷取 NET_BUFFER 結構的資料長度,以取得正確的長度。