Skip to main contentSkip to footer

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.

Necesitas una API Key con el 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.

conf
# /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:

bash
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.localademás de la acción de expulsión habitual (%(action_)s), no en lugar de ella:

conf
# /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

Añadir una nueva acción requiere un reinicio completo — fail2ban-client reload no garantiza que se incorpore correctamente. Utiliza systemctl restart fail2bany, a continuación, confirma que ambas acciones se hayan cargado.
bash
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:

log
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 registroSignificado
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:

json
{"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»):

JailcategoriesSignificado
sshd18,22Brute-Force, SSH
postfix-sasl, dovecot11,18Email Spam, Brute-Force
proftpd, vsftpd5FTP Brute-Force
nginx-http-auth, apache-auth18,21Brute-Force, Web App Attack
nginx-badbots, apache-badbots14,19Port Scan, Bad Web Bot
apache-sqli, vulnerabilidades web16,21SQL Injection, Web App Attack
WordPress / wp-login18,21Brute-Force, Web App Attack
recidive (reincidentes)15,18Hacking, 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:

conf
# /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 ignoreip configuració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 de actionban significa que un fallo de red en ReportedIP no impedirá que fail2ban bloquee localmente.
  • Umbrales razonables. Un valor muy bajo maxretry en 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íntomaSolución
get <jail> actions solo muestra la acción de expulsiónHas recargado en lugar de reiniciar. Ejecuta systemctl restart fail2ban.
unknown smtpd restriction / jail no se iniciaError 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 / cuotaSe ha alcanzado el límite diario de informes de tu plan; consulta Autenticación.
No hay nada en el registro sobre la suspensiónLa 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.
¿Quieres bloquear también el uso de datos de la comunidad? Importa el Blacklist Feed a nftables/ipset o, en el caso de los servidores de correo, consulta la DNS / RBL Zone.

Última actualización: · Gestionado por el equipo de reportedIP

Security Focused
GDPR Compliant
Made in Germany
Volver a Docs