Funcionalidad de módulos y subprocesos en suricata
Hay que aclarar la relación entre tv, slot y tm en suricata.
Encuentra las definiciones de estas tres funciones en el código fuente.
En threadvars.h, ThreadVars está definido:
En tm-thread.h, TmSlot está definido:
En tm-modules.h, define el Módulo Tm. h:
La relación entre los tres se muestra en la siguiente figura:
Cada hilo contiene una lista de ranuras encadenadas y cada nodo de ranura contiene un módulo diferente. El programa recorre la lista de cadenas de ranuras y ejecuta los módulos en el orden en que fueron agregados.
La función SuricataMain comienza con la función InitGlobal, que llama a la función RunModeRegisterRunModes. Podemos encontrar la definición de esta función:
Cada modo de ejecución llamará a RunModeRegisterNewRunMode para registrar el modo personalizado correspondiente. . Por ejemplo:
Función RunModeFilePcapRegister:
La función RunModeRegisterNewRunMode agrega funciones de devolución de llamada (RunModeFilePcapSingle, RunModeFilePcapAutoFp) a la matriz global de modos de ejecución.
La matriz global de tipo RunModes ==runmodes== guarda el modo de ejecución y su estructura de almacenamiento es la siguiente:
Nota: esta imagen debería ser una versión anterior, y ahora Sólo hay tres modos automáticos. Definir modos: único, autofp y trabajadores.
Las estructuras RunMode y RunModes se definen de la siguiente manera:
También puede ver que Suricata trata a single, autofp y Workers como modos personalizados diferentes. Estos tres modos se describen en detalle a continuación.
Busque la definición de RegisterAllModules en suricata.c, como se muestra a continuación:
Seleccione una de las funciones registradas y ábrala:
Puede ver que el El módulo se guarda en la matriz tmm_modules del tipo de módulo TmModule.
La estructura de almacenamiento se muestra en la siguiente figura:
La función de inicialización del módulo es TmModuleRunInit, que se define de la siguiente manera:
Esta función ejecuta el módulo global función de inicialización Init().
RunModeDispatch Las funciones principales de la función RunModeDispatch son las siguientes:
La función de devolución de llamada hace principalmente estas cosas:
Primero, el diagrama de flujo en ejecución de los tres Los modos personalizados son los siguientes:
Un único subproceso de trabajo hace todo el trabajo. El primer módulo completa la captura del paquete y otros módulos lo procesan en secuencia, sin colas posteriores.
La cantidad de subprocesos de trabajo está determinada por la cantidad de NIC de escucha y la cantidad de subprocesos de captura de paquetes paralelos que se pueden habilitar por NIC. El flujo de trabajo de cada subproceso de trabajo es el mismo que el del subproceso único del modo SINGLE y no se afectarán entre sí.
Hay dos tipos de subprocesos de procesamiento de paquetes: el subproceso de recopilación de paquetes y el subproceso de detección. El hilo de recepción de paquetes y el hilo de detección pasan el paquete de datos a través de la cola de paquetes (PacketQueue) para su procesamiento. Cada subproceso de detección corresponde a una cola, y varios subprocesos de detección deben seleccionar una cola para paquetes de datos para garantizar que los paquetes de datos del mismo flujo de datos se entreguen al mismo subproceso de detección en orden.
El modo autofp es el modo personalizado más complejo y predeterminado.
Como se muestra a continuación:
Los datos se pasan principalmente en forma de parámetros entre módulos en el mismo hilo y en forma de colas compartidas entre diferentes hilos.
Cada hilo es abstraído por la estructura ThreaVars. El objeto ThreadVars especifica la cola de datos de entrada del hilo inq y la cola de datos de salida outq.
Estas colas se comparten entre varios subprocesos y la cola de salida de un subproceso puede ser la cola de entrada de otro subproceso.
[Error en la carga de la imagen... (image-3ca5b5-1627459445094)]
La línea verde muestra hacia dónde van los datos. Los paquetes se obtienen de la cola de entrada, se procesan mediante la función de ranura (función de módulo) y luego los paquetes procesados se colocan en la cola de salida.
Las tres imágenes anteriores son diagramas de flujo que se ejecutan en modo autofp.
Desde el modo "autofp" anterior, puede ver la ubicación del hilo RX y los módulos de funciones que contiene. Se utiliza principalmente para recopilar paquetes de datos, decodificar paquetes de datos y colocar los paquetes de datos procesados en la cola de recogida del siguiente módulo.
El papel del hilo RX está representado por la función del hilo TmThreadsSlotPktAcqLoop, que realiza las siguientes tareas:
Desde el modo "autofp" anterior, puede ver la ubicación del hilo W hilo y el módulo de función. Se compone principalmente del módulo FlowWorker y algunos módulos de registro, que completan principalmente la detección de datos y la salida de registros de datos específicos en formatos específicos.
El rol del hilo W está representado por la función del hilo ==TmThreadsSlotVar==, que realiza las siguientes tareas:
La función del hilo TX está en el módulo Veredicto y Módulo RespondReject basado en los resultados del módulo de detección Maneja paquetes marcados.
La línea azul indica la ruta de transmisión del paquete de datos.