CrowdSec es un sistema de detección y prevención de intrusiones de código abierto que analiza los logs de tus servicios, detecta comportamientos maliciosos (fuerza bruta en SSH, escaneos web, etc.) y bloquea las IPs responsables. A diferencia de Fail2ban, separa la detección (el agente CrowdSec) del bloqueo (los bouncers) y comparte las señales con una red comunitaria, de la que recibe a cambio una lista de IPs maliciosas conocidas. En este tutorial instalarás CrowdSec en Ubuntu 24.04, bloquearás atacantes con el bouncer de firewall basado en nftables, añadirás la protección para Nginx y conectarás el servidor a la consola web.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
- Un usuario no root con privilegios
sudo. - La IP pública desde la que te conectas por SSH, para añadirla a la lista blanca (puedes verla con
echo $SSH_CLIENTen la sesión SSH, es el primer campo). - Opcional: Nginx instalado, si quieres proteger también un sitio web.
NotaCrowdSec levanta su API local en
127.0.0.1:8080. Si otro servicio ya usa ese puerto, consulta la sección de solución de problemas antes de instalar.
Paso 1: Añadir el repositorio de CrowdSec
Los paquetes de CrowdSec se publican en un repositorio propio alojado en Packagecloud. CrowdSec ofrece un script que añade ese repositorio con su clave de firma. Descárgalo primero para poder revisarlo antes de ejecutarlo:
curl -fsSL https://install.crowdsec.net -o crowdsec-repo.sh
less crowdsec-repo.sh
El script solo detecta tu distribución, instala la clave GPG y crea el archivo del repositorio en /etc/apt/sources.list.d/. Ejecútalo:
sudo sh crowdsec-repo.sh
Comprueba que el paquete crowdsec ya está disponible desde el nuevo repositorio:
apt policy crowdsec
crowdsec:
Installed: (none)
Candidate: 1.6.x
Version table:
1.6.x 500
500 https://packagecloud.io/crowdsec/crowdsec/any any/main amd64 Packages
Paso 2: Instalar el agente CrowdSec
Instala el paquete:
sudo apt install crowdsec
Durante la instalación, CrowdSec detecta los servicios presentes en el servidor e instala automáticamente las collections correspondientes (conjuntos de parsers y escenarios). En un Ubuntu 24.04 típico instalará al menos crowdsecurity/linux y crowdsecurity/sshd, y crowdsecurity/nginx si Nginx ya estaba instalado. También genera /etc/crowdsec/acquis.yaml, el archivo que indica qué logs debe leer.
Comprueba que el servicio está activo:
sudo systemctl status crowdsec --no-pager
● crowdsec.service - Crowdsec agent
Loaded: loaded (/usr/lib/systemd/system/crowdsec.service; enabled; preset: enabled)
Active: active (running) since ...
Lista las collections instaladas:
sudo cscli collections list
COLLECTIONS
Name Status Version Local Path
crowdsecurity/linux enabled 0.x /etc/crowdsec/collections/linux.yaml
crowdsecurity/sshd enabled 0.x /etc/crowdsec/collections/sshd.yaml
Por último, confirma que CrowdSec está leyendo los logs. La tabla de adquisición muestra cuántas líneas se han leído y analizado de cada fuente:
sudo cscli metrics
Busca /var/log/auth.log en la tabla Acquisition Metrics: las columnas Lines read y Lines parsed deben ir aumentando a medida que hay actividad SSH.
Paso 3: Añadir tu IP a la lista blanca
Antes de activar el bloqueo, protege tu propio acceso. Si te equivocas varias veces con la contraseña o una herramienta de despliegue hace muchas conexiones, CrowdSec podría bloquear tu IP y dejarte fuera del servidor.
Crea un parser de lista blanca en la etapa de enriquecimiento:
sudo nano /etc/crowdsec/parsers/s02-enrich/mywhitelist.yaml
Sustituye 198.51.100.7 por tu IP y ajusta o elimina el rango de ejemplo:
name: local/mywhitelist
description: "IPs de administración que nunca deben bloquearse"
whitelist:
reason: "IP de administración"
ip:
- "198.51.100.7"
cidr:
- "10.0.0.0/8"
Recarga CrowdSec y comprueba que el parser aparece como local:
sudo systemctl reload crowdsec
sudo cscli parsers list | grep mywhitelist
local/mywhitelist enabled,local /etc/crowdsec/parsers/s02-enrich/mywhitelist.yaml
Paso 4: Instalar el bouncer de firewall
El agente solo detecta y decide; el bloqueo real lo aplica un bouncer. Ubuntu 24.04 usa nftables como backend del firewall, así que instala la variante de nftables:
sudo apt install crowdsec-firewall-bouncer-nftables
Como el agente está en el mismo servidor, el paquete registra el bouncer en la API local y genera su clave automáticamente. Compruébalo:
sudo cscli bouncers list
Name IP Address Valid Last API pull Type
cs-firewall-bouncer-1727260000 127.0.0.1 yes 2026-09-25T10:15:02Z crowdsec-firewall-bouncer
Y que el servicio está en marcha:
sudo systemctl status crowdsec-firewall-bouncer --no-pager
El bouncer crea su propia tabla crowdsec en nftables, independiente de UFW, y consulta la API local cada pocos segundos para añadir o quitar IPs. Su configuración está en /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml; los valores por defecto son adecuados para la mayoría de servidores.
Paso 5: Probar el bloqueo
En lugar de atacar tu propio servidor, crea una decisión manual para una IP de documentación y comprueba que llega al firewall:
sudo cscli decisions add --ip 203.0.113.10 --duration 10m --reason "prueba manual"
Lista las decisiones activas:
sudo cscli decisions list
ID Source Scope:Value Reason Action Country AS Events expiration Alert ID
250001 cscli Ip:203.0.113.10 prueba manual ban 1 9m56s 1
Tras unos segundos, la IP debe aparecer en los sets de nftables que gestiona el bouncer:
sudo nft list table ip crowdsec | grep 203.0.113.10
elements = { 203.0.113.10 timeout 9m50s expires 9m40s }
Elimina la decisión de prueba:
sudo cscli decisions delete --ip 203.0.113.10
A partir de ahora, cuando un escenario detecte un ataque real (por ejemplo, crowdsecurity/ssh-bf ante muchos intentos fallidos de login por SSH), CrowdSec creará una alerta y una decisión de bloqueo de 4 horas por defecto. Consulta el historial con:
sudo cscli alerts list
Paso 6: Proteger Nginx
Si tienes Nginx instalado y no se añadió durante la instalación, instala la collection de Nginx y la de ataques web genéricos:
sudo cscli collections install crowdsecurity/nginx crowdsecurity/base-http-scenarios
Crea un archivo de adquisición para que CrowdSec lea los logs de Nginx:
sudo nano /etc/crowdsec/acquis.d/nginx.yaml
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
Si ya había una entrada para Nginx en /etc/crowdsec/acquis.yaml, no la dupliques aquí. Recarga el agente:
sudo systemctl reload crowdsec
Genera algunas peticiones y comprueba en sudo cscli metrics que /var/log/nginx/access.log aparece en Acquisition Metrics con líneas analizadas. El bouncer de firewall que ya tienes bloqueará también a las IPs que ataquen la web, sin cambios en la configuración de Nginx.
Paso 7: Conectar el servidor a la consola de CrowdSec
La consola web gratuita en https://app.crowdsec.net muestra las alertas de todos tus servidores y permite suscribirse a listas de bloqueo adicionales. Crea una cuenta, pulsa la opción para añadir un Security Engine y copia la clave de enrolamiento que aparece. Después ejecuta en el servidor:
sudo cscli console enroll your_enroll_key
INFO Enabled tainted : Forward alerts from tainted scenarios to the console
INFO Enabled custom : Forward alerts from custom scenarios to the console
INFO Enabled manual : Forward manual decisions to the console
INFO Watcher successfully enrolled. Visit https://app.crowdsec.net to accept it.
Acepta el servidor en la consola web y reinicia el agente para completar el enrolamiento:
sudo systemctl restart crowdsec
Independientemente de la consola, CrowdSec ya comparte señales con la API central (CAPI) y recibe la lista de bloqueo comunitaria. Comprueba que la conexión funciona:
sudo cscli capi status
INFO You can successfully interact with Central API (CAPI)
Las decisiones que llegan de la comunidad aparecen con el origen CAPI en sudo cscli decisions list --origin CAPI.
Paso 8: Mantener actualizados los escenarios
Los parsers y escenarios del hub se actualizan independientemente del paquete. Actualiza el índice del hub y los elementos instalados, y recarga el agente:
sudo cscli hub update
sudo cscli hub upgrade
sudo systemctl reload crowdsec
El propio agente y el bouncer se actualizan con el resto del sistema mediante sudo apt upgrade.
Solución de problemas
CrowdSec no arranca con bind: address already in use: otro servicio usa el puerto 8080. Cambia listen_uri en la sección api.server de /etc/crowdsec/config.yaml (por ejemplo, a 127.0.0.1:8081), pon la misma dirección en url dentro de /etc/crowdsec/local_api_credentials.yaml y en api_url de /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml, y reinicia ambos servicios.
Te has bloqueado a ti mismo: entra por la consola VNC de tu VPS desde el panel de CubePath, ejecuta sudo cscli decisions delete --ip your_ip y añade tu IP a la lista blanca del paso 3.
Lines parsed se queda en 0 para un log: el type de la etiqueta en la adquisición no coincide con el formato del log, o falta la collection. Comprueba el análisis de una línea concreta con sudo cscli explain --file /var/log/nginx/access.log --type nginx.
Conclusión
Has instalado CrowdSec en Ubuntu 24.04, has protegido SSH y Nginx, has conectado el bloqueo al firewall con el bouncer de nftables y has enlazado el servidor con la consola y la lista comunitaria. Como siguientes pasos, revisa los escenarios disponibles para tus otros servicios con sudo cscli collections list -a, configura notificaciones de alertas en /etc/crowdsec/notifications/ y combina CrowdSec con un firewall UFW que solo abra los puertos que realmente necesitas.
