Desarrollo de controladores de llamadas de IPsec-Compatible
Capas que son compatibles con IPsec
Para ser totalmente compatible con la implementación de Windows de IPsec que comienza con Windows Vista y Windows Server 2008, se debe registrar un controlador de llamada en una de las siguientes capas de filtrado en tiempo de ejecución:
Filtrado de paquetes TCP
Capas de secuencia:
FWPS_LAYER_STREAM_V4
FWPS_LAYER_STREAM_V6
Filtrado de paquetes ICMP que no son TCP y no son de error
capas de Datagram-Data:
FWPS_LAYER_DATAGRAM_DATA_V4
FWPS_LAYER_DATAGRAM_DATA_V6
FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD
FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD
Excepto en el caso en que los paquetes entrantes se deben volver a generar antes de que se inserten desde una capa de datos de datagramas, los controladores de llamada registrados en estas capas de datos son compatibles con IPsec.
Capas que no son compatibles con IPsec
Las capas de red y reenvío no son compatibles con IPsec porque en estas capas el tráfico IPsec aún no se ha descifrado o comprobado. Las directivas IPsec se aplican en la capa de transporte, que se produce después de una operación de clasificación de capa de red.
Las siguientes capas de filtrado en tiempo de ejecución no son compatibles con IPsec porque el procesamiento de IPsec en Windows se produce por debajo de las capas siguientes:
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
Consideraciones especiales para las capas de transporte
Para que un controlador de llamada que esté registrado con una capa de transporte (FWPS_LAYER_XXX_TRANSPORT_V4 o _V6) sea compatible con IPsec, siga estas instrucciones:
Registre la llamada en ALE authorize receive/accept layers (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 o FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) además de las capas de transporte (FWPS_LAYER_XXX_TRANSPORT_V4 o _V6).
Para evitar la interferencia con el procesamiento interno de IPsec de Windows, registre la llamada en una subcapa que tenga un peso menor que FWPM_SUBLAYER_UNIVERSAL. Use la función FwpmSubLayerEnum0 para encontrar el peso de la subcapa. Para obtener información sobre esta función, consulte la documentación de la Plataforma de filtrado de Windows en el Microsoft Windows SDK.
Un paquete de transporte entrante que requiera la clasificación de ALE debe inspeccionarse en las capas de recepción/aceptación de autorización de ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 o FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Este tipo de paquete debe permitirse desde las capas de transporte entrantes. A partir de Windows Vista con Service Pack 1 (SP1) y Windows Server 2008, use la marca de metadatos FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED para determinar si el paquete entrante se indicará a las capas de filtrado FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 y FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 . Esta marca de metadatos reemplaza la marca de condición FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY que se usó en Windows Vista.
Para evitar la interferencia con el procesamiento interno de IPsec de Windows, no intercepte el tráfico del modo de túnel IPsec en capas de transporte si el tráfico IPsec aún no está desajustado. En el ejemplo de código siguiente se muestra cómo omitir estos paquetes.
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; }
Después de descifrar y comprobar un paquete protegido por IPsec en la capa de transporte, el encabezado AH/ESP permanece en el encabezado IP. Si este paquete debe volver a insertarse en la pila TCP/IP, el encabezado IP debe volver a generarse para quitar el encabezado AH/ESP. A partir de Windows Vista con SP1 y Windows Server 2008, puede hacerlo clonando el paquete y llamando a la función FwpsConstructIpHeaderForTransportPacket0 que tiene el parámetro headerIncludeHeaderSize establecido en el tamaño del encabezado IP del paquete clonado.
En la capa de recepción o aceptación de ALE, una llamada puede detectar el tráfico protegido por IPsec comprobando si se ha establecido la marca de FWP_CONDITION_FLAG_IS_IPSEC_SECURED . En las capas de transporte, una llamada puede detectar el tráfico protegido por IPsec llamando a la función FwpsGetPacketListSecurityInformation0 y comprobando si la marca FWPS_PACKET_LIST_INFORMATION0 está establecida en el parámetro queryFlags .
Trabajar con paquetes ESP de IPsec
Cuando el motor indica paquetes de carga de seguridad (ESP) descifrados, los trunca para excluir los datos de ESP finales. Debido a la forma en que el motor controla estos paquetes, los datos MDL de la estructura NET_BUFFER no reflejan la longitud correcta del paquete. La longitud correcta se puede obtener mediante la macro NET_BUFFER_DATA_LENGTH para recuperar la longitud de datos de la estructura NET_BUFFER .