Saltar al contenido principal
Suricata IDS/IPS: Monitoreo de Red en Tiempo Real

Suricata IDS/IPS: Monitoreo de Red en Tiempo Real

Configura Suricata IDS/IPS para detectar intrusiones en tiempo real. Guía completa con reglas, EVE logging, suricata-update y integración con SOC.

14 minCyberFlows Team
[Espacio publicitario — AdSense]

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:

  1. Reglas actualizadassuricata-update con ET Open como base, reglas locales para amenazas específicas de tu entorno
  2. EVE JSON + SIEM — Logging estructurado alimentando Wazuh, ELK o Splunk para correlación y respuesta
  3. Umbrales y suppress — Sin esto, el ruido ahoga las alertas reales
  4. Monitoreo de rendimientokernel_drops cerca 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

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.

[Espacio publicitario — AdSense]

Newsletter de Ciberseguridad

Resumen semanal con los mejores artículos, CVEs críticos y tendencias del mercado. Sin spam.

🔒 Tu email no se compartirá. Puedes darte de baja en cualquier momento.