Compartir a través de


Inspección de flujos

Inspección de flujos insertados

Los modificadores de secuencia insertados pueden editar los datos de flujo al permitir o bloquear una parte de los datos indicados estableciendo el valor del miembro countBytesEnforced de la estructura FWPS_STREAM_CALLOUT_IO_PACKET0 a medida que devuelven FWP_ACTION_PERMIT o FWP_ACTION_BLOCK desde la función de llamada classifyFn . También pueden llamar a la función FwpsStreamInjectAsync0 para agregar contenido nuevo a la secuencia. Este contenido puede ser nuevo o puede reemplazar los datos bloqueados.

Para reemplazar un patrón que se encuentra en medio de un segmento indicado (por ejemplo, n bytes seguidos de un patrón de bytes p seguidos de m bytes), la llamada seguiría estos pasos:

  1. Se llama a la función classifyFn de la llamada mediante n + p + m bytes.

  2. La llamada devuelve FWP_ACTION_PERMIT con el miembro countBytesEnforced establecido en n.

  3. La función classifyFn de la llamada se llama de nuevo con p + m bytes. EL PMA llamará a classifyFn de nuevo si countBytesEnforced es menor que la cantidad indicada.

  4. Desde la función classifyFn , la llamada llama a la función FwpsStreamInjectAsync0 para insertar el patrón de reemplazo p'. A continuación, la llamada devuelve FWP_ACTION_BLOCK con countBytesEnforced establecido en p.

  5. La función classifyFn de la llamada se llama de nuevo con m bytes.

  6. La llamada devuelve FWP_ACTION_PERMIT con countBytesEnforced establecido en m.

Si los datos indicados no son suficientes para que la llamada tome una decisión de inspección, puede establecer el miembro streamAction de la estructura de FWPS_STREAM_CALLOUT_IO_PACKET0en FWPS_STREAM_ACTION_NEED_MORE_DATA y establecer el miembro countBytesRequired en la cantidad mínima que debe acumular EL PMA antes de que se indiquen de nuevo los datos. Cuando se establece streamAction , la llamada debe devolver FWP_ACTION_NONE de la función classifyFn .

EL PMA puede acumular hasta 8 MB de datos de flujo cuando se establece FWPS_STREAM_ACTION_NEED_MORE_DATA . EL PMA establecerá la marca FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED cuando llame a la función classifyFn de la llamada y se agote el espacio de búfer. Cuando se establece la última marca, la llamada debe aceptar los datos indicados en su totalidad. Una llamada no debe devolver FWPS_STREAM_ACTION_NEED_MORE_DATA cuando se establece la marca FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA .

Para mayor comodidad de poder examinar un patrón de secuencia desde un búfer plano, EL PMA proporciona la función de utilidad FwpsCopyStreamDataToBuffer0 , que puede copiar los datos de flujo indicados en un búfer contiguo.

Inspección de flujos fuera de banda

Para la inspección o modificación fuera de banda, una llamada de secuencia seguiría el patrón similar que la llamada de inspección de paquetes: primero clonaría todos los segmentos de flujo indicados para el procesamiento diferido y, a continuación, bloquearía esos segmentos. Los datos inspeccionados o modificados se insertan más adelante en el flujo de datos. Al insertar datos fuera de banda, la llamada debe devolver FWP_ACTION_BLOCK en todos los segmentos indicados para garantizar la integridad de la secuencia resultante. Un módulo de inspección fuera de banda no debe insertar arbitrariamente un FIN (que indica que no hay más datos del remitente) en un flujo de datos saliente. Si el módulo debe quitar la conexión, su función de llamada classifyFn debe establecer el miembro streamAction de la estructura de FWPS_STREAM_CALLOUT_IO_PACKET0en FWPS_STREAM_ACTION_DROP_CONNECTION.

Nota Se trata de una infracción del contrato para que las llamadas cambien de fuera de banda a insertada y pueden provocar comportamientos inesperados. Asegúrese de que las llamadas fuera de banda cumplen cada uno de los criterios especificados.

Dado que los datos de flujo se pueden indicar como una cadena de NET_BUFFER_LIST , FWP proporciona las funciones de utilidad FwpsCloneStreamData0 y FwpsDiscardClonedStreamData0 que funcionan en cadenas de listas de búferes netos.

EL PMA también admite la limitación de datos de transmisión para la dirección entrante. Si una llamada no puede seguir el ritmo de la velocidad de datos entrante, puede devolver FWPS_STREAM_ACTION_DEFER para "pausar" la secuencia. La secuencia se puede "reanudar" llamando a la función FwpsStreamContinue0 . Aplazar una secuencia con esta función hace que la pila TCP/IP detenga el procesamiento de datos entrantes de ACK. Esto hace que la ventana deslizante tcp disminuya hacia 0.

Para las llamadas de inspección de flujos fuera de banda, no se debe llamar a FwpsStreamContinue0 mientras se llama a la función FwpsStreamInjectAsync0 .

Los datos de flujo insertados no se volverán a indicar a la llamada, pero estarán disponibles para transmitir llamadas de subcapas de menor peso.

El ejemplo de edición de flujo de plataforma de filtrado de Windows en el repositorio de ejemplos de controladores de Windows en GitHub muestra cómo realizar la edición insertada y fuera de banda en la capa de secuencia.

Nota Windows Server 2008 y versiones posteriores no admiten la eliminación de un filtro de secuencia durante los siguientes procesos:

  • La llamada está realizando la inserción de paquetes fuera de banda.

  • La llamada solicita más datos estableciendo el miembro streamAction de la estructura de FWPS_STREAM_CALLOUT_IO_PACKET0en FWPS_STREAM_ACTION_NEED_MORE_DATA.

  • La llamada aplaza una secuencia estableciendo el miembro streamAction de la estructura de FWPS_STREAM_CALLOUT_IO_PACKET0en FWPS_STREAM_ACTION_DEFER.

Inspección dinámica de flujos

Windows 7 y versiones posteriores admiten inspecciones dinámicas de flujos. Una inspección dinámica de flujos funciona en un flujo de datos de flujo existente, en lugar de crear y anular uno nuevo. Un controlador de llamada que pueda realizar inspecciones dinámicas de flujo debe establecer la marca FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION en el miembro Flags de la estructura FWPS_CALLOUT1 o FWPS_CALLOUT2 .

Evitar inspecciones innecesarias

Para realizar inspecciones de flujo solo en conexiones en las que está interesado el controlador, una llamada puede establecer la marca FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW en el miembro Flags de la estructura FWPS_CALLOUT0 . Esta llamada se omitirá en todas las demás conexiones. El rendimiento se mejorará y el controlador no tendrá que mantener datos de estado innecesarios.

Modelo de cascada de capa de flujo

La capa de flujo en EL PMA sigue un modelo de cascada estricto; es decir, se permitirá que una llamada de esta capa inspeccione un segmento de flujo solo si la llamada anterior (si existe) la permitió explícitamente. Si una llamada bloquea un segmento indicado, ese segmento se quita permanentemente de la secuencia y no se permitirá que las llamadas lo inspeccionen.

Además:

  1. Cada llamada que no sea inspeccionada en la capa de secuencia debe asignar explícitamente un valor al miembro actionType del parámetro classifyOut , independientemente de qué valor se haya establecido previamente en ese parámetro.
  2. La marca FWPS_RIGHT_ACTION_WRITE en el miembro de derechos del parámetro classifyOut no tiene importancia en la capa de flujo del PMA. Las llamadas en esta capa no deben comprobar la presencia de esta marca. Las llamadas pueden procesar el parámetro layerData indicado independientemente del valor de classifyOut-rights>.