Udostępnij przez


Opracowywanie sterowników wywołania IPsec-Compatible

Warstwy kompatybilne z IPsec

Aby zapewnić pełną zgodność z implementacją protokołu IPsec systemu Windows rozpoczynającą się od systemów Windows Vista i Windows Server 2008, należy zarejestrować sterownik wywołań w jednej z następujących warstw filtrowania wykonywanego czasu:

filtrowanie pakietów TCP
Warstwy strumienia:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

Filtrowanie pakietów ICMP, które nie są TCP i nie zawierają błędów
warstwy Datagram-Data:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAYER_DATAGRAM_DATA_V4_ODRZUCENIE

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

Z wyjątkiem przypadku, gdy pakiety przychodzące muszą zostać odtworzone przed ich wstrzyknięciem do warstwy danych datagramu, sterowniki wywołań zarejestrowane w tych warstwach danych są zgodne z protokołem IPsec.

Warstwy niezgodne z protokołem IPsec

Warstwy sieciowe i przekazywania są niezgodne z protokołem IPsec, ponieważ na tych warstwach ruch IPsec nie został jeszcze odszyfrowany ani zweryfikowany. Zasady protokołu IPsec są wymuszane w warstwie transportu, która występuje po operacji klasyfikowania warstwy sieciowej.

Następujące warstwy filtrowania w czasie wykonywania są niezgodne z protokołem IPsec, ponieważ przetwarzanie protokołu IPsec w systemie Windows występuje poniżej następujących warstw:

FWPS_LAYER_INBOUND_IPPACKET_V4

FWPS_LAYER_INBOUND_IPPACKET_V6

FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD

Warstwa_Odwrócona_IP_Pakiet_W_V6_Odrzuć

FWPS_LAYER_OUTBOUND_IPPACKET_V4

FWPS_LAYER_OUTBOUND_IPPACKET_V6

FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD

FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD

Specjalne zagadnienia dotyczące warstw transportu

Aby utworzyć sterownik wywołań zwrotnych zarejestrowany w warstwie transportowej (FWPS_LAYER_XXX_TRANSPORT_V4 lub _V6) zgodny z protokołem IPsec, postępuj zgodnie z następującymi wytycznymi:

  1. Zarejestruj zgłoszenie w warstwach autoryzacyjnych odbioru/akceptacji ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 lub FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) oraz w warstwach transportowych (FWPS_LAYER_XXX_TRANSPORT_V4 lub _V6).

  2. Aby zapobiec ingerencji w wewnętrzne przetwarzanie IPsec systemu Windows, zarejestruj objaśnienie w podwarstwowej warstwie, która ma niższą wagę niż FWPM_SUBLAYER_UNIVERSAL. Użyj funkcji FwpmSubLayerEnum0, aby znaleźć wagę nakładki podrzędnej. Aby uzyskać informacje na temat tej funkcji, zobacz dokumentację Platforma filtrowania systemu Windows w zestawie Microsoft Windows SDK.

  3. Przychodzący pakiet danych, który wymaga klasyfikacji ALE, musi być sprawdzany na warstwach autoryzacji odbioru/akceptacji ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 lub FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Taki pakiet musi być dozwolony na przychodzących warstwach transportowych. Począwszy od systemu Windows Vista z dodatkiem Service Pack 1 (SP1) i Windows Server 2008, użyj flagi metadanych FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED, aby określić, czy pakiet przychodzący będzie wskazywany do warstw filtrowania FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 i FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6. Ta flaga metadanych zastępuje flagę warunku FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY używaną w systemie Windows Vista.

  4. Aby zapobiec ingerencji w wewnętrzne przetwarzanie IPsec systemu Windows, nie przechwytuj ruchu IPsec w trybie tunelu na warstwach transportowych, jeśli ruch ten nie został jeszcze odtunelowany. Poniższy przykład kodu pokazuje, jak pominąć takie pakiety.

    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. Po odszyfrowaniu i zweryfikowaniu pakietu chronionego przez protokół IPsec w warstwie transportu nagłówek AH/ESP pozostaje w nagłówku adresu IP. Jeśli taki pakiet musi zostać ponownie przywrócony do stosu TCP/IP, należy ponownie skompilować nagłówek IP, aby usunąć nagłówek AH/ESP. Począwszy od systemu Windows Vista z dodatkiem SP1 i Windows Server 2008, można to zrobić, klonując pakiet i wywołując FwpsConstructIpHeaderForTransportPacket0 funkcji, która ma headerIncludeHeaderSize ustawiony na rozmiar nagłówka IP sklonowanego pakietu.

  6. W warstwie odbierania/akceptowania ALE, wywołanie może wykryć ruch chroniony przez protokół IPsec, sprawdzając, czy flaga FWP_CONDITION_FLAG_IS_IPSEC_SECURED jest ustawiona. W warstwach transportu wywołanie może wykrywać ruch chroniony przez IPsec poprzez wywołanie funkcji FwpsGetPacketListSecurityInformation0 i sprawdzenie, czy flaga FWPS_PACKET_LIST_INFORMATION0 jest ustawiona w parametrze queryFlags.

Praca z pakietami ESP w protokole IPsec

Gdy silnik wskazuje odszyfrowane kapsułkowane pakiety ładunku zabezpieczeń (ESP), obcina je, aby usunąć końcowe dane ESP. Ze względu na sposób, w jaki aparat obsługuje takie pakiety, dane MDL w strukturze NET_BUFFER nie odzwierciedlają prawidłowej długości pakietu. Prawidłową długość można uzyskać przy użyciu makra NET_BUFFER_DATA_LENGTH w celu pobrania długości danych struktury NET_BUFFER.