Introducción
Un firewall filtra tráfico basándose en reglas estáticas: puerto abierto o cerrado, IP permitida o bloqueada. Pero ¿qué pasa cuando el tráfico pasa el firewall y contiene un ataque encapsulado dentro de una conexión legítima? Un firewall stateful verifica que el paquete pertenezca a una sesión establecida, pero no inspecciona el contenido de esa sesión para detectar explotaciones, comandos C2 o exfiltración de datos.
Aquí es donde entra un IDS/IPS (Intrusion Detection System / Intrusion Prevention System). Mientras un firewall decide si un paquete puede pasar, un IDS analiza qué hay dentro de ese paquete: patrones maliciosos, firmas de exploits, comportamientos anómalos y secuencias de protocolo sospechosas.
Suricata es el motor de detección de intrusiones open-source más utilizado en entornos productivos. Desarrollado por la Open Information Security Foundation (OISF), soporta multihilo, procesa más de 30 protocolos de aplicación y se integra con los mejores conjuntos de reglas del ecosistema. En esta guía verás cómo instalarlo, configurarlo, escribir reglas personalizadas y llevarlo a producción.
¿Qué es Suricata?
Suricata es un motor de análisis de tráfico de red que opera en tres modos:
| Modo | Función | Ejemplo de uso |
|---|---|---|
| IDS (Intrusion Detection System) | Analiza el tráfico y genera alertas sin bloquear | Monitorización pasiva en segmento de red |
| IPS (Intrusion Prevention System) | Analiza y bloquea tráfico malicioso en línea | Inline entre switch y firewall |
| NSM (Network Security Monitoring) | Registra flujo completo para forense y análisis | Captura de metadata para SIEM |
A diferencia de Snort (single-threaded), Suricata aprovecha múltiples cores de CPU a través de su modelo workers, donde cada hilo procesa paquetes de forma independiente. Esto lo hace apto para enlaces de 10 Gbps y superiores cuando se ejecuta en hardware dedicado.
Componentes clave
| Componente | Descripción |
|---|---|
| Motor de detección | Analiza paquetes contra reglas usando MPM (Multi-Pattern Matcher) con Hyperscan |
| ET Open Ruleset | Conjunto de reglas gratuito de Emerging Threats, actualizado diariamente |
| suricata-update | Herramienta oficial para descargar y gestionar reglas |
| EVE JSON | Sistema de logging estructurado (alerts, flows, DNS, TLS, HTTP) |
| libHTP | Parser HTTP integrado que normaliza peticiones y respuestas |
Instalación en Ubuntu/Debian
El método recomendado es usar el PPA oficial de OISF:
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata jq
El paquete incluye suricata-update y suricatactl de forma predeterminada. Verifica la instalación:
suricata --build-info | head -5
Para compilar desde fuente (útil para versiones más recientes o personalizaciones):
sudo apt -y install autoconf automake build-essential cargo \
libjansson-dev libpcap-dev libpcre2-dev libtool \
libyaml-dev make pkg-config rustc zlib1g-dev
git clone https://github.com/OISF/suricata.git
cd suricata
git tag -l 'suricata-*' | sort -V | tail -3
./scripts/bundle.sh
./autogen.sh
./configure --enable-lua --enable-geoip --with-libhyperscan
make -j$(nproc)
sudo make install
Estructura de archivos
| Ruta | Descripción |
|---|---|
/etc/suricata/suricata.yaml |
Archivo de configuración principal |
/etc/suricata/classification.config |
Definiciones de clasificación de reglas |
/etc/suricata/threshold.config |
Configuración de rate-limiting de alertas |
/etc/suricata/update.yaml |
Configuración de suricata-update |
/etc/suricata/rules/ |
Directorio de reglas locales (fuente para suricata-update) |
/var/lib/suricata/rules/ |
Directorio de reglas activas (generado por suricata-update) |
/var/log/suricata/ |
Directorio de logs |
Configuración inicial
Interfaz de red y variables
Edita /etc/suricata/suricata.yaml y configura las interfaces y la red local:
vars:
address-groups:
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
EXTERNAL_NET: "!$HOME_NET"
HTTP_SERVERS: "$HOME_NET"
SQL_SERVERS: "$HOME_NET"
DNS_SERVERS: "$HOME_NET"
Selecciona el modo de captura de paquetes. Para enlaces de 1 Gbps o menos, af-packet es la opción por defecto:
af-packet:
- interface: eth0
defrag: yes
use-mmap: yes
ring-size: 2048
block-size: 32768
Para enlaces de alto rendimiento (10 Gbps+), considera pf-ring o netmap:
af-packet:
- interface: eth0
defrag: yes
use-mmap: yes
threads: 4
ring-size: 4096
block-size: 65536
Logging con EVE JSON
EVE JSON es el sistema de logging estructurado de Suricata. Cada evento es un objeto JSON en una línea, ideal para ingestión en ELK, Wazuh o Splunk:
outputs:
- eve-log:
enabled: yes
filetype: regular
filename: eve.json
types:
- alert
- anomaly
- http
- dns
- tls
- flow
- netflow
- stats
Para configurar la rotación de logs, crea un archivo /etc/logrotate.d/suricata:
/var/log/suricata/*.log /var/log/suricata/*.json {
daily
rotate 30
compress
missingok
notifempty
postrotate
/usr/bin/suricatasc -c "reload-logging" 2>/dev/null || true
endscript
}
Verificar configuración
Siempre prueba la configuración antes de iniciar Suricata:
sudo suricata -T -c /etc/suricata/suricata.yaml
Una salida exitosa muestra Configuration successfully tested.
Gestión de reglas con suricata-update
suricata-update es la herramienta oficial para descargar, filtrar y compilar reglas. Reemplaza la gestión manual de archivos .rules.
Comandos esenciales
| Comando | Descripción |
|---|---|
sudo suricata-update |
Descarga y actualiza ET Open (por defecto) |
sudo suricata-update list-sources |
Lista fuentes de reglas disponibles |
sudo suricata-update enable-source <nombre> |
Activa una fuente adicional |
sudo suricata-update disable-source <nombre> |
Desactiva una fuente |
sudo suricata-update list-enabled-sources |
Lista fuentes activas |
sudo suricata-update update-sources |
Actualiza el índice de fuentes |
Reglas ET Open
Las reglas de Emerging Threats son el conjunto base de Suricata. Incluyen detección para malware, exploits, escaneo de red, protocol abuse y más:
sudo suricata-update
Después de la primera ejecución, verifica cuántas reglas se cargaron:
wc -l /var/lib/suricata/rules/suricata.rules
Reglas locales personalizadas
Crea reglas propias en /etc/suricata/rules/local.rules. Estas se incluyen automáticamente después de ejecutar suricata-update:
sudo mkdir -p /etc/suricata/rules
sudo nano /etc/suricata/rules/local.rules
Escritura de reglas personalizadas
Sintaxis base
Una regla de Suricata sigue esta estructura:
action protocol src_addr src_port -> dst_addr dst_port (options;)
Ejemplo completo:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET with suspicious user-agent"; flow:established,to_server; http.user_agent; content:"curl/7.68.0"; nocase; classtype:policy-violation; sid:1000001; rev:1;)
Acciones disponibles
| Acción | Descripción | Modo |
|---|---|---|
alert |
Genera alerta y deja pasar el paquete | IDS y IPS |
pass |
Detiene el escaneo de reglas para esta sesión | IDS y IPS |
drop |
Silencia el paquete sin alerta | Solo IPS (inline) |
reject |
Envía RST (TCP) o ICMP error al emisor | Solo IPS (inline) |
sdrop |
Silencia sin generar alerta | Solo IPS (inline) |
Ejemplos de reglas prácticas
Detección de escaneo de puertos Nmap:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN Potential Nmap TCP Scan"; flags:S,12; threshold:type both, track by_src, count 30, seconds 60; classtype:attempted-recon; sid:2100498; rev:6;)
Detección de explotación Metasploit reverse shell:
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"ET TROJAN Meterpreter Reverse Shell TCP"; flow:established,to_server; content:"|00 00 00|"; depth:3; offset:4; content:"|00 00 00|"; within:3; classtype:trojan-activity; sid:2024217; rev:3;)
Detección de exfiltración DNS tunneling:
alert dns $HOME_NET any -> any any (msg:"ET DNS Query for Long Subdomain (Possible DNS Tunnel)"; dns.query; pcre:"/^[a-zA-Z0-9]{40,}\./"; classtype:trojan-activity; sid:1000002; rev:1;)
Detección de transferencia de archivo ICMP:
alert icmp $HOME_NET any -> any any (msg:"ET POLICY Outbound ICMP Large Payload (Possible Data Exfil)"; dsize:>500; classtype:trojan-activity; sid:1000003; rev:1;)
Clasificación y prioridad
Las reglas se clasifican por tipo y severidad. Agrega categorías personalizadas en /etc/suricata/classification.config:
classification.config:
config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Bad Unknown Traffic,2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: attempted-dos,Attempted Denial of Service,1
config classification: unsuccessful-dos,Attempted Denial of Service,1
config classification: successful-dos,Denial of Service Attack,1
config classification: attempted-user,Attempted User Privilege Gain,1
config classification: unsuccessful-user,Unsuccessful User Privilege Gain,1
config classification: successful-user,Successful User Privilege Gain,1
config classification: trojan-activity,Trojan Activity,1
config classification: network-scan,Detection of a Network Scan,3
config classification: protocol-command-decode,Generic Protocol Command Decode,3
La prioridad se asigna directamente en la regla con priority:1 (más alta) a priority:255 (más baja).
Flowbits para correlación de eventos
Los flowbits permiten rastrear estado entre paquetes de la misma sesión. Son esenciales para detectar ataques multi-paso:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET POLICY PE EXE or DLL Windows file download HTTP"; flow:established,to_server; http.user_agent; content:"Microsoft-WebDAV"; nocase; flowbits:set,et.dns.update; noalert; sid:2018959; rev:5;)
alert dns any any -> any any (msg:"ET DNS Update Request with PE Download Correlation"; flowbits:isset,et.dns.update; dns.query; content:"|C0 04|"; depth:2; classtype:trojan-activity; sid:2018960; rev:5;)
La primera regla marca la sesión cuando detecta una descarga sospechosa (flowbits:set). La segunda regla solo genera alerta si el bit fue seteado previamente (flowbits:isset), creando una correlación entre dos eventos.
Gestión de umbrales y reducción de ruido
Sin configuración de umbrales, Suricata puede generar miles de alertas por minuto. El archivo /etc/suricata/threshold.config controla la frecuencia de alertas:
# Suprimir completamente una regla específica
suppress gen_id 1, sig_id 2100498
# Limitar alertas por fuente: máximo 1 cada 60 segundos
threshold gen_id 1, sig_id 1000002, type limit, track by_src, count 1, seconds 60
# Suprimir por dirección de red
suppress gen_id 1, sig_id 1000001, track by_src, ip 10.0.0.0/8
También puedes usar umbrales directamente en las reglas:
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"SQL Injection Attempt"; ...; threshold:type limit, track by_src, count 5, seconds 300; sid:1000004; rev:1;)
Esto genera solo 1 alerta cada 300 segundos por IP fuente, independientemente de cuántas veces se active la regla.
Análisis de EVE JSON
Consultas con jq
Filtrar alertas de alta prioridad:
jq 'select(.event_type == "alert") | select(.alert.severity <= 2)' /var/log/suricata/eve.json
Listar IPs fuente con más alertas:
jq -r 'select(.event_type == "alert") | .src_ip' /var/log/suricata/eve.json | \
sort | uniq -c | sort -rn | head -20
Consultar tráfico DNS sospechoso (dominios con subdominios muy largos):
jq 'select(.event_type == "dns") | select(.dns.rrname | length > 50)' /var/log/suricata/eve.json
Analizar conexiones TLS con certificados autofirmados:
jq 'select(.event_type == "tls") | select(.tls.issuerdn == .tls.subject)' /var/log/suricata/eve.json
Contar alertas por regla (sig_id):
jq -r 'select(.event_type == "alert") | .alert.signature_id' /var/log/suricata/eve.json | \
sort | uniq -c | sort -rn | head -10
Integración con SIEM
EVE JSON se alimenta directamente a los principales SIEM:
| SIEM | Método de ingestión |
|---|---|
| Wazuh | Agent integration (wazuh-agent lee eve.json) |
| ELK Stack | Filebeat → Logstash → Elasticsearch |
| Splunk | Universal Forwarder con props/transforms |
| QRadar | DSM Editor o LEEF directo |
Para Filebeat, la configuración mínima es:
filebeat.inputs:
- type: log
paths:
- /var/log/suricata/eve.json
json.keys_under_root: true
json.add_error_key: true
output.logstash:
hosts: ["logstash:5044"]
Modo IPS con NFQUEUE
Para operar como IPS, Suricata se ejecuta inline usando NFQUEUE de iptables/nftables. El tráfico pasa a través de Suricata antes de llegar a su destino:
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0 --queue-balance 0-3
sudo ip6tables -I FORWARD -j NFQUEUE --queue-num 0 --queue-balance 0-3
Para tráfico destinado al propio servidor (INPUT):
sudo iptables -I INPUT -j NFQUEUE --queue-num 0
Inicia Suricata en modo IPS:
sudo suricata -c /etc/suricata/suricata.yaml -q 0 --runmode workers
Advertencia: Un error de configuración en modo IPS puede cortar toda la conectividad de red. Siempre prueba primero en modo IDS y valida las reglas antes de activar IPS.
Integración con nftables
Si usas nftables en lugar de iptables:
sudo nft add rule ip filter forward queue num 0 balancing by random mod 4
Integración con NIC y monitoreo en VLANs
Port mirroring (SPAN)
Para monitorear tráfico que no pasa por el servidor Suricata, configura port mirroring en tu switch:
Cisco IOS:
monitor session 1 source interface GigabitEthernet0/1
monitor session 1 destination interface GigabitEthernet0/24
MikroTik RouterOS:
/tool traffic-generator
set [find] interface=ether1 target=ether24
Monitoreo por VLAN
En entornos con VLANs, configura interfaces virtuales en Suricata para capturar tráfico de cada segmento:
af-packet:
- interface: bond0
vlan-id-in-use:
- 100
- 200
- 300
defrag: yes
use-mmap: yes
O usa una interfaz por VLAN con subinterfaces:
sudo ip link add link bond0 name bond0.100 type vlan id 100
sudo ip link set bond0.100 up
Y en suricata.yaml:
af-packet:
- interface: bond0.100
defrag: yes
use-mmap: yes
- interface: bond0.200
defrag: yes
use-mmap: yes
Optimización de rendimiento
Parámetros clave
| Parámetro | Valor recomendado | Efecto |
|---|---|---|
max-pending-packets |
1024 o mayor | Paquetes procesados simultáneamente |
default-packet-size |
1514 (Ethernet) o 9000 (Jumbo) | Tamaño del buffer de captura |
runmode |
workers |
Un hilo por interfaz (mejor rendimiento) |
stream.memcap |
256MB o mayor | Memoria para tracking de sesiones |
stream.reassembly.memcap |
512MB o mayor | Memoria para reensamblaje HTTP |
Supervisión con stats.log
Activa el log de estadísticas en suricata.yaml:
outputs:
- stats:
enabled: yes
filename: stats.log
interval: 30
Monitorea los contadores más importantes:
tail -50 /var/log/suricata/stats.log | grep -E "(capture|detect|flow|tcp)"
Indicadores críticos:
| Métrica | Valor deseable |
|---|---|
capture.kernel_drops |
Cercano a 0 (>1% indica saturación) |
detect.alert |
Depende del tráfico, spikes inesperados = incidente |
flow.active |
Monitorear crecimiento para dimensionar memoria |
tcp.reassembly_memuse |
No debe exceder stream.reassembly.memcap |
Systemd y autoinicio
El paquete PPA incluye un servicio systemd. Configúralo para autoinicio:
sudo systemctl enable suricata
sudo systemctl start suricata
Para personalizar los argumentos, edita el servicio:
sudo systemctl edit suricata
Agrega:
[Service]
ExecStart=
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 --runmode workers -D
LimitNOFILE=65535
Errores comunes
| Error | Causa | Solución |
|---|---|---|
Unable to open file: /var/lib/suricata/rules/suricata.rules |
No se ejecutó suricata-update después de instalar |
Ejecuta sudo suricata-update |
Configuration failed al iniciar |
Error de sintaxis YAML | Ejecuta suricata -T para identificar la línea exacta |
Paquetes perdidos altos (kernel_drops) |
Interfaz saturada o ring buffer pequeño | Aumenta ring-size, usa múltiples threads o upgrade hardware |
| Alertas repetitivas de DNS | Reglas ET Open muy sensibles a consultas legítimas | Agrega suppress en threshold.config o desactiva SIDs específicos |
Sin alertas EVE en /var/log/suricata/ |
eve-log deshabilitado en YAML o Suricata no tiene permisos de escritura |
Verifica outputs en suricata.yaml y permisos del directorio |
AF_PACKET error al iniciar |
Interfaz no soportada o driver incompatible | Verifica con ip link show, prueba con pcap mode alternativo |
Referencia rápida de comandos
| Comando | Descripción |
|---|---|
suricata -T -c /etc/suricata/suricata.yaml |
Test de configuración |
suricata -V |
Mostrar versión |
suricata --build-info |
Info completa de build |
suricata --dump-config |
Volcar configuración efectiva |
suricata --list-keywords=all |
Listar todas las keywords de reglas |
suricata --list-app-layer-protos |
Listar protocolos de aplicación soportados |
suricata -r capture.pcap |
Analizar tráfico desde archivo pcap |
suricata --simulate-ips |
Simular modo IPS sin estar inline |
sudo suricata-update |
Actualizar reglas ET Open |
sudo suricata-update enable-source et/open |
Habilitar fuente de reglas |
suricatasc -c "reload-config" |
Recargar configuración sin reiniciar |
suricatasc -c "reload-logging" |
Recargar configuración de logging |
Conclusión
Un firewall define qué tráfico puede pasar. Un IDS/IPS como Suricata analiza qué hay dentro de ese tráfico. Son capas complementarias, no alternativas. En una arquitectura de defensa en profundidad, Suricata se ubica después del firewall para detectar lo que este no puede ver: exploits encapsulados en conexiones legítimas, comandos C2 dentro de tráfico DNS y exfiltración de datos mediante protocolos normales.
Para llevar Suricata a producción, necesitas cuatro pilares:
- Reglas actualizadas —
suricata-updatecon ET Open como base, reglas locales para amenazas específicas de tu entorno - EVE JSON + SIEM — Logging estructurado alimentando Wazuh, ELK o Splunk para correlación y respuesta
- Umbrales y suppress — Sin esto, el ruido ahoga las alertas reales
- Monitoreo de rendimiento —
kernel_dropscerca de cero es la métrica más importante
Suricata no reemplaza a tu firewall, EDR o SOC. Es la capa que da visibilidad de red en tiempo real que esos componentes no pueden proporcionar por sí solos.
Artículos relacionados
- Firewall: Qué es, Tipos y Cómo Configurar uno en 2026 — Configuración de iptables, UFW y pfSense como primera línea de defensa
- Seguridad en Redes: Fundamentos de Defensa Perimetral — Modelo de defensa en profundidad, VLANs y monitorización con Zeek
- Threat Hunting y Blue Team: Caza de Amenazas con MITRE ATT&CK — Metodología de caza de amenazas usando hipótesis y la Pirámide del Dolor