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:
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).
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.
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.
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; }
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.
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.