Configuración de reglas de firewall iptables para bloquear tráfico por geolocalización

Bloquear tráfico por geolocalización es una técnica común en servidores dedicados para mitigar ataques, reducir ruido de bots o cumplir políticas de acceso. En esta guía práctica y técnica explicaré cómo implementar bloqueo por país con iptables utilizando ipset (eficiente en rendimiento), alternativas (xt_geoip), automatización, problemas habituales con CDNs y recomendaciones legales y operativas.

Por qué usar ipset junto a iptables

iptables por sí solo realiza reglas por IP o rangos, pero cuando necesitas bloquear cientos de miles de prefijos de direcciones IP (lista por país) las reglas individuales son lentas y difíciles de mantener. ipset almacena conjuntos de redes en el kernel y permite a iptables hacer una única comprobación rápida contra ese conjunto, con coste prácticamente constante.

  • Rendimiento: búsquedas en ipset son O(1) en la práctica.
  • Mantenibilidad: un conjunto único por país en lugar de miles de reglas.
  • Flexibilidad: se pueden actualizar dinámicamente sin reescribir reglas iptables.

Requisitos previos

  • Acceso root al servidor dedicado.
  • Sistema Linux con soporte para ipset e iptables (Debian/Ubuntu/CentOS/RHEL).
  • Herramientas: ipset, iptables, curl/wget, cron o systemd para automatizar.

Instalación e inicio rápido

Ejemplo en Debian/Ubuntu:

apt update
apt install -y ipset iptables

En RHEL/CentOS: yum/dnf install ipset iptables-services. Asegúrate de que el módulo del kernel para ipset esté presente.

Crear un set y bloquear un país (ejemplo práctico)

Metodología: descargar lista de prefijos por país (CIDR), crear un ipset y añadir esas redes, luego añadir una regla iptables que bloquee las IPs contenidas en ese set.

1) Crear el ipset

ipset create blocked_countries hash:net family inet hashsize 4096 maxelem 65536

2) Poblar el ipset con las redes de un país

Las listas de CIDR por país se obtienen de fuentes públicas (por ejemplo, listados de IP por país). Un ejemplo de flujo (sin enlace directo obligatorio) sería descargar un archivo de CIDR y añadirlo:

curl -s -o /tmp/cn.zone https://example.com/cn.zone
for ip in $(cat /tmp/cn.zone); do
  ipset add blocked_countries $ip
done

Reemplaza la URL por la fuente que prefieras. Evita fuentes no fiables y verifica formato CIDR. No añadas duplicados: ipset los ignora si existen.

3) Añadir la regla iptables

iptables -I INPUT -m set --match-set blocked_countries src -j DROP
iptables -I FORWARD -m set --match-set blocked_countries src -j DROP

La regla anterior descarta paquetes entrantes cuyo origen pertenezca al set. Para tráfico web típico (puerto 80/443) también puedes añadir reglas específicas en la cadena INPUT o en una tabla de filtrado personalizada.

Automatizar la actualización de listas

Las asignaciones de IP por país cambian. Debes automatizar la descarga y la actualización del ipset con un script y cron o systemd. Ejemplo de script /usr/local/sbin/update-ipsets.sh:

#!/bin/bash
set -e
TMPDIR=/tmp/ipsets
mkdir -p $TMPDIR
COUNTRIES=(cn ru)
IPSET=blocked_countries
ipset create $IPSET hash:net family inet -exist
for c in "${COUNTRIES[@]}"; do
  curl -s -o $TMPDIR/${c}.zone https://example.com/${c}.zone
  ipset flush $IPSET
  for net in $(cat $TMPDIR/${c}.zone); do
    ipset add $IPSET $net -exist
  done
done
# optional: ipset save > /etc/ipset.conf

Programa este script en cron para que se ejecute diariamente. Para persistencia en reinicios usa ipset save y restaura en arranque o utiliza paquetes como ipset-persistent cuando estén disponibles.

Alternativa: xt_geoip (módulo del kernel)

Existe el módulo xt_geoip que permite usar la opción -m geoip --src-cc en iptables. Requiere compilar xtables-addons y generar bases de datos GeoIP. Es directo para reglas por país, pero menos flexible y más complejo de mantener que ipset. Si prefieres esa vía, revisa la documentación del proyecto xtables-addons.

Comprobación y solución de problemas

  • Ver ipset: ipset list blocked_countries.
  • Ver reglas iptables: iptables -L -n -v o iptables -S.
  • Probar desde una IP de prueba o usar tcpdump para verificar que paquetes desde la red bloqueada son descartados.
  • Si usas CDN (p. ej. Cloudflare), recuerda que las conexiones llegan desde proxies del CDN; en ese caso debes usar cabeceras X-Forwarded-For o el país que ofrece el CDN. Consulta la documentación del proveedor (por ejemplo, la explicación de propiedades de la petición en Cloudflare Docs).

Consideraciones de rendimiento y diseño

  • ipset es la opción recomendada para grandes listas de redes por su eficiencia.
  • Evita añadir cientos de reglas iptables por país; usa conjuntos agrupados.
  • Si necesitas bloquear en capa de aplicación (HTTP), considera soluciones en el WAF o CDN que ofrecen geoblocking gestionado (mejor para lógica de negocio y SEO).

Aspectos legales, SEO y de experiencia de usuario

Bloquear por país tiene implicaciones:

  • Impacto SEO: si bloqueas acceso de rastreadores o regiones donde posicionas, puedes perder tráfico orgánico. Usa reglas que no bloqueen bots legítimos (o permite UAs conocidos).
  • Legalidad: algunos países manejan normativas de exportación o protección de datos; consulta con legal antes de imponer bloqueos masivos.
  • Falsos positivos: IP geolocalizadas incorrectamente pueden bloquear usuarios legítimos. Mantén listas actualizadas y considera soluciones de mitigación (captcha, rate-limits) en vez de bloqueo total.

Mejores prácticas y checklist

  • Usa ipset para rendimiento y facilidad de mantenimiento.
  • Automatiza actualización diaria/semana y verifica cambios con logs.
  • Si usas CDN, valida la estrategia de geoblocking en la capa de borde (CDN/WAF) y respeta cabeceras de geolocalización.
  • Implementa logging selectivo antes de DROP para validar impacto (-j LOG con limitadores).
  • Documenta las reglas en control de cambios y ten un plan de reversión rápido.

Recursos y lecturas recomendadas

Para entender el concepto de geolocalización IP y sus limitaciones, consulta la entrada en Wikipedia sobre geolocation software. Para consideraciones de control de acceso y seguridad en aplicaciones revisa la guía de OWASP Access Control Cheat Sheet. Si usas proxies o CDN, revisa cómo exponen el país del origen en los encabezados en la documentación del proveedor, como las propiedades de petición de Cloudflare Docs.

Conclusión

Bloquear tráfico por geolocalización con iptables e ipset es una solución efectiva cuando necesitas filtrar grandes volúmenes de direcciones IP por país. ipset ofrece rendimiento y escalabilidad; la clave es mantener actualizadas las listas, automatizar procesos, y considerar alternativas menos disruptivas (CDN/WAF, rate limiting, CAPTCHA) cuando el bloqueo total pueda afectar negocio o SEO. Implementa logs antes del DROP, prueba en entornos controlados y documenta las reglas y su impacto. Con estos pasos tendrás una configuración sólida, eficaz y mantenible en un servidor dedicado.