Delen via


Het ontwikkelen van stuurprogramma's voor IPsec-Compatible callouts

Lagen die compatibel zijn met IPsec

Om volledig compatibel te zijn met de Windows-implementatie van IPsec die begint met Windows Vista en Windows Server 2008, moet een bijschriftstuurprogramma worden geregistreerd bij een van de volgende runtimefilterlagen:

TCP-pakketfiltering
Streamlagen:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

filtering van niet-TCP- en niet-fout-ICMP-pakketten
Datagram-Datalagen:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAAG_DATAGRAM_GEGEVENS_V4_VERWERP

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

Behalve in het geval dat binnenkomende pakketten opnieuw moeten worden opgebouwd voordat ze ontvangen-geïnjecteerd worden vanuit een datagram-gegevenslaag, zijn callout-stuurprogramma's die bij deze gegevenslagen zijn geregistreerd compatibel met IPsec.

Lagen die niet compatibel zijn met IPsec

Netwerk- en doorstuurlagen zijn niet compatibel met IPsec omdat op deze lagen IPsec-verkeer nog niet is ontsleuteld of geverifieerd. IPsec-beleid wordt afgedwongen op de transportlaag, die plaatsvindt na een netwerklaag-classificatiebewerking.

De volgende runtimefilterlagen zijn niet compatibel met IPsec, omdat IPsec-verwerking in Windows plaatsvindt onder de volgende lagen:

FWPS_LAYER_INBOUND_IPPACKET_V4

FWPS_LAYER_INBOUND_IPPACKET_V6

FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD

FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD (Binnenkomend IP-pakket V6 Verwerpen)

FWPS_LAYER_OUTBOUND_IPPACKET_V4

FWPS_LAYER_OUTBOUND_IPPACKET_V6

FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD

FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD (Uitgaande IP-pakket V6 Verworpen)

Speciale overwegingen voor transportlagen

Om een stuurprogramma te maken dat is geregistreerd bij een transportlaag (FWPS_LAYER_XXX_TRANSPORT_V4 of _V6) en compatibel is met IPsec, volgt u deze richtlijnen:

  1. Registreer de callout bij ALE-autorisatie ontvangen/accepteren lagen (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 of FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) naast de transportlagen (FWPS_LAYER_XXX_TRANSPORT_V4 of _V6).

  2. Om interferentie met interne Windows IPsec-verwerking te voorkomen, registreert u de callout bij een sublaag met een lager gewicht dan FWPM_SUBLAYER_UNIVERSAL. Gebruik de functie FwpmSubLayerEnum0 om het gewicht van de sublaag te bepalen. Zie de documentatie Windows Filtering Platform in de Microsoft Windows SDK voor meer informatie over deze functie.

  3. Een binnenkomend transportpakket waarvoor ALE-classificatie is vereist, moet worden geïnspecteerd bij de ALE-autorisatielagen voor ontvangst/accepteren (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 of FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Een dergelijk pakket moet worden toegestaan vanuit binnenkomende transportlagen. Gebruik vanaf Windows Vista met Service Pack 1 (SP1) en Windows Server 2008 de FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED metadata-vlag om te bepalen of het binnenkomende pakket aangegeven zal worden aan de FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 en FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 filterlagen. Deze metagegevensvlag vervangt de FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY voorwaardevlag die is gebruikt in Windows Vista.

  4. Om interferentie met interne Windows IPsec-verwerking te voorkomen, onderschept u IPsec-tunnelmodusverkeer niet op transportlagen als het IPsec-verkeer nog niet is gedetunneld. In het volgende codevoorbeeld ziet u hoe u dergelijke pakketten kunt omzeilen.

    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. Nadat een met IPsec beveiligd pakket is ontsleuteld en geverifieerd op de transportlaag, blijft de AH/ESP-header in de IP-header. Als een dergelijk pakket opnieuw moet worden geïnjecteerd in de TCP/IP-stack, moet de IP-header opnieuw worden opgebouwd om de AH/ESP-header te verwijderen. Vanaf Windows Vista met SP1 en Windows Server 2008 kunt u dit doen door het pakket te klonen en de FwpsConstructIpHeaderForTransportPacket0-functie aan te roepen met de headerIncludeHeaderSize parameter ingesteld op de IP-headergrootte van het gekloonde pakket.

  6. Bij de ALE-ontvang-/acceptlaag kan een callout IPsec-beveiligd verkeer detecteren door te controleren of de vlag FWP_CONDITION_FLAG_IS_IPSEC_SECURED is ingesteld. Bij transportlagen kan een call-out IPsec-beveiligd verkeer detecteren door de functie FwpsGetPacketListSecurityInformation0 aan te roepen en te controleren of de vlag FWPS_PACKET_LIST_INFORMATION0 is ingesteld in de parameter queryFlags.

Werken met IPsec ESP-pakketten

Wanneer de engine aangeeft dat ESP-pakketten (Encapsulating Security Payload) zijn ontsleuteld, worden ze ingekort om overtollige ESP-gegevens uit te sluiten. Vanwege de manier waarop de engine dergelijke pakketten verwerkt, weerspiegelen de MDL-gegevens in de NET_BUFFER-structuur niet de juiste pakketlengte. De juiste lengte kan worden verkregen met behulp van de NET_BUFFER_DATA_LENGTH macro om de gegevenslengte van de NET_BUFFER structuur op te halen.