LinuxParty

Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

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:

  • pkts y bytes suben
    ✔️ 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

No estás registrado para postear comentarios



Redes:



   

 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Top 15 artículos por Fecha

Viendo artículos de: Enero de 2026

Filtro por Categorías