Partager via


Développement de pilotes IPsec-Compatible Callout

Couches compatibles avec IPsec

pour être entièrement compatible avec l’implémentation Windows d’IPsec qui commence par Windows Vista et Windows Server 2008, un pilote de légende doit être inscrit sur l’une des couches de filtrage d’exécution suivantes :

Filtrage de paquets TCP
Couches de flux :

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

Filtrage de paquets ICMP non-TCP et non-erreur
Couches Datagram-Data :

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

Sauf dans le cas où les paquets entrants doivent être reconstruits avant d’être reçus (injectés à partir d’une couche de données de datagramme), les pilotes de légende inscrits sur ces couches de données sont compatibles avec IPsec.

Couches incompatibles avec IPsec

Les couches réseau et de transfert sont incompatibles avec IPsec, car au niveau de ces couches le trafic IPsec n’a pas encore été déchiffré ou vérifié. Les stratégies IPsec sont appliquées au niveau de la couche de transport, qui se produit après une opération de classification de la couche réseau.

les couches de filtrage au moment de l’exécution suivantes sont incompatibles avec ipsec, car le traitement ipsec dans Windows se produit sous les couches suivantes :

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

Considérations spéciales relatives aux couches de transport

Pour faire en sorte qu’un pilote de légende inscrit auprès d’une couche de transport (FWPS_LAYER_XXX_TRANSPORT_V4 ou _V6) soit compatible avec IPSec, suivez ces instructions :

  1. Inscrire la légende à ALE autoriser les couches de réception/acceptation (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 ou FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) en plus des couches de transport (FWPS_LAYER_xxx_TRANSPORT_V4 ou _V6).

  2. pour éviter toute interférence avec le traitement interne Windows IPsec, inscrivez la légende au niveau d’une sous-couche dont le poids est inférieur à FWPM_SUBLAYER_UNIVERSAL. Utilisez la fonction FwpmSubLayerEnum0 pour Rechercher l’épaisseur de la sous-couche. pour plus d’informations sur cette fonction, consultez la documentation sur la plateforme de filtrage Windows dans le Microsoft Windows SDK.

  3. Un paquet de transport entrant nécessitant une classification ALE doit être inspecté aux couches de réception/acceptation de l’autorisation ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 ou FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Ce paquet doit être autorisé à partir des couches de transport entrantes. à partir de Windows Vista avec Service Pack 1 (SP1) et Windows Server 2008, utilisez l’indicateur de métadonnées FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED pour déterminer si le paquet entrant doit être indiqué au FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 et FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 couches de filtrage. cet indicateur de métadonnées remplace l’indicateur de CONDITION FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY qui a été utilisé dans Windows Vista.

  4. pour éviter les interférences avec le traitement interne Windows ipsec, n’interceptez pas le trafic en mode tunnel ipsec sur les couches de transport si le trafic ipsec n’est pas encore détunnelé. L’exemple de code suivant montre comment contourner ces paquets.

    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. Une fois qu’un paquet protégé par IPsec est déchiffré et vérifié au niveau de la couche de transport, l’en-tête AH/ESP reste dans l’en-tête IP. Si un tel paquet doit être reinjecté dans la pile TCP/IP, l’en-tête IP doit être reconstruit pour supprimer l’en-tête AH/ESP. à partir de Windows Vista avec SP1 et Windows Server 2008, vous pouvez le faire en clonant le paquet et en appelant la fonction FwpsConstructIpHeaderForTransportPacket0 dont le paramètre headerIncludeHeaderSize est défini sur la taille d’en-tête IP du paquet cloné.

  6. Au niveau de la couche de réception/acceptation ALE, une légende peut détecter le trafic protégé par IPsec en vérifiant si l’indicateur de FWP_CONDITION_FLAG_IS_IPSEC_SECURED est défini. Au niveau des couches de transport, une légende peut détecter le trafic protégé par IPsec en appelant la fonction FwpsGetPacketListSecurityInformation0 et en vérifiant si l’indicateur de FWPS_PACKET_LIST_INFORMATION0 est défini dans le paramètre queryFlags .

Utilisation des paquets IPsec ESP

Lorsque le moteur indique des paquets ESP (Encapsulating Security Payload) chiffrés, il les tronque pour exclure les données ESP de fin. En raison de la façon dont le moteur gère ces paquets, les données MDL dans la structure NET_BUFFER ne reflètent pas la longueur de paquet correcte. La longueur correcte peut être obtenue à l’aide de la macro NET_BUFFER_DATA_LENGTH pour récupérer la longueur des données de la structure NET_BUFFER .