LinuxParty
Scripts con APNIC, cron y firewalld
En el artículo anterior vimos cómo bloquear accesos por país usando iptables e ipset, creando los conjuntos manualmente.
En entornos reales, lo habitual es automatizar todo el proceso para que las listas de IP se mantengan actualizadas sin intervención manual.
En este artículo veremos:
- Cómo descargar rangos IP oficiales desde APNIC
- Cómo generar automáticamente ipsets por país
- Cómo actualizar las listas con
cron - Cómo integrar este método con
firewalld
¿Por qué automatizar?
Los rangos IP cambian con el tiempo:
- Nuevas asignaciones
- Reasignaciones
- Cambios de tamaño de red
Si el ipset no se actualiza:
- Se pierden IPs nuevas
- Se bloquean rangos obsoletos
- La eficacia baja con el tiempo
👉 Automatizar garantiza bloqueos coherentes y mantenidos.
Fuente oficial de datos: APNIC
APNIC publica un fichero plano con todas las asignaciones:
- IPv4
- IPv6
- Por país
- Actualizado diariamente
Formato típico de línea:
apnic|CN|ipv4|1.0.1.0|256|assigned
Esto significa:
- País: CN
- Tipo: IPv4
- IP inicial: 1.0.1.0
- Número de IPs: 256
Script básico para generar ipsets por país
Ejemplo: China (CN)
Script simple en bash:
#!/bin/bash COUNTRY="CN" SETNAME="china" APNIC_URL="https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest" # Crear el ipset si no existe ipset create $SETNAME hash:net -exist # Vaciar el conjunto antes de recargar ipset flush $SETNAME # Descargar y procesar rangos IPv4 curl -s $APNIC_URL | \ grep "|$COUNTRY|ipv4|" | \ awk -F'|' '{print $4 "/" int(log($5)/log(2))}' | \ while read net; do ipset add $SETNAME $net -exist
Este script:
- Descarga los datos oficiales
- Filtra por país
- Calcula la máscara CIDR
- Rellena automáticamente el ipset
Adaptar el script a otros países
Solo hay que cambiar dos variables:
Irán
COUNTRY="IR"
SETNAME="iran"
Rusia
COUNTRY="RU"
SETNAME="russia"
Israel
COUNTRY="IL"
SETNAME="israel"
Puedes tener:
- Un script por país
- O un script que recorra varios países
Comprobación tras la carga automática
Ver contenido del ipset:
ipset list china
Ver número de entradas:
ipset list china | grep "Number of entries"
Esto confirma que:
- El script funciona
- Los datos se han cargado correctamente
Aplicar iptables una sola vez
Las reglas de iptables no necesitan recrearse cada vez.
Ejemplo:
iptables -I INPUT -m set --match-set china src -j DROP
Mientras el ipset se actualice:
- La regla sigue funcionando
- El firewall usa siempre la lista actual
Logging en entornos automatizados
Logging temporal (diagnóstico)
iptables -I INPUT -m set --match-set china src \
-j LOG --log-prefix "IPTABLES-CHINA: " --log-level 4
Consulta:
journalctl -k | grep IPTABLES-CHINA
Producción recomendada
- Quitar el LOG
- Mantener solo
DROP - Evitar crecimiento innecesario de logs
Automatización con cron
Guardar el script, por ejemplo en:
/usr/local/sbin/update-ipset-china.sh
Dar permisos:
chmod +x /usr/local/sbin/update-ipset-china.sh
Editar cron:
crontab -e
Ejemplo: actualización diaria a las 03:30
30 3 * * * /usr/local/sbin/update-ipset-china.sh
Esto mantiene el ipset siempre actualizado sin intervención manual.
Integración con firewalld
En sistemas modernos, firewalld suele estar activo.
Crear el ipset en firewalld
firewall-cmd --permanent --new-ipset=china --type=hash:net
Añadir regla de bloqueo
firewall-cmd --permanent \
--add-rich-rule='rule source ipset=china drop'
Recargar configuración
firewall-cmd --reload
Consultar
firewall-cmd --info-ipset=china
👉 El script de carga de IPs sigue siendo válido, solo cambia el backend.
¿Firewall, Apache/Nginx o Cloudflare?
Recordatorio rápido:
- Firewall (iptables/ipset)
Bloquea todo el tráfico, más eficiente - Apache / Nginx
Bloquea solo la web, útil si no quieres afectar otros servicios - Cloudflare
Ideal si lo usas: rápido, visual, sin carga en el servidor
En servidores públicos como LinuxParty, lo más habitual es:
- Firewall para ruido masivo
- Web server para ajustes finos
- Cloudflare si está disponible
¿Cómo saber si el bloqueo funciona con iptables -L -n?
Cuando ejecutas:
iptables -L -n
iptables te muestra las reglas cargadas, pero no siempre es suficiente para confirmar actividad. Hay que fijarse en detalles concretos.
1️⃣ Lo primero: entender qué muestra iptables -L -n
Salida típica simplificada:
Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 1.0.0.0/8 0.0.0.0/0
Esto solo indica:
- Que la regla existe
- Que está cargada en el firewall
👉 NO confirma aún que se esté usando
2️⃣ La clave real: contadores de paquetes y bytes
Para saber si una regla está actuando, necesitas ver los contadores.
Usa:
iptables -L -n -v
La opción -v (verbose) es fundamental.
Ejemplo real con ipset
Chain INPUT (policy ACCEPT 123K packets, 45M bytes) pkts bytes target prot opt in out source destination 342 20560 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 match-set china src
¿Qué significa esto?
- pkts → paquetes bloqueados
- bytes → volumen total bloqueado
- match-set china src → está usando el ipset
👉 Si los números aumentan con el tiempo, la regla está funcionando.
3️⃣ Cómo comprobarlo en tiempo real
Ejecuta varias veces:
watch -n 2 iptables -L INPUT -n -v
Si ves que:
pktsybytessuben
✔️ El bloqueo está activo y recibiendo tráfico
4️⃣ ¿Y si los contadores están a cero?
Posibles causas (todas habituales):
🔹 Aún no hay tráfico desde ese país
Totalmente normal.
🔹 La regla está en una cadena que no se usa
Comprueba que:
- Es
INPUT(para tráfico entrante al servidor) - No estás usando solo
FORWARD
🔹 firewalld está gestionando las reglas
Si usas firewalld:
firewall-cmd --state
En ese caso, iptables -L puede no reflejar lo que crees.
5️⃣ Confirmación adicional con LOG (opcional)
Si añadiste la regla de log:
iptables -I INPUT -m set --match-set china src \ -j LOG --log-prefix "IPTABLES-CHINA: " --log-level 4
Entonces puedes confirmar actividad con:
journalctl -k | grep IPTABLES-CHINA
Salida típica:
IPTABLES-CHINA: IN=eth0 SRC=1.2.3.4 DST=...
👉 Esto es prueba definitiva de que la regla está funcionando.
6️⃣ Ver solo reglas relacionadas con ipset
Filtrar la salida ayuda mucho:
iptables -L -n -v | grep match-set
O directamente:
iptables -L INPUT -n -v | grep china
7️⃣ Detalle importante: orden de las reglas
iptables evalúa de arriba a abajo.
Comprueba posiciones con numeración:
iptables -L INPUT -n -v --line-numbers
Ejemplo:
1 342 20560 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 match-set china src
👉 Si la regla está muy abajo, puede que otra regla esté aceptando antes el tráfico.
8️⃣ Resumen rápido.
✔️ iptables -L -n → ves que la regla existe
✔️ iptables -L -n -v → ves si se usa (contadores)
✔️ watch iptables -L INPUT -n -v → confirmación en tiempo real
✔️ journalctl -k | grep IPTABLES-CHINA → prueba con logs
✔️ Contadores subiendo = bloqueo activo

-
Seguridad
- Bloquear accesos por país a tu Web, cómo hacerlo en Servidores Linux
- Hackers rusos utilizan Hyper-V para ocultar malware de Linux en sistemas Windows
- Utilizar ssh sin contraseña con ssh-keygen y ssh-copy-id
- Configuración paso a paso de una NAT con los iptables
- Snort para Windows, detección de Intrusos y seguridad.
- Detectar ROOTKITS en Linux
- 20 Ejemplos IPTables para nuevos Administradores de Sistemas
- IPTABLES para evitar ataques de Denegación de Servicio (DDoS)
- mod_security y mod_evasive en Linux para CentOS / RedHat
- Un Windows XP sin protección y conectado a Internet: el experimento que demuestra por qué no deberías hacerlo
- Contraseñas Aleatorias en Internet: Cómo Crear Claves Seguras Sin Complicarte
- DuckDuckGo ahora te permite ocultar imágenes generadas por IA en los resultados de búsqueda



