Разработка драйверов 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, следуйте следующим рекомендациям:
Зарегистрируйте выноску в ALE авторизации уровней приема и принятия (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 или FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) в дополнение к уровням транспорта (FWPS_LAYER_XXX_TRANSPORT_V4 или _V6).
Чтобы предотвратить вмешательство во внутреннюю обработку IPsec Windows, зарегистрируйте выноску в подслое, который имеет меньший вес , чем FWPM_SUBLAYER_UNIVERSAL. Используйте функцию FwpmSubLayerEnum0 , чтобы найти вес подслоя. Сведения об этой функции см. в документации по платформе фильтрации Windows в Microsoft Windows SDK.
Входящий транспортный пакет, требующий классификации 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.
Чтобы предотвратить вмешательство во внутреннюю обработку 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; }
После расшифровки и проверки защищенного IPsec пакета на транспортном уровне заголовок AH/ESP остается в ip-заголовке. Если такой пакет необходимо повторно отправить обратно в стек TCP/IP, заголовок IP необходимо перестроить, чтобы удалить заголовок AH/ESP. Начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008 это можно сделать, клонируя пакет и вызывая функцию FwpsConstructIpHeaderForTransportPacket0 , для параметра headerIncludeHeaderSize которого задан размер IP-заголовка клонированного пакета.
На уровне приема и принятия 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 .