Partilhar via


Desenvolvimento de drivers de chamada IPsec-Compatible

Camadas compatíveis com IPsec

Para ser totalmente compatível com a implementação do Windows do IPsec que começa com o Windows Vista e o Windows Server 2008, um driver de callout deve ser registado numa das seguintes camadas de filtragem em tempo de execução:

Filtragem de Pacotes TCP
Camadas de fluxo:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

Filtragem de pacotes ICMP não TCP e sem erro
Datagram-Data camadas:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_CAMADA_DADOS_GRAMA_DATAGRAMAS_V4_DESCARTAR

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

Exceto no caso em que os pacotes de entrada devem ser reconstruídos antes de serem injetados a partir de uma camada de dados de datagrama, os drivers de chamada registrados nessas camadas de dados são compatíveis com o IPsec.

As camadas que são incompatíveis com IPsec

As camadas de rede e encaminhamento são incompatíveis com o IPsec porque nessas camadas o tráfego IPsec ainda não foi descriptografado ou verificado. As diretivas IPsec são impostas na camada de transporte, o que ocorre após uma operação de classificação de camada de rede.

As seguintes camadas de filtragem em tempo de execução são incompatíveis com o IPsec porque o processamento de IPsec no Windows ocorre abaixo das seguintes camadas:

FWPS_LAYER_INBOUND_IPPACKET_V4

FWPS_LAYER_INBOUND_IPPACKET_V6

FWPS_CAMADA_DESCARTE_PACOTE_IP_V4_ENTRADA

CAMADA_FWPS_PACOTE_IP_ENTRADA_V6_DESCARTAR

FWPS_LAYER_OUTBOUND_IPPACKET_V4

FWPS_LAYER_OUTBOUND_IPPACKET_V6

Camada de Descarte de Pacote de Saída IPv4 do FWPS

FWPS_CAMADA_DESCARTE_PACOTE_IP_V6_SAÍDA

Considerações especiais para camadas de transporte

Para tornar um driver de chamada registado com uma camada de transporte (FWPS_LAYER_XXX_TRANSPORT_V4 ou _V6) compatível com IPsec, siga as seguintes diretrizes:

  1. Registe o callout nas camadas de autorização de receção/aceitação ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 ou FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6), além das camadas de transporte (FWPS_LAYER_XXX_TRANSPORT_V4 ou _V6).

  2. Para evitar interferência com o processamento interno de IPsec do Windows, registe a chamada em uma subcamada que tenha um peso inferior a FWPM_SUBLAYER_UNIVERSAL. Use a função FwpmSubLayerEnum0 para localizar o peso da subcamada. Para obter informações sobre essa função, consulte a documentação do Windows Filtering Platform no SDK do Microsoft Windows.

  3. Um pacote de transporte de entrada que requer classificação ALE deve ser inspecionado nas camadas de autorização/aceitação ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 ou FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Esse pacote deve ser permitido a partir das camadas de transporte de entrada. A partir do Windows Vista com Service Pack 1 (SP1) e do Windows Server 2008, use o sinalizador de metadados FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED para determinar se o pacote de entrada será indicado para as camadas de filtragem FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 e FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6. Esse sinalizador de metadados substitui o sinalizador de condição FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY que foi usado no Windows Vista.

  4. Para evitar interferência com o processamento interno de IPsec do Windows, não intercete o tráfego de modo de túnel IPsec em camadas de transporte se o tráfego IPsec ainda não estiver desencapsulado. O exemplo de código a seguir mostra como ignorar esses pacotes.

    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. Depois que um pacote protegido por IPsec é descriptografado e verificado na camada de transporte, o cabeçalho AH/ESP permanece no cabeçalho IP. Se tal pacote tiver que ser reinjetado de volta na pilha TCP/IP, o cabeçalho IP deve ser reconstruído para remover o cabeçalho AH/ESP. A partir do Windows Vista com SP1 e Windows Server 2008, você pode fazer isso clonando o pacote e chamando a função FwpsConstructIpHeaderForTransportPacket0 que tem o parâmetro headerIncludeHeaderSize definido como o tamanho do cabeçalho IP do pacote clonado.

  6. Na camada de recepção/aceitação do ALE, uma função pode detetar tráfego protegido por IPsec verificando se o sinalizador FWP_CONDITION_FLAG_IS_IPSEC_SECURED está definido. Nas camadas de transporte, um callout pode detetar tráfego protegido por IPsec chamando a função FwpsGetPacketListSecurityInformation0 e verificando se o sinalizador FWPS_PACKET_LIST_INFORMATION0 está definido no parâmetro queryFlags.

Trabalhando com pacotes ESP IPsec

Quando o motor indica pacotes descriptografados da carga útil de segurança de encapsulamento (ESP), ele os trunca para excluir dados ESP adicionais. Devido à maneira como o mecanismo lida com esses pacotes, os dados MDL na estrutura NET_BUFFER não refletem o comprimento correto do pacote. O comprimento correto pode ser obtido usando a macro NET_BUFFER_DATA_LENGTH para recuperar o comprimento de dados da estrutura NET_BUFFER.