Skip to main contentSkip to footer

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.

¿No es lo que necesitas? Para proteger un único sitio de WordPress, instala en su lugar el complemento Hive : este realiza las consultas por solicitud, sin necesidad de configurar el cortafuegos. Para evaluar el correo entrante, consulta la DNS / RBL Zone en lugar de descargar listas. Los formatos de archivo y el espejo de GitHub se describen en la página de la Blacklist .

Cómo funciona

1

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.

2

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.

3

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:

text
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.

bash
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ámetroValorPor 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.

confidenceTamaño habitualSe 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

  1. 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.
  2. Devuelve el ETag. Almacena el ETag encabezado de respuesta de cada lista y devuelve If-None-Match; una lista sin cambios responde 304 Not Modified con 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.
  3. 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.
  4. 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.
  5. 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.

bash
#!/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:

bash
chmod 750 /usr/local/sbin/reportedip-sync.sh
cron
# /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
Los conjuntos no se conservan tras un reinicio. Haz que se mantengan con 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.

bash
# 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

bash
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.

bash
# 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:

bash
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 inet conjunto 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. iptables reglas nunca detectan el tráfico IPv6. Sin las reglas de coincidencia ip6tables (o una inet tabla 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.

bash
# 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.

bash
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

bash
# 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 ACCEPT regla situada por encima del conjunto de reglas es suficiente.
  • Ejecuta cada lista en modo de solo registro durante 48 horas (-j LOG en lugar de -j DROP, o log en lugar de drop en 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íntomaCausa 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

EndpointGET https://reportedip.com/wp-json/reportedip/v2/blacklist
AutenticaciónX-Key: YOUR_API_KEY encabezado
Parámetros baseconfidence=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 servidorcada 15 minutos
Frecuencia recomendadacada hora por lista, de forma escalonada, con If-None-Match
Impacto en la cuotaninguno: el Endpoint no cuenta ni para la cuota de comprobación ni para la de informes
Catálogo de categoríasGET /categories (sin autorización)

Última actualización: · Mantenido por el equipo de ReportedIP

Security Focused
Conforme al RGPD
Made in Germany
Volver a la documentación