LinuxParty
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:
iptablesya está instaladoipsetsuele 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:
AllowOverridelo 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.

-
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



