Entwickeln von IPsec-Compatible Legendentreibern

Mit IPsec kompatible Ebenen

Um vollständig kompatibel mit der Windows-Implementierung von IPsec zu sein, die mit Windows Vista und Windows Server 2008 beginnt, sollte ein Legendentreiber auf einer der folgenden Laufzeitfilterebenen registriert werden:

TCP-Paketfilterung
Streamebenen:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

Nicht TCP- und Fehlerfreie ICMP-Paketfilterung
Datagram-Data Ebenen:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

Mit Ausnahme des Falles, in dem eingehende Pakete neu erstellt werden müssen, bevor sie von einer Datagram-Datenebene empfangen werden, sind die auf diesen Datenebenen registrierten Legendentreiber mit IPsec kompatibel.

Mit IPsec nicht kompatible Ebenen

Netzwerk- und Weiterleitungsebenen sind mit IPsec nicht kompatibel, da auf diesen Ebenen der IPsec-Datenverkehr noch nicht entschlüsselt oder überprüft wurde. IPsec-Richtlinien werden auf der Transportschicht erzwungen, die nach einem Klassifizierungsvorgang auf Netzwerkebene erfolgt.

Die folgenden Laufzeitfilterebenen sind mit IPsec nicht kompatibel, da die IPsec-Verarbeitung in Windows unterhalb der folgenden Ebenen erfolgt:

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

Besondere Überlegungen für Transportebenen

Befolgen Sie die folgenden Richtlinien, um einen mit einer Transportschicht (FWPS_LAYER_XXX_TRANSPORT_V4 oder _V6) registrierten Legendentreiber mit IPsec kompatibel zu machen:

  1. Registrieren Sie die Beschriftung unter ALE autorisieren Empfangs-/Annahmeebenen (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 oder FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) zusätzlich zu Transportebenen (FWPS_LAYER_XXX_TRANSPORT_V4 oder _V6).

  2. Um Störungen der internen Windows-IPsec-Verarbeitung zu vermeiden, registrieren Sie die Beschriftung in einer Unterschicht, die eine geringere Gewichtung als FWPM_SUBLAYER_UNIVERSAL hat. Verwenden Sie die FwpmSubLayerEnum0-Funktion , um die Gewichtung der Teilschicht zu ermitteln. Informationen zu dieser Funktion finden Sie in der Dokumentation zur Windows-Filterplattform im Microsoft Windows SDK.

  3. Ein eingehendes Transportpaket, das eine ALE-Klassifizierung erfordert, muss auf der ALE-Autorisierungs-Empfangs-/Annahmeebene (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 oder FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) überprüft werden. Ein solches Paket muss von eingehenden Transportebenen zugelassen werden. Verwenden Sie ab Windows Vista mit Service Pack 1 (SP1) und Windows Server 2008 das FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED Metadatenflag, um zu bestimmen, ob das eingehende Paket für die FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 - und FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 Filterebenen angezeigt wird. Dieses Metadatenflag ersetzt das FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY Bedingungsflag, das in Windows Vista verwendet wurde.

  4. Um Störungen der internen Windows-IPsec-Verarbeitung zu verhindern, sollten Sie den IPsec-Tunnelmodusdatenverkehr nicht auf Transportebenen abfangen, wenn der IPsec-Datenverkehr noch nicht detunnelt ist. Das folgende Codebeispiel zeigt, wie solche Pakete umgangen werden.

    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. Nachdem ein durch IPsec geschütztes Paket entschlüsselt und auf der Transportschicht überprüft wurde, verbleibt der AH/ESP-Header im IP-Header. Wenn ein solches Paket wieder in den TCP/IP-Stapel eingefügt werden muss, muss der IP-Header neu erstellt werden, um den AH/ESP-Header zu entfernen. Ab Windows Vista mit SP1 und Windows Server 2008 können Sie dies tun, indem Sie das Paket klonen und die Funktion FwpsConstructIpHeaderForTransportPacket0 aufrufen, die den headerIncludeHeaderSize-Parameter auf die IP-Headergröße des geklonten Pakets festgelegt hat.

  6. Auf der ALE-Empfangs-/Annahmeebene kann eine Legende IPsec-geschützten Datenverkehr erkennen, indem überprüft wird, ob das flag FWP_CONDITION_FLAG_IS_IPSEC_SECURED festgelegt ist. Auf Transportebenen kann eine Legende IPsec-geschützten Datenverkehr erkennen, indem die FwpsGetPacketListSecurityInformation0-Funktion aufgerufen und überprüft wird, ob das FWPS_PACKET_LIST_INFORMATION0-Flag im queryFlags-Parameter festgelegt ist.

Arbeiten mit IPsec-ESP-Paketen

Wenn die Engine entschlüsselte ESP-Pakete (Kapselung von Sicherheitsnutzdaten) angibt, schneidet es diese ab, um nachfolgende ESP-Daten auszuschließen. Aufgrund der Art und Weise, wie die Engine solche Pakete verarbeitet, spiegeln die MDL-Daten in der NET_BUFFER-Struktur nicht die richtige Paketlänge wider. Die richtige Länge kann mithilfe des NET_BUFFER_DATA_LENGTH Makros abgerufen werden, um die Datenlänge der NET_BUFFER-Struktur abzurufen.