Compartilhar via


Desenvolvendo drivers de texto explicativo 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 texto explicativo deve ser registrado em uma 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 não erro
Datagram-Data Camadas:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

Exceto para o caso em que os pacotes de entrada devem ser recriados antes de serem injetados de uma camada de dados de datagram, os drivers de texto explicativo registrados nessas camadas de dados são compatíveis com o IPsec.

Camadas 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 políticas IPsec são impostas na camada de transporte, 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 IPsec no Windows ocorre abaixo das seguintes camadas:

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

Considerações especiais para camadas de transporte

Para tornar um driver de texto explicativo registrado com uma camada de transporte (FWPS_LAYER_XXX_TRANSPORT_V4 ou _V6) compatível com IPsec, siga estas diretrizes:

  1. Registre o texto explicativo em ALE autorizar camadas de recebimento/aceitação (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 ou FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) além de camadas de transporte (FWPS_LAYER_XXX_TRANSPORT_V4 ou _V6).

  2. Para evitar interferência com o processamento interno do Windows IPsec, registre o texto explicativo em uma subcaminha que tenha um peso menor do que FWPM_SUBLAYER_UNIVERSAL. Use a função FwpmSubLayerEnum0 para localizar o peso do subcaminho. Para obter informações sobre essa função, consulte a documentação da Plataforma de Filtragem do Windows no SDK do Microsoft Windows.

  3. Um pacote de transporte de entrada que requer classificação ALE deve ser inspecionado nas camadas de recebimento/aceitação autorizadas do ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 ou FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Esse pacote deve ser permitido de camadas de transporte de entrada. A partir do Windows Vista com o Service Pack 1 (SP1) e o 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 de 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 usado no Windows Vista.

  4. Para evitar a interferência com o processamento interno do Windows IPsec, não intercepte o tráfego do modo de túnel IPsec em camadas de transporte se o tráfego IPsec ainda não estiver desativado. 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 for descriptografado e verificado na camada de transporte, o cabeçalho AH/ESP permanecerá no cabeçalho IP. Se esse pacote precisar ser reinjetado novamente na pilha TCP/IP, o cabeçalho IP deverá ser recriado para remover o cabeçalho AH/ESP. A partir do Windows Vista com o SP1 e o 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 recebimento/aceitação da ALE, um texto explicativo pode detectar o tráfego protegido por IPsec verificando se o sinalizador de FWP_CONDITION_FLAG_IS_IPSEC_SECURED está definido. Em camadas de transporte, um texto explicativo pode detectar o 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 mecanismo indica pacotes ESP (encapsulamento encapsulado de conteúdo de segurança) descriptografados, ele os trunca para excluir dados ESP à direita. 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 dos dados da estrutura NET_BUFFER .