Bloqueo a nivel de red
Esta página contiene la guía completa para bloquear a los atacantes conocidos en la capa de red de un servidor Linux : un conjunto de bloqueos por cada servicio expuesto, actualizado cada hora desde la API, incorporado al núcleo de forma atómica y aplicado por puertos, de modo que un atacante web nunca impida a nadie el acceso a SSH. Abarca ipset con iptables , nftables nativo , IPv6 y cortafuegos en el perímetro de la nube .
Todo lo que se indica a continuación supone disponer de una API Key con acceso a Threat Feed (nivel «Contributor» o superior) y de privilegios de root en
la máquina de destino. El /blacklist Endpoint tiene restricciones de funciones, pero no cuenta para
tu cuota diaria de comprobaciones o informes.
Cómo funciona
Recupera una lista por servicio, cada hora
El category filtro convierte la Blacklist en una lista por servicio: atacantes de SSH,
atacantes de correo, atacantes web, etc. Las listas se regeneran en el servidor cada 15 minutos;
una consulta cada hora con If-None-Match te mantiene al día con 120 solicitudes al día.
Incorpóralo a un conjunto del kernel de forma atómica
Las direcciones IP se añaden a un conjunto de ipset o nftables, nunca a Firewall Rules individuales. Una consulta al conjunto es una consulta de hash, independientemente del tamaño; 10 000 reglas individuales se recorrerían linealmente para cada paquete. La sustitución es atómica, por lo que no hay ningún intervalo en el que el conjunto esté vacío o parcialmente poblado.
Coincidir con el conjunto en el ámbito del puerto
Cada regla por servicio hace referencia a su propio conjunto y solo a los puertos en los que ese servicio está a la escucha. Una dirección IP detectada en un ataque de Brute Force al Login de WordPress se rechaza en los puertos 80 y 443, y en ningún otro sitio.
Listas de servicios y sus categorías
Los informes incluyen identificadores de Threat Categories. category Acepta una lista separada por comas y devuelve
solo las direcciones IP notificadas en al menos una de ellas. El catálogo completo (58 categorías, ID del 1 al 58) se encuentra
en la página «Threat Categories» o a través de
GET /categories sin necesidad de autenticación.
| Set | category |
Cubre | Aplicar a |
|---|---|---|---|
ssh |
22,18 |
ataque de Brute-Force a SSH (22), ataque de Brute-Force genérico (18) | sshd — puerto 22 |
mail |
11,7,17,18 |
Email Spam (11), Phishing (7), Spoofing (17), Brute-Force (18) para SMTP-AUTH/IMAP/POP3 | Postfix/Exim, Dovecot — puertos 25, 465, 587, 110, 143, 993, 995 |
web |
véase más abajo | Web App Attack (21), SQL Injection (16), Web Spam (10), Bad Web Bot (19), Blog Spam (12) además del bloque dedicado a WordPress (31–58): Brute Force en Login/XML-RPC/REST, vulnerabilidades en plugins, temas y el núcleo, spam en comentarios y registros, puertas traseras, escaneo | de nginx/Apache, incluido el alojamiento de WordPress — puertos 80, 443 |
ftp |
5,18 |
FTP Brute-Force (5), Brute-Force genérica (18) | vsftpd/proftpd — puerto 21 |
edge |
4,14,20 |
DDoS Attack (4), Port Scan (14), Exploited Host (20) | perímetro completo de la red, todos los puertos |
Valor category valor del web conjunto:
21,16,10,19,12,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
La categoría 18 (Brute Force genérica) aparece en la ssh, mail y
ftp conjuntos a propósito: recoge los ataques a credenciales que el autor del informe no atribuyó
a ningún protocolo, y los conjuntos se aplican por puerto de servicio de todos modos. Si prefieres ejecutar un único
conjunto de bloqueo para todo, omite category — la lista sin filtrar es el superconjunto de
los cinco.
La solicitud
Autentícate con el X-Key encabezado en lugar del key parámetro de consulta, para que
la clave no aparezca en los registros del proxy o de la CDN.
curl -sS -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=50000&category=22,18"
| Parámetro | Valor | Por qué |
|---|---|---|
confidence |
90 |
El nivel recomendado para el bloqueo automático. Los niveles 50/75/90 se generan previamente del lado del servidor cada 15 minutos, por lo que ofrecen una respuesta rápida y completa. Los valores no estándar (91, 93, 97) se calculan por solicitud y son más lentos |
format |
txt |
Una IP por línea, sin envoltura — se canaliza directamente a ipset restore o
nft -f |
limit |
10000 o superior |
Límite de respuesta. Si se omite, devuelve 10 000 entradas; los niveles se almacenan en caché hasta un máximo de
50 000, por lo que limit=50000 devuelve todo lo que contiene el nivel (véase más abajo) |
category |
por servicio | Restringe la lista a los tipos de ataque que coincidan (tabla anterior). Omítelo para obtener un conjunto combinado |
¿Qué tamaño alcanzan las listas?
Cada nivel se regenera en el servidor cada 15 minutos y se almacena en caché hasta un máximo de 50 000 entradas, que es
también el límite máximo por respuesta. El tamaño predeterminado de la respuesta se mantiene en 10 000 por motivos de
compatibilidad con versiones anteriores; solicita más explícitamente con limit=50000.
confidence | Tamaño habitual | Se utiliza para |
|---|---|---|
90 |
alrededor de 10 000 | Bloqueo automático. Cabe en una sola solicitud y dentro de los límites de elementos de la mayoría de los cortafuegos en la nube |
75 |
alrededor de 26 000 | Cobertura más amplia en casos en los que la recuperación de un False Positive no supone un gran coste: Rate Limiting, CAPTCHA, puntuación o bloqueo en un servicio que no está orientado al cliente |
50 |
50 000 (límite máximo) | Análisis, enriquecimiento SIEM y puntuación. Demasiado amplio para reglas de DROP sin supervisión |
Los filtros de categoría restringen el nivel que solicites, pero no van más allá de él: una
web lista creada a partir de confidence=75 es más amplia que la misma lista creada a partir de
confidence=90. A partir de 50 000 direcciones, las descargas de listas dejan de ser la herramienta adecuada: consulta
la DNS / RBL Zone o
GET /check por dirección, lo que cubre toda la base de datos sin ningún límite de tamaño
en absoluto.
Por qué un nivel de confianza del 90 % mantiene bajos los False Positives
La puntuación no es un contador de informes. Una IP necesita al menos 10 informes válidos para superar el 74 %
y al menos 2 informadores independientes; los informes caducan con una vida media de 30 días, por lo que una IP que haya dejado de
de atacar desaparece por sí sola, y la infraestructura incluida en la lista blanca (motores de búsqueda, CDN, sistemas de monitorización,
escáneres de investigación) se excluye antes de crear la lista. Las puntuaciones de 90 o más requieren, en la práctica,
muchos informes recientes de fuentes independientes, normalmente corroborados por sensores de honeypot. Puedes auditar
cualquier entrada con GET /check?ip=<ip>&verbose=true, que devuelve el desglose completo de la puntuación
.
Reglas operativas
- Realiza consultas cada hora, de forma escalonada. Cinco listas una vez por hora suponen 120 solicitudes al día. No envíes las cinco en el mismo segundo.
- Devuelve el ETag. Almacena el
ETagencabezado de respuesta de cada lista y devuelveIf-None-Match; una lista sin cambios responde304 Not Modifiedcon un cuerpo vacío. La etiqueta identifica la variante exacta que has solicitado, incluido el filtro de categoría, por lo que debes mantener un archivo de etiquetas por lista. - Nunca vacíes la lista en caso de error. Ante cualquier estado que no sea 200 o 304, mantén el conjunto anterior activo y vuelve a intentarlo a la hora siguiente. Un cortafuegos que se vacía porque una consulta ha agotado el tiempo de espera es peor que uno ligeramente desactualizado.
- Comprueba que el tamaño sea razonable. Rechaza aplicar una lista que se haya reducido drásticamente. El script que aparece a continuación rechaza cualquier cosa por debajo de un mínimo por lista, lo que detecta respuestas truncadas y vacías.
- Separa IPv4 e IPv6. La fuente contiene ambas. Un ipset creado para una familia rechaza las direcciones de la otra, por lo que cada lista necesita dos conjuntos.
Script de sincronización (ipset)
Un único script gestiona las cinco listas; el nombre de la lista es el único argumento. Realiza la recuperación de forma condicional,
valida el tamaño e incorpora el resultado al conjunto activo de forma atómica. Las entradas se cargan
ipset restore en una sola pasada en lugar de una ipset add por IP, lo que
permite que una actualización de 10 000 entradas se realice en menos de un segundo.
#!/bin/sh
# /usr/local/sbin/reportedip-sync.sh <ssh|mail|web|ftp|edge>
# Fetches one service list and swaps it into its ipset atomically.
set -u
API_KEY="YOUR_API_KEY"
BASE="https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=50000"
STATE="/var/lib/reportedip"
LIST="${1:-}"
# CATS = category filter, MIN = smallest plausible list size (refuse below this)
case "$LIST" in
ssh) CATS="22,18" ; MIN=1000 ;;
mail) CATS="11,7,17,18" ; MIN=500 ;;
web) CATS="21,16,10,19,12,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58" ; MIN=500 ;;
ftp) CATS="5,18" ; MIN=500 ;;
edge) CATS="4,14,20" ; MIN=1000 ;;
*) echo "usage: $0 ssh|mail|web|ftp|edge" >&2 ; exit 2 ;;
esac
mkdir -p "$STATE"
BODY=$(mktemp) ; HEAD=$(mktemp)
trap 'rm -f "$BODY" "$HEAD" "$BODY.v4" "$BODY.v6"' EXIT
ETAG="$STATE/etag-$LIST"
if [ -s "$ETAG" ]; then
CODE=$(curl -sS -o "$BODY" -D "$HEAD" -w '%{http_code}' --max-time 60 \
-H "X-Key: $API_KEY" -H "If-None-Match: $(cat "$ETAG")" "$BASE&category=$CATS")
else
CODE=$(curl -sS -o "$BODY" -D "$HEAD" -w '%{http_code}' --max-time 60 \
-H "X-Key: $API_KEY" "$BASE&category=$CATS")
fi
case "$CODE" in
200) : ;;
304) logger -t reportedip "[$LIST] unchanged (304)" ; exit 0 ;;
*) logger -t reportedip "[$LIST] HTTP $CODE - keeping previous set" ; exit 1 ;;
esac
# The feed carries both families; ipset needs them in separate sets.
grep -E '^[0-9]+(\.[0-9]+){3}$' "$BODY" > "$BODY.v4" || true
grep -E '^[0-9a-fA-F:]+:[0-9a-fA-F:]*$' "$BODY" > "$BODY.v6" || true
COUNT=$(wc -l < "$BODY.v4")
if [ "$COUNT" -lt "$MIN" ]; then
logger -t reportedip "[$LIST] only $COUNT IPv4 entries (min $MIN) - keeping previous set"
exit 1
fi
# IPv4: build a scratch set, fill it in one restore pass, swap it in.
ipset create "rip-$LIST" hash:ip family inet maxelem 65536 -exist
ipset create "rip-$LIST-tmp" hash:ip family inet maxelem 65536 -exist
{ echo "flush rip-$LIST-tmp" ; sed "s|^|add rip-$LIST-tmp |" "$BODY.v4" ; } | ipset restore -exist
ipset swap "rip-$LIST-tmp" "rip-$LIST"
ipset destroy "rip-$LIST-tmp"
# IPv6: same pattern, own family. Skipped when the list has no v6 entries.
ipset create "rip-$LIST-v6" hash:ip family inet6 maxelem 65536 -exist
if [ -s "$BODY.v6" ]; then
ipset create "rip-$LIST-v6-tmp" hash:ip family inet6 maxelem 65536 -exist
{ echo "flush rip-$LIST-v6-tmp" ; sed "s|^|add rip-$LIST-v6-tmp |" "$BODY.v6" ; } | ipset restore -exist
ipset swap "rip-$LIST-v6-tmp" "rip-$LIST-v6"
ipset destroy "rip-$LIST-v6-tmp"
fi
awk 'tolower($1) == "etag:" { print $2 }' "$HEAD" | tr -d '\r' > "$ETAG"
logger -t reportedip "[$LIST] updated: $COUNT IPv4, $(wc -l < "$BODY.v6") IPv6"
Hazlo ejecutable y asígnale una programación escalonada por horas:
chmod 750 /usr/local/sbin/reportedip-sync.sh
# /etc/cron.d/reportedip
7 * * * * root /usr/local/sbin/reportedip-sync.sh ssh
17 * * * * root /usr/local/sbin/reportedip-sync.sh mail
27 * * * * root /usr/local/sbin/reportedip-sync.sh web
37 * * * * root /usr/local/sbin/reportedip-sync.sh ftp
47 * * * * root /usr/local/sbin/reportedip-sync.sh edge
ipset save > /etc/ipset.conf el servicio ipset de tu distribución, o simplemente ejecuta
el script de sincronización una vez al arrancar, antes de que se carguen las Firewall Rules; las reglas que aparecen a continuación hacen referencia a los
conjuntos por su nombre, por lo que un conjunto vacío fallará en modo abierto, no cerrado.
Reglas de iptables
Instálalas una vez, por ejemplo, en el archivo de configuración inicial de tu cortafuegos. Cada regla coincide con su propio conjunto en sus propios puertos.
ip6tables Replica las mismas reglas en los -v6 conjuntos.
# IPv4
iptables -I INPUT -p tcp --dport 22 -m set --match-set rip-ssh src -j DROP
iptables -I INPUT -p tcp -m multiport --dports 25,465,587,110,995,143,993 \
-m set --match-set rip-mail src -j DROP
iptables -I INPUT -p tcp -m multiport --dports 80,443 \
-m set --match-set rip-web src -j DROP
iptables -I INPUT -p tcp --dport 21 -m set --match-set rip-ftp src -j DROP
iptables -I INPUT -m set --match-set rip-edge src -j DROP
# IPv6
ip6tables -I INPUT -p tcp --dport 22 -m set --match-set rip-ssh-v6 src -j DROP
ip6tables -I INPUT -p tcp -m multiport --dports 25,465,587,110,995,143,993 \
-m set --match-set rip-mail-v6 src -j DROP
ip6tables -I INPUT -p tcp -m multiport --dports 80,443 \
-m set --match-set rip-web-v6 src -j DROP
ip6tables -I INPUT -p tcp --dport 21 -m set --match-set rip-ftp-v6 src -j DROP
ip6tables -I INPUT -m set --match-set rip-edge-v6 src -j DROP
nftables nativo
En sistemas con nftables (Debian 12, RHEL 9 y versiones posteriores lo utilizan por defecto), puedes prescindir por completo de ipset. Los
conjuntos con nombre se encuentran dentro del conjunto de reglas, y una inet tabla contiene direcciones IPv4 e IPv6 en paralelo, y
nft -f aplica todo un archivo como una única transacción: vacía y rellena en el mismo
paso atómico, sin conjunto temporal ni intercambio.
Configuración única
nft add table inet reportedip
nft add chain inet reportedip input '{ type filter hook input priority -10 ; policy accept ; }'
for l in ssh mail web ftp edge ; do
nft add set inet reportedip "rip-$l" '{ type ipv4_addr ; }'
nft add set inet reportedip "rip-$l-v6" '{ type ipv6_addr ; }'
done
nft add rule inet reportedip input tcp dport 22 ip saddr @rip-ssh drop
nft add rule inet reportedip input tcp dport 22 ip6 saddr @rip-ssh-v6 drop
nft add rule inet reportedip input tcp dport '{ 25, 110, 143, 465, 587, 993, 995 }' ip saddr @rip-mail drop
nft add rule inet reportedip input tcp dport '{ 25, 110, 143, 465, 587, 993, 995 }' ip6 saddr @rip-mail-v6 drop
nft add rule inet reportedip input tcp dport '{ 80, 443 }' ip saddr @rip-web drop
nft add rule inet reportedip input tcp dport '{ 80, 443 }' ip6 saddr @rip-web-v6 drop
nft add rule inet reportedip input tcp dport 21 ip saddr @rip-ftp drop
nft add rule inet reportedip input tcp dport 21 ip6 saddr @rip-ftp-v6 drop
nft add rule inet reportedip input ip saddr @rip-edge drop
nft add rule inet reportedip input ip6 saddr @rip-edge-v6 drop
Paso de actualización
Sustituye el bloque de ipset del script de sincronización por esto. Todo lo demás —recogida condicional, comprobación de tamaño , división por familia, registro— se mantiene tal cual.
# Single transaction: both families flushed and refilled, or nothing changes.
{
echo "flush set inet reportedip rip-$LIST"
echo "flush set inet reportedip rip-$LIST-v6"
[ -s "$BODY.v4" ] && printf 'add element inet reportedip rip-%s { %s }\n' \
"$LIST" "$(paste -sd, "$BODY.v4")"
[ -s "$BODY.v6" ] && printf 'add element inet reportedip rip-%s-v6 { %s }\n' \
"$LIST" "$(paste -sd, "$BODY.v6")"
} | nft -f -
Guarda el conjunto de reglas como de costumbre, por ejemplo:
nft list ruleset > /etc/nftables.conf
systemctl enable nftables
IPv6
La fuente devuelve IPv4 e IPv6 en la misma lista. IPv6 representa hoy en día una pequeña parte de ella —los atacantes siguen operando principalmente en v4—, pero no es cero, y es la parte de la lista que crece. De ello se derivan dos reglas:
- Nunca mezcles familias en un mismo conjunto de direcciones IP. Un
family inetconjunto rechaza todas las direcciones v6 con el mensaje «No se puede añadir el elemento al conjunto: no pertenece a la familia del conjunto», y un bucle ingenuo aborta toda la actualización en la primera línea v6. El script anterior divide el cuerpo antes de cargarlo, por lo que una entrada v6 nunca puede romper el conjunto v4. - Coincide con v6 de forma explícita.
iptablesreglas nunca detectan el tráfico IPv6. Sin las reglas de coincidenciaip6tables(o unainettabla nftables), un atacante con IPv6 operativo pasa por alto un conjunto de bloqueos perfectamente mantenido.
Bloquear una sola dirección v6 es poco eficaz por sí solo: una asignación /64 proporciona al atacante
direcciones prácticamente ilimitadas. Trata las entradas v6 como una señal del prefijo circundante: en caso de
abuso continuado, bloquea el /64 con un hash:net conjunto (ipset) o un conjunto con
flags interval (nftables), y mantén la lista por dirección para todo lo demás.
Cortafuegos en la nube y en el perímetro
Si el tráfico llega a una CDN o al perímetro de la nube antes de llegar a tu kernel, bloquearlo allí ahorra ancho de banda y conexión. La lista es la misma; solo difiere la forma de aplicación.
Cloudflare
Mantén una lista de IP personalizada a nivel de cuenta y haz referencia a ella desde una regla personalizada de WAF. El endpoint masivo
sustituye todos los elementos en una sola llamada, lo cual sigue el mismo principio de intercambio atómico que ipset swap. Las
listas personalizadas admiten direcciones individuales y rangos CIDR (IPv4 /8–/32, IPv6
/12–/128); el número de elementos y listas que puedas obtener depende de tu plan, así que
comprueba tu cuota antes de enviar una lista de 10 000 entradas.
# Replace all items of an existing list (returns an async operation id)
curl -sS -X PUT \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/rules/lists/$CF_LIST_ID/items" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data "$(jq -R -s 'split("\n") | map(select(length > 0) | {ip: .})' < "$BODY.v4")"
A continuación, una única regla personalizada de WAF se encarga del bloqueo, por ejemplo,
(ip.src in $rip_web) con la acción «Bloquear». Dado que la regla es una sola expresión, el
tamaño de la lista no afecta al recuento de reglas.
AWS
Utiliza un conjunto de IP de WAF, no grupos de seguridad ni listas de prefijos: un conjunto de IP admite hasta 10 000 direcciones o rangos CIDR
y se referencia mediante una sola regla, mientras que las entradas de los grupos de seguridad y las listas de prefijos se contabilizan individualmente
dentro de las cuotas de reglas por recurso y se agotan mucho antes de llegar a las 10 000. Las direcciones deben estar en notación CIDR,
por lo que las direcciones IP individuales necesitan un /32.
LOCK=$(aws wafv2 get-ip-set --scope REGIONAL --name rip-web --id "$IPSET_ID" \
--query 'LockToken' --output text)
aws wafv2 update-ip-set --scope REGIONAL --name rip-web --id "$IPSET_ID" \
--lock-token "$LOCK" \
--addresses $(sed 's|$|/32|' "$BODY.v4" | head -n 10000 | paste -sd' ')
Otros proveedores
Hetzner Cloud, los grupos de seguridad de Azure (NSG), las políticas de cortafuegos de GCP y la mayoría de los cortafuegos gestionados limitan el número de reglas o
CIDR por política muy por debajo de 10 000. Cuando el límite se agote, reserva el margen para la edge lista
(DDoS, Port Scan, Exploited Host —el conjunto más pequeño y claro—) y ejecuta las
listas de servicios en el kernel del host, donde el tamaño del conjunto no supone ningún coste.
Comprueba que funciona
# How many entries are live right now?
ipset list rip-ssh | head -n 8
nft list set inet reportedip rip-ssh | head -n 8
# Is a specific IP in the set?
ipset test rip-ssh 1.2.3.4
# What did the last sync do?
journalctl -t reportedip --since "2 hours ago"
# Are packets actually hitting the rule?
iptables -L INPUT -v -n --line-numbers | grep -i match-set
Antes de cambiar a DROP
- Whitelist primero tus propios rangos de direcciones, redes de gestión, sistemas de monitorización y de copias de seguridad en el
cortafuegos, independientemente de esta fuente. Basta con una
ACCEPTregla situada por encima del conjunto de reglas es suficiente. - Ejecuta cada lista en modo de solo registro durante 48 horas (
-j LOGen lugar de-j DROP, ologen lugar dedropen nftables) y comprueba qué se habría bloqueado. - Implementa una lista cada vez. Empieza por
ssh: tiene la señal de ataque más clara y el radio de impacto más reducido. - Mantén la comprobación de tamaño mínimo. Es la única protección que impide que una respuesta maliciosa borre tu protección.
- Si alguien denuncia que ha sido bloqueado, la evidencia correspondiente a cualquier dirección es pública en
https://reportedip.com/ip/<ip>/, y la eliminación de la lista se realiza a través de IP Delisting.
Solución de problemas
| Síntoma | Causa y solución |
|---|---|
401 o 403 |
Clave ausente, nombre de encabezado incorrecto o un nivel sin acceso al Threat Feed. Véase «Autenticación» |
El campo «Siempre» 304, el campo «Configurar» nunca se rellena |
Un archivo de etiquetas obsoleto de otra lista o con un formato diferente. Elimina
/var/lib/reportedip/etag-* y vuelve a ejecutarlo: las etiquetas son específicas de cada variante,
por lo que nunca se debe compartir un mismo archivo entre listas |
| No se puede añadir el elemento al conjunto: no pertenece a la familia del conjunto | Se están introduciendo direcciones IPv6 en un family inet conjunto. Divide el cuerpo por familia
tal y como hace el script |
| El conjunto no se puede eliminar: está en uso | Estás destruyendo el conjunto activo en lugar del conjunto temporal. Solo se
-tmp conjunto se destruye, tras el intercambio |
| La actualización tarda unos minutos | Una ipset add por línea. Utiliza ipset restore en una sola pasada,
como se muestra arriba |
| El conjunto queda vacío tras el reinicio | El contenido de ipset no se conserva de forma predeterminada. Ejecuta la sincronización al arrancar o guarda y restaura
/etc/ipset.conf |
| Los ataques continúan a pesar de un conjunto completo | El tráfico llega a través de IPv6, o una ACCEPT se aplica primero. Comprueba
el orden de las reglas con iptables -L INPUT -v -n --line-numbers |
Informa de los resultados
El uso de la lista es unidireccional. Los ataques que detecta tu propio servidor pueden volver a ella: una
acción predefinida de fail2ban envía cada bloqueo a POST /report con la Threat Category que
coincida con la «jail». Los informes solo consumen tu cuota diaria de informes, nunca la cuota de comprobación, y cada informe
refuerza las listas que obtienes. Consulta la
guía de integración de fail2ban.
Referencia rápida
| Endpoint | GET https://reportedip.com/wp-json/reportedip/v2/blacklist |
| Autenticación | X-Key: YOUR_API_KEY encabezado |
| Parámetros base | confidence=90&format=txt&limit=50000 |
| SSH | &category=22,18 |
| Correo | &category=11,7,17,18 |
| Web (incluido WordPress) | &category=21,16,10,19,12,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 |
| FTP | &category=5,18 |
| Edge | &category=4,14,20 |
| Actualización del servidor | cada 15 minutos |
| Frecuencia recomendada | cada hora por lista, de forma escalonada, con If-None-Match |
| Impacto en la cuota | ninguno: el Endpoint no cuenta ni para la cuota de comprobación ni para la de informes |
| Catálogo de categorías | GET /categories (sin autorización) |
Última actualización: · Mantenido por el equipo de ReportedIP