Herramienta CLI e interactiva para gestionar reglas de Suricata en Linux. Permite listar, crear, editar, eliminar, validar y monitorear reglas, con soporte para modo IDS (detección) e IPS (prevención activa).
- Suricata instalado y configurado en el sistema
- Python 3.10+
- Ejecutar con
sudo— El programa bloquea su ejecución si no se es root - Sistema operativo Linux (diseñado y probado en Debian/Ubuntu; en otros SO se advierte)
# Clonar o descargar el proyecto
git clone https://github.com/fenreitsu/FEN-IDPS.git
cd FEN-IDPS
# Instalar dependencias Python
pip install -r requirements.txt
# Dar permisos de ejecución
chmod +x fen_suri_idps.pyAntes de usar la herramienta por primera vez, debes modificar ciertos parametros en tu archivo /etc/suricata/suricata.yaml. El programa lee y modifica este archivo para cambiar entre modos IDS/IPS, por lo que debe estar correctamente configurado de base.
Busca la seccion address-groups: y modifica HOME_NET para que coincida con tu red real. Esto es critico porque Suricata interpreta el trafico segun esta configuracion.
address-groups:
HOME_NET: "[192.168.1.0/24]"
# Por defecto trae algo como "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
# Cambialo por el rango de tu red, por ejemplo:
# Si tu red es 192.168.1.x: "[192.168.1.0/24]"
# Si tu red es 10.0.0.x: "[10.0.0.0/24]"Indica donde se almacenan los archivos de reglas. La herramienta busca y gestiona reglas en este directorio.
default-rule-path: /etc/suricata/rules
# Asegurate de que esta ruta exista y tengas permisos de escrituraSi tu ruta es diferente, tambien debes actualizarla en el archivo config.yaml del proyecto (opcional, la herramienta pregunta al inicio):
general:
default_rules_path: /etc/suricata/rulesIMPORTANTE: Esta ruta debe coincidir con el default-rule-path de suricata.yaml para que la validacion (suricata -T) funcione correctamente.
Configura la interfaz por la que Suricata captura paquetes. Debe ser la interfaz real de tu sistema (no eth0 si tu interfaz se llama distinto).
af-packet:
- interface: eth0
# Puedes ver tus interfaces con: ip link show
# Comun: eth0, ens33, ens160, wlan0, etc.
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
use-mmap: yes
# En modo IPS se agrega automaticamente:
# mode: ipsIMPORTANTE: Si el programa detecta la estructura incorrecta en af-packet (por ejemplo, que este formateado como diccionario en lugar de lista), puede fallar al cambiar de modo. La estructura correcta es una lista con guiones (- interface: eth0).
Define que archivos .rules cargara Suricata al iniciar. NO agregues archivos del paquete oficial si no sabes lo que haces (emerging-threats, suricata.rules por defecto).
rule-files:
- suricata.rules # archivo base (viene con Suricata)
- custom-rules.rules # archivo personalizado (creado desde la herramienta)Ejemplo de configuracion minima recomendada:
rule-files:
- custom-rules.rulesAsi solo cargas tus reglas personalizadas, evitando falsos positivos de reglas genericas.
classification-file: /etc/suricata/classification.config
reference-config-file: /etc/suricata/reference.config- NO modifiques los archivos
.rulesque vienen con la instalacion de Suricata a menos que sepas exactamente lo que haces. - Los paquetes como
suricata-updateoemerging-threatssobreescriben estos archivos al actualizar. - Recomendacion: Crea tus propias reglas personalizadas desde la herramienta (opcion [3] o
--create). La herramienta te permite crear archivos.rulesnuevos desde el selector de archivos con la opcion[0].
- En modo IPS, el programa configura reglas
NFQUEUEen iptables para redirigir el trafico a Suricata. - Si detienes Suricata mientras hay reglas NFQUEUE activas, el trafico quedara atrapado y perderas conectividad en tu VM/maquina.
- Para recuperarte:
sudo iptables -F(elimina todas las reglas de iptables) o usa la opcion [10][3] desde el menu en modo IPS. - Las reglas NFQUEUE solo afectan a la maquina donde se ejecutan. Si usas una VM con adaptador puente, solo afecta al trafico de la VM, no al host.
- El programa bloquea la ejecucion si no se ejecuta como root. No hay opcion "continuar de todas formas".
- Ejecuta siempre:
sudo ./fen_suri_idps.py
Ejecuta el programa:
sudo ./fen_suri_idps.pyAparecera el menu principal con las siguientes opciones:
| Opcion | Descripcion |
|---|---|
[1] Listar reglas |
Muestra las reglas de un archivo .rules con paginacion y filtros |
[2] Editar regla |
Abre un archivo .rules en el editor de texto (nano, vim, code...) |
[3] Crear regla |
Formulario guiado para crear una regla Suricata paso a paso |
[4] Borrar regla |
Muestra todas las reglas por SID y permite eliminarlas o deshabilitarlas |
[5] Borrar archivos .rules |
Elimina un archivo .rules completo con doble confirmacion |
[6] Validar reglas |
Ejecuta suricata -T para verificar la sintaxis de todas las reglas |
[7] Estado/Recargar/Reiniciar |
Estado del servicio, recarga en caliente o reinicio completo |
[8] Monitor de alertas en vivo |
Muestra en tiempo real las alertas del fast.log |
[9] Monitor IPS |
Muestra solo alertas de bloqueos (reglas drop/reject) |
[10] Configurar modo IDS/IPS |
Cambia entre modo deteccion y prevencion, configura NFQUEUE |
[p]Pausar la actualizacion en vivo[c]Continuar la actualizacion[l]Limpiar la pantalla del monitor[s]Salir del monitor- Flechas/filtros para navegar entre alertas
[0]Salir del programa[b]Volver al menu anterior[?]Mostrar ayuda
Todas las funciones estan disponibles sin menu interactivo para scripting o uso rapido.
| Flag | Descripcion | Ejemplo |
|---|---|---|
--list |
Listar reglas | sudo ./fen_suri_idps.py --list |
--rule <archivo> |
Archivo .rules especifico | --rule custom.rules |
--enabled |
Solo reglas habilitadas | --list --enabled |
--disabled |
Solo reglas deshabilitadas | --list --disabled |
--search <texto> |
Buscar por texto en msg o SID | --search "eternal" |
--edit |
Editar regla por SID | --edit --sid 1000001 |
--create "<regla raw>" |
Crear regla | --create "alert http any any -> any any (msg:\"test\"; sid:1000002; rev:1;)" |
-o <archivo> |
Archivo de destino para --create | --create "..." -o custom.rules |
--delete |
Eliminar regla por SID | --delete --sid 1000001 |
--disable |
Deshabilitar regla | --disable --sid 1000001 |
--enable |
Habilitar regla | --enable --sid 1000001 |
--sid <numero> |
SID de la regla (usar con --edit, --delete, --disable, --enable) | --sid 1000001 |
--validate |
Validar reglas con suricata -T | sudo ./fen_suri_idps.py --validate |
--status |
Estado del servicio Suricata | sudo ./fen_suri_idps.py --status |
--restart |
Reiniciar servicio Suricata | sudo ./fen_suri_idps.py --restart |
--reload |
Recargar reglas en caliente | sudo ./fen_suri_idps.py --reload |
--monitor |
Monitor de alertas en vivo | sudo ./fen_suri_idps.py --monitor |
--mode [ids|ips] |
Mostrar o cambiar modo | sudo ./fen_suri_idps.py --mode ips |
--monitor-ips |
Monitor solo bloqueos drop/reject | sudo ./fen_suri_idps.py --monitor-ips |
--configure-nfqueue |
Configurar NFQUEUE para IPS | sudo ./fen_suri_idps.py --configure-nfqueue |
# Ver estado del servicio
sudo ./fen_suri_idps.py --status
# Listar todas las reglas habilitadas
sudo ./fen_suri_idps.py --list --enabled
# Crear una regla y guardarla en un archivo personalizado
sudo ./fen_suri_idps.py --create "alert http $HOME_NET any -> $EXTERNAL_NET any (msg:\"HTTP request\"; sid:1000001; rev:1;)" -o custom-rules.rules
# Cambiar a modo IPS
sudo ./fen_suri_idps.py --mode ips
# Ver bloqueos en vivo (modo IPS)
sudo ./fen_suri_idps.py --monitor-ips| Caracteristica | IDS (Deteccion) | IPS (Prevencion) |
|---|---|---|
Accion alert |
Genera alerta | Genera alerta |
Accion drop |
Se trata como alerta | Bloquea el paquete |
Accion reject |
Se trata como alerta | Bloquea + RST/ICMP |
| NFQUEUE | No necesario | Obligatorio |
| Monitoreo | --monitor |
--monitor y --monitor-ips |
| Color en monitor | Azul/cyan | Rojo (drop/reject) |
Desde el menu interactivo:
- Opcion
[10]Configurar modo operativo - Seleccionar
[1]para cambiar al otro modo - Si cambias de IPS a IDS, el programa te preguntara si deseas eliminar las reglas NFQUEUE
Desde CLI:
sudo ./fen_suri_idps.py --mode ips # Cambiar a IPS
sudo ./fen_suri_idps.py --mode ids # Cambiar a IDS
sudo ./fen_suri_idps.py --mode # Mostrar modo actualNFQUEUE es un target de iptables que envia paquetes a Suricata para que decida si bloquearlos o dejarlos pasar. Es necesario para el modo IPS.
- El programa verifica automaticamente si NFQUEUE esta disponible en tu kernel
- Se configura desde la opcion [10] o con
--configure-nfqueue - Las reglas NFQUEUE se agregan a las cadenas INPUT, FORWARD y OUTPUT de iptables
- ATENCION: Si detienes Suricata con NFQUEUE activo, el trafico queda atrapado. Para solucionarlo:
- Opcion [10][3] desde el menu (si estas en modo IPS)
- O manualmente:
sudo iptables -F
| Accion | Descripcion | IDS | IPS |
|---|---|---|---|
alert |
Genera alerta, no bloquea | Si | Si |
drop |
Bloquea el paquete silenciosamente | No (actua como alerta) | Si |
reject |
Bloquea y envia RST (TCP) o ICMP (UDP) | No (actua como alerta) | Si |
pass |
Permite el trafico (whitelisting) | Si | Si |
Importante: Crear reglas drop o reject en modo IDS no bloqueara el trafico, solo generara alertas. El bloqueo real solo ocurre en modo IPS.
fen-idps/
├── fen_suri_idps.py # Punto de entrada principal (CLI + menu interactivo)
├── requirements.txt # Dependencias Python
├── config.yaml # Configuracion del proyecto (default_rules_path, etc.)
├── .gitignore # Archivos ignorados por git
├── README.md # Este archivo
│
├── core/
│ ├── __init__.py # Paquete Python
│ ├── console.py # UI con Rich: banners, tablas, colores, confirmaciones
│ ├── models.py # Modelos de datos: Rule, RuleFile
│ ├── parser.py # Parseo de reglas Suricata desde archivos .rules
│ ├── rule_manager.py # Logica CRUD de reglas (listar, crear, toggle, borrar)
│ ├── file_selector.py # Selector interactivo de archivos .rules
│ ├── suricata_utils.py # Utilidades de Suricata: modo, NFQUEUE, YAML, servicio
│ ├── live_monitor.py # Monitor en vivo de fast.log con Rich Live
│ └── editor_detector.py # Deteccion de editores instalados (nano, vim, code, etc.)
│
├── User_folder/ # Archivos de usuario (sesiones, copias de respaldo)
└── exports/ # Exportaciones CSV generadas desde el monitor
Ejecuta con sudo. El programa no permite continuar sin permisos de root.
No hay reglas NFQUEUE activas en iptables. Esto es normal si nunca configuraste modo IPS o si ya las eliminaste.
- Verifica que Suricata este corriendo:
sudo systemctl status suricata - Verifica que el archivo
fast.logexista:ls -la /var/log/suricata/fast.log - Genera trafico de prueba:
ping 8.8.8.8ocurl http://testmyids.com
- Verifica que NFQUEUE este disponible: opcion [10][2]
- Si no esta disponible, instala iptables:
sudo apt install iptables - Asegurate de que
af-packetensuricata.yamleste formateado como lista (con guion)
Las reglas NFQUEUE quedaron atrapando el trafico. Solucion:
sudo iptables -FLuego reinicia Suricata: sudo systemctl restart suricata
- Verifica que la sintaxis de tus reglas sea correcta
- Asegurate de que
default-rule-pathensuricata.yamlcoincida con la ruta donde guardas las reglas - Revisa que los archivos referenciados en
rule-filesexistan
- Verifica que
default-rule-pathensuricata.yamlapunte al directorio correcto - Si usas una ruta personalizada, actualiza
config.yaml
Desarrollado por @Fenreitsu.