LinuxParty

Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

iptables, ipset, Apache, Nginx y Cloudflare

En determinadas situaciones —escaneos automáticos, bots, intentos de fuerza bruta o picos de tráfico sospechoso— puede ser útil bloquear temporalmente el acceso desde determinados países a un servidor Linux.

Este artículo explica cómo hacerlo correctamente, en distintos niveles, empezando por la opción más baja y eficaz (firewall), y continuando con alternativas a nivel web y CDN.


¿Qué necesito tener instalado?

Para el bloqueo a nivel de firewall (opción recomendada), necesitas:

  • iptables → motor clásico de filtrado de paquetes en Linux
  • ipset → gestor de conjuntos de IPs/redes, optimizado para grandes listas

En la mayoría de servidores Linux:

  • iptables ya está instalado
  • ipset suele estar disponible en repositorios oficiales

Instalación típica:

Debian / Ubuntu

apt install ipset iptables

RHEL / CentOS / Alma / Rocky

dnf install ipset iptables

Concepto clave: ipset + iptables

Antes de ver comandos, es importante entender el concepto:

  • ipset mantiene listas de IPs o redes (muy grandes si hace falta)
  • iptables solo pregunta:
    “¿Esta IP está dentro de este conjunto?”

Ejemplo:

--match-set china src

👉 china NO es algo mágico ni automático
👉 Es simplemente el nombre de un ipset creado por el administrador


Paso 1️⃣ Crear el conjunto (hash) de IPs por país

Primero se crea el conjunto vacío.
Para países, el tipo más habitual es hash:net (admite redes completas).

Ejemplo: China

ipset create china hash:net

Otros ejemplos:

ipset create iran   hash:net
ipset create russia hash:net
ipset create israel hash:net

En este punto:

  • El conjunto existe
  • Pero está vacío

Paso 2️⃣ Consultar el conjunto (antes de rellenarlo)

Es buena práctica comprobar su estado:

ipset list china

Salida típica:

Name: china
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16536
References: 0
Number of entries: 0

Esto confirma que:

  • El ipset está creado
  • Aún no contiene IPs

Paso 3️⃣ Rellenar el ipset con rangos IP

¿De dónde salen las IPs por país?

Los rangos IP oficiales se obtienen de los Registros Regionales de Internet (RIR).
Uno de los más usados es APNIC, que publica listados por país (CN, IR, RU, IL, etc.).

Formato típico:

apnic|CN|ipv4|1.0.1.0|256|assigned

Con estos datos se generan rangos CIDR y se cargan en ipset.

Ejemplo manual (simplificado)

ipset add china 1.0.1.0/24
ipset add china 1.0.2.0/23

⚠️ En producción esto suele hacerse:

  • Con scripts
  • De forma automática
  • Actualizado periódicamente

Paso 4️⃣ Consultar el contenido del ipset

Una vez cargado:

ipset list china

Ahora verás:

  • El número de entradas
  • Los rangos IP actualmente asociados al país

Esto es la referencia real de qué IPs se consideran “China” para el firewall.


Paso 5️⃣ Usar el ipset en iptables (bloqueo real)

 

Ahora sí, aplicamos la regla de firewall.

Bloqueo silencioso (sin logs)

iptables -I INPUT -m set --match-set china src -j DROP

A partir de este momento:

  • Cualquier IP incluida en el ipset china
  • Será descartada antes de llegar a servicios como Apache, SSH, etc.

Paso 6️⃣ Logging: silencioso o con registro

Opción A) Silencioso (recomendado por defecto)

  • No genera logs
  • No llena disco
  • Ideal para bloqueos prolongados

Se usa simplemente DROP.


 

Opción B) Con logging (útil para análisis)

 

Si quieres ver qué IPs están siendo bloqueadas, añade una regla de log antes del DROP:

iptables -I INPUT -m set --match-set china src \
  -j LOG --log-prefix "IPTABLES-CHINA: " --log-level 4

Después, el DROP:

iptables -A INPUT -m set --match-set china src -j DROP

¿Dónde se consultan estos logs?

Depende del sistema:

  • Sistemas con systemd:
journalctl -k | grep IPTABLES-CHINA
  • Debian / Ubuntu:
/var/log/syslog
  • RHEL / CentOS / Alma / Rocky:
/var/log/messages

Ejemplo de log:

IPTABLES-CHINA: IN=eth0 SRC=1.2.3.4 DST=...

 

⚠️ Recomendación:
Usar logging solo de forma temporal para evitar crecimiento excesivo de logs.


 

Opción 2️⃣ Bloqueo solo a nivel Web (Apache / Nginx)

 

Si no quieres bloquear todo el servidor, sino únicamente el acceso HTTP/HTTPS, puedes hacerlo desde el servidor web.


Apache (GeoIP / MaxMind)

 

Ejemplo clásico:

SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
Deny from env=BlockCountry

¿Dónde se configura esto?

 

Opción recomendada:
En el VirtualHost o en un bloque <Directory> del sitio.

Ejemplo:

<VirtualHost *:80>
  ServerName linuxparty.tld

  SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
  Deny from env=BlockCountry
</VirtualHost>

📍 Ubicaciones habituales:

  • Debian/Ubuntu: /etc/apache2/sites-available/
  • RHEL-like: /etc/httpd/conf.d/

 

⚠️ También puede ponerse en .htaccess, solo si:

  • AllowOverride lo permite
  • Los módulos GeoIP/MaxMind están activos

Nginx (GeoIP)

Ejemplo:

if ($geoip_country_code = CN) {
    return 444;
}

Esto se coloca dentro del server {} correspondiente al sitio web.


 

Opción 3️⃣ Bloqueo por país con Cloudflare

Si tu Web está detrás de Cloudflare:

  • Firewall Rules / WAF
  • Condición: Country = CN (o IR, RU, IL…)
  • Acción: Block

 

Ventajas:

  • No consume recursos del servidor
  • Activación/desactivación inmediata
  • Logs claros desde el panel


¿Quieres automatizar y saber de dónde conseguir las IPs a bloquear?

Mira nuestro artículo: Automatización del bloqueo por País, en Linux.

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