Descarga IPs reportadas como maliciosas desde AbuseIPDB y las bloquea usando ipset + iptables. La lista se reemplaza completamente en cada ejecución mediante swap atómico, sin ventanas de desprotección.
Por qué ipset y no
ip route blackhole: El método de rutas blackhole acumula decenas de miles de entradas en la tabla de routing del kernel. Esto provoca quesystemd-networkdfalle al arrancar (timeout enumerando rutas), generando un crash loop que satura la CPU.ipsetalmacena las IPs en estructuras hash del kernel, totalmente ajenas a la tabla de rutas.
- Descarga la blacklist de AbuseIPDB con umbral de confianza configurable.
- Bloquea IPv4 e IPv6 (configurable).
- Swap atómico: el set activo nunca queda vacío durante la actualización.
- Las reglas
iptablesse crean automáticamente si no existen (idempotente). - Guarda
/etc/ipset.confpara restaurar los sets tras un reinicio. - Log en
/var/log/ban_abuseipdb.log.
curljqipsetiptables/ip6tables- Clave API de AbuseIPDB (obtenerla aquí)
sudo apt install curl jq ipset iptablessudo cp ban_abuseipdb.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/ban_abuseipdb.shEdita el script y reemplaza your_abuseipdb_api_key con tu clave API real:
sudo nano /usr/local/bin/ban_abuseipdb.shSeguridad: nunca subas el script con la API key real al repositorio. El repo contiene el placeholder
your_abuseipdb_api_key; la key real vive solo en el servidor. Una alternativa más segura es leerla desde una variable de entorno o un fichero externo:# En el servidor, crear /etc/abuseipdb.conf (root:root, 600) echo 'ABUSEIPDB_API_KEY=tu_clave_real' | sudo tee /etc/abuseipdb.conf sudo chmod 600 /etc/abuseipdb.confY en el script cambiar
API_KEY="your_abuseipdb_api_key"por:source /etc/abuseipdb.conf API_KEY="$ABUSEIPDB_API_KEY"
Primera ejecución:
sudo /usr/local/bin/ban_abuseipdb.shcrontab -eAñade estas dos líneas:
# Actualizar lista diariamente a las 5 AM
0 5 * * * /usr/local/bin/ban_abuseipdb.sh
# Restaurar ipsets tras reinicio (los sets se pierden al apagar)
@reboot sleep 30 && sudo ipset restore < /etc/ipset.conf 2>/dev/null || true
IPs bloqueadas actualmente:
sudo ipset list abuseipdb | grep "Number of entries"
sudo ipset list abuseipdb6 | grep "Number of entries"Ver IPs en el set:
sudo ipset list abuseipdb | head -20Reglas iptables activas:
sudo iptables -L INPUT | grep abuseipdb
sudo iptables -L FORWARD | grep abuseipdbLog en tiempo real:
tail -f /var/log/ban_abuseipdb.log- Requiere privilegios de root.
- La blacklist de AbuseIPDB tiene límite de descargas según el plan (normalmente 1/día en free).
- Las reglas
iptablesbloquean tantoINPUTcomoFORWARD(útil si el servidor actúa como router/gateway). - Los sets
ipsetse pierden al reiniciar; el@rebootdel cron los restaura desde/etc/ipset.conf.
Thanks to AbuseIPDB por el increíble servicio!
Thanks to xRuffKez por la idea y la base del script!
CC BY-NC-SA 4.0 — Compartir con atribución, sin uso comercial. Consulta LICENSE para más detalles.
Desarrollado por Hugo Perez-Vigo · @hugopvigo