Integración con fail2ban
Convierte cada dirección IP que fail2ban bloquee en tu servidor en un informe para la lista negra de la comunidad ReportedIP. Una pequeña acción personalizada llama a la API de informes cada vez que se produce un bloqueo, de modo que tu cortafuegos y la comunidad se protegen mutuamente; los mismos datos también alimentan el Blacklist Feed y la DNS / RBL Zone.
report permisos necesarios. Crea una de forma gratuita en tu
Dashboard; consulta la sección «Autenticación» para conocer los límites. Informa únicamente de las direcciones IP que tu propio servidor haya detectado realmente.Cómo funciona fail2ban (en 30 segundos)
fail2ban supervisa los archivos de registro (o el diario de systemd). Un filtro identifica los patrones de ataque
, una «jaula» cuenta las coincidencias por IP dentro de findtime, y una vez que una IP
alcanza maxretry la «jail», esta ejecuta sus acciones (bloqueo + cualquier otra cosa que añadas).
Añadimos una segunda acción que notifica la IP bloqueada a ReportedIP.
1. Crea la acción de informe
Guárdala como /etc/fail2ban/action.d/reportedip.conf. Envía mediante POST la IP bloqueada, las
Threat Categories y un breve comentario al Endpoint de informe cada vez que se bloquea una IP.
# /etc/fail2ban/action.d/reportedip.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -sS -m 10 -X POST "<report_url>" \
-H "X-Key: <api_key>" \
--data-urlencode "ip=<ip>" \
--data-urlencode "categories=<categories>" \
--data-urlencode "comment=fail2ban <name>: <failures> failed attempts" \
-o /dev/null || :
actionunban =
[Init]
report_url = https://reportedip.com/wp-json/reportedip/v2/report
api_key = <your-api-key>
categories = 18,22
Restringe los permisos para que la clave no sea legible para todo el mundo:
chmod 600 /etc/fail2ban/action.d/reportedip.conf
Las etiquetas <ip>, <name> (nombre de la jaula) y <failures>
las rellena fail2ban; <api_key>, <categories> y
<report_url> provienen del [Init] bloque.
2. Actívalo en una «jail»
Añade la acción a una «jail» en /etc/fail2ban/jail.local — además de la
acción de expulsión habitual (%(action_)s), no en lugar de ella:
# /etc/fail2ban/jail.local
[sshd]
enabled = true
action = %(action_)s
reportedip
Puedes anular las categorías por «jail» indicándolas directamente, p. ej.,
reportedip[categories="16,21"] en una jaula de aplicación web.
3. Aplicar y verificar
fail2ban-client reload
no garantiza que se incorpore correctamente. Utiliza systemctl restart fail2bany, a continuación, confirma que ambas
acciones se hayan cargado.systemctl restart fail2ban
fail2ban-client get sshd actions
# -> The jail sshd has the following actions:
# nftables, reportedip
Lectura del registro de fail2ban
los registros de fail2ban en /var/log/fail2ban.log (o en el diario: journalctl -u fail2ban).
Las líneas que te interesan:
2026-05-30 21:56:18 fail2ban.filter [38760]: INFO [sshd] Found 203.0.113.45 - 2026-05-30 21:56:18
2026-05-30 21:56:26 fail2ban.actions [38760]: NOTICE [sshd] Ban 203.0.113.45
2026-05-30 22:06:26 fail2ban.actions [38760]: NOTICE [sshd] Unban 203.0.113.45
| Línea del registro | Significado |
|---|---|
Found <ip> | El filtro ha detectado un intento de ataque. Aún no se ha bloqueado. |
Ban <ip> | Se ha alcanzado el umbral: la «jail» ha ejecutado sus acciones, incluido el informe a reportedIP. |
Unban <ip> | bantime transcurrido; se ha eliminado la regla del cortafuegos (sin informe). |
Restore Ban <ip> | fail2ban se reinició y volvió a aplicar una suspensión que seguía activa. |
La propia acción de notificación no genera ningún mensaje cuando se realiza con éxito (-o /dev/null). Para ver cómo se envían los informes,
utiliza el comando «tail» en el registro mientras realizas la prueba, o ejecuta la acción curl manualmente para una IP; si se realiza con éxito,
se devuelve el nuevo informe:
{"data":{"ipAddress":"203.0.113.45","abuseConfidencePercentage":39,"reportId":"4316026","aggregated":true}}
Contadores en tiempo real: comprueba tu clave con
curl -H "X-Key: <key>" https://reportedip.com/wp-json/reportedip/v2/verify-key y lee
limits.dailyReportUsage, o abre el Dashboard.
Selección de Threat Categories por «jail»
Introduce los ID de categoría que coincidan con lo que detecta la «jail». Asignaciones habituales (lista completa en «Threat Categories»):
| Jail | categories | Significado |
|---|---|---|
sshd | 18,22 | Brute-Force, SSH |
postfix-sasl, dovecot | 11,18 | Email Spam, Brute-Force |
proftpd, vsftpd | 5 | FTP Brute-Force |
nginx-http-auth, apache-auth | 18,21 | Brute-Force, Web App Attack |
nginx-badbots, apache-badbots | 14,19 | Port Scan, Bad Web Bot |
apache-sqli, vulnerabilidades web | 16,21 | SQL Injection, Web App Attack |
WordPress / wp-login | 18,21 | Brute-Force, Web App Attack |
recidive (reincidentes) | 15,18 | Hacking, Brute-Force |
Notificación de más de una «cárcel»
Asigna la acción a cada «jail» y sobrescribe las categorías en línea para que cada informe sea preciso:
# /etc/fail2ban/jail.local
[sshd]
enabled = true
action = %(action_)s
reportedip[categories="18,22"]
[postfix-sasl]
enabled = true
action = %(action_)s
reportedip[categories="11,18"]
[recidive]
enabled = true
action = %(action_)s
reportedip[categories="15,18"]
Buenas prácticas y seguridad
- Denuncia únicamente tus propias expulsiones. Nunca denuncies direcciones IP que no hayas observado atacando tus propios sistemas: las denuncias falsas perjudican el conjunto de datos (y pueden provocar la suspensión de tu clave).
- Whitelist tus propios rangos. Configura
ignoreipconfiguración para las direcciones IP de tu oficina o de monitorización, de modo que nunca te denuncies a ti mismo. - Mantén la clave en secreto (
chmod 600). Aunque no queda expuesta a los atacantes, cualquiera que tenga el archivo puede enviar Reports en tu nombre. Cámbiala desde el Dashboard si se filtra. - Un informe fallido nunca bloquea un bloqueo. El
|| :al final deactionbansignifica que un fallo de red en ReportedIP no impedirá que fail2ban bloquee localmente. - Umbrales razonables. Un valor muy bajo
maxretryen jaulas con mucho ruido pueden provocar un exceso de informes sobre clientes transitorios; los valores predeterminados (3–5) son adecuados.
Solución de problemas
| Síntoma | Solución |
|---|---|
get <jail> actions solo muestra la acción de expulsión | Has recargado en lugar de reiniciar. Ejecuta systemctl restart fail2ban. |
unknown smtpd restriction / jail no se inicia | Error tipográfico en la configuración en jail.local; comprueba la sangría de la línea de continuación debajo de action. |
| Reports rechazados (HTTP 401/403) | Falta la clave report permisos, o el encabezado es incorrecto: debe ser X-Key. |
| HTTP 429 / cuota | Se ha alcanzado el límite diario de informes de tu plan; consulta Autenticación. |
| No hay nada en el registro sobre la suspensión | La acción del informe no muestra ningún mensaje si se realiza correctamente. Confírmelo con fail2ban-client get <jail> actions y una acción manual curl. |
Última actualización: · Gestionado por el equipo de reportedIP