Поделиться через


Разработка драйверов IPsec-Compatible Выноски

Слои, совместимые с IPsec

Чтобы обеспечить полную совместимость с реализацией IPsec в Windows, которая начинается с Windows Vista и Windows Server 2008, драйвер выноски должен быть зарегистрирован на одном из следующих уровней фильтрации во время выполнения:

Фильтрация tcp-пакетов
Потоковые слои:

  • FWPS_LAYER_STREAM_V4

  • FWPS_LAYER_STREAM_V6

Фильтрация пакетов ICMP без TCP и без ошибок
слои Datagram-Data:

  • FWPS_LAYER_DATAGRAM_DATA_V4

  • FWPS_LAYER_DATAGRAM_DATA_V6

  • FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD

  • FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD

За исключением случаев, когда входящие пакеты необходимо перестроить перед их получением и внедрением из уровня данных datagram, драйверы выносок, зарегистрированные на этих уровнях данных, совместимы с IPsec.

Слои, несовместимые с IPsec

Уровни сети и пересылки несовместимы с IPsec, так как на этих уровнях трафик IPsec еще не расшифровывается и не проверяется. Политики IPsec применяются на транспортном уровне, что происходит после операции классификации сетевого уровня.

Следующие уровни фильтрации во время выполнения несовместимы с IPsec, так как обработка IPsec в Windows выполняется ниже следующих уровней:

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

Особые аспекты для транспортных слоев

Чтобы драйвер выноски, зарегистрированный с помощью транспортного уровня (FWPS_LAYER_XXX_TRANSPORT_V4 или _V6), был совместим с IPsec, следуйте следующим рекомендациям:

  1. Зарегистрируйте выноску в ALE авторизации уровней приема и принятия (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 или FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) в дополнение к уровням транспорта (FWPS_LAYER_XXX_TRANSPORT_V4 или _V6).

  2. Чтобы предотвратить вмешательство во внутреннюю обработку IPsec Windows, зарегистрируйте выноску в подслое, который имеет меньший вес , чем FWPM_SUBLAYER_UNIVERSAL. Используйте функцию FwpmSubLayerEnum0 , чтобы найти вес подслоя. Сведения об этой функции см. в документации по платформе фильтрации Windows в Microsoft Windows SDK.

  3. Входящий транспортный пакет, требующий классификации ALE, должен проверяться на уровнях получения и принятия авторизации ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 или FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6). Такой пакет должен быть разрешен с входящих уровней транспорта. Начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008, используйте флаг метаданных FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED , чтобы определить, будет ли входящий пакет указан слоям фильтрации FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4 и FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6 . Этот флаг метаданных заменяет флаг условия FWP_CONDITION_FLAG_REQUIRES_ALE_CLASSIFY , который использовался в Windows Vista.

  4. Чтобы предотвратить вмешательство во внутреннюю обработку IPsec Windows, не перехватывайте трафик в режиме туннеля IPsec на транспортных уровнях, если трафик IPsec еще не отключен. В следующем примере кода показано, как обойти такие пакеты.

    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. После расшифровки и проверки защищенного IPsec пакета на транспортном уровне заголовок AH/ESP остается в ip-заголовке. Если такой пакет необходимо повторно отправить обратно в стек TCP/IP, заголовок IP необходимо перестроить, чтобы удалить заголовок AH/ESP. Начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008 это можно сделать, клонируя пакет и вызывая функцию FwpsConstructIpHeaderForTransportPacket0 , для параметра headerIncludeHeaderSize которого задан размер IP-заголовка клонированного пакета.

  6. На уровне приема и принятия ALE выноска может обнаружить трафик, защищенный IPsec, проверив, установлен ли флаг FWP_CONDITION_FLAG_IS_IPSEC_SECURED . На транспортных уровнях выноска может обнаруживать трафик, защищенный IPsec, вызывая функцию FwpsGetPacketListSecurityInformation0 и проверяя, задан ли флаг FWPS_PACKET_LIST_INFORMATION0 в параметре queryFlags .

Работа с пакетами ESP IPsec

Когда обработчик указывает расшифрованные инкапсулирующие пакеты полезных данных безопасности (ESP), он усекает их, чтобы исключить конечные данные ESP. Из-за того, как подсистема обрабатывает такие пакеты, данные MDL в структуре NET_BUFFER не отражают правильную длину пакета. Правильную длину можно получить с помощью макроса NET_BUFFER_DATA_LENGTH для получения длины данных структуры NET_BUFFER .