🚧 Bloquear el acceso hacia servidores por país suele ser una práctica de seguridad relativamente común para quienes administran servidores. Habrá quienes propongan hacerlo con iptables —ya considerado obsoleto— por mera costumbre. La mayoría de las distribuciones Linux actuales utilizan FirewallD que emplea nftables —sucesor de iptables— en combinación con ipset y otras herramientas.

⚠️ Consideración importante: Lo primero será evaluar si el mal comportamiento de un usuario o un incidente específico amerita realmente bloquear todo un país, aunque éste se encuentre geográfica y culturalmente alejado de uno. Bloquear un país completo se considera una práctica de seguridad demasiado agresiva.

🛠️ Procedimientos.

Los procedimientos son relativamente sencillos si se tiene algo de experiencia utilizando FirewallD. La realidad es que hay poca documentación oficial al respecto, pero a continuación presento dos procedimientos basándome sobre el excelente artículo en inglés de IfThenElse en Linode.com, que realmente hace más simples las cosas.

⚠️ NOTA: Todos los procedimientos deben ejecutarse como usuario root.

📋 Preparación del entorno

Por favor, recomendamos leer y practicar primero la configuración y uso de FirewallD como se explica en el siguiente documento hospedado en nuestro sitio:

Procedimiento 1: poner en lista negra bloques de direcciones completos por país.

🌍 Descargue el archivo de bloques de direcciones por país:

wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz

🖥️ Descomprima este archivo en un directorio permanente. Realmente la ruta es poco relevante, pero sugiero utilizar un directorio estandarizado para poder recordar dónde estarán los archivos de zona por país.

mkdir -p /usr/share/local/data-countries
tar zxf all-zones.tar.gz -C /usr/local/share/data-countries

🖥️ Genere una lista negra en FirewallD ejecutando lo siguiente:

firewall-cmd --permanent --new-ipset=blacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000

🔍 Parámetros explicados:

  • --permanent → implica que se trata de un cambio permanente en FirewallD
  • --new-ipset=blacklist → crea una lista de direcciones IP que se denominará blacklist
  • --type=hash:net → especifica que el almacenamiento de datos de la lista serán bloques de direcciones
  • --option=family=inet → especifica que las direcciones serán tipo IPv4, utilice inet6 para IPv6
  • --option=hashsize=4096 → indica el tamaño inicial de la lista
  • --option=maxelem → indica el tamaño máximo de la lista, en el ejemplo anterior se definen 200 mil registros

🖥️ Asocie esta lista negra recién creada a la zona drop de FirewallD ejecutando lo siguiente:

firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist

🖥️ NOTA: La zona drop de FirewallD tiene como política predeterminada descartar todas las conexiones.

Recargue configuración de firewalld ejecutando lo siguiente:

firewalld --reload

Elegir un país para añadir a lista negra.

📁 Dentro de /usr/local/share/data-countries estarán los archivos con las las listas de bloques de direcciones por país. Cada país tiene un archivo *.zone usando el código ISO-3166 para el nombre del archivo. Ejemplo: si se quiere bloquear a la Federación Rusa, el archivo que corresponde es ru.zone.

Hay que tomar en cuenta que casi todos estos archivos tienen cientos e incluso miles de líneas, por lo que cargar las listas hará que demore un poco en iniciar o recargar FirewallD. El archivo correspondiente a Federación Rusa tiene más de 11 mil líneas correspondientes a 11 mil bloques de direcciones IP.

Añadir alista negra un bloque de direcciones IP específico.

Si sólo se quiere poner en lista negra de manera individual un bloque de direcciones específico a la vez, se puede ejecutar algo similar a lo siguiente, donde en el ejemplo se añade a la lista negra el bloque 213.108.134.0/24 correspondiente a uno de los más de 320 bloques asignados a la República de Georgia:

firewall-cmd --permanent --ipset=blacklist --add-entry=213.108.134.0/24
firewall-cmd --reload

Añadir alista negra un país en específico.

🖥️ Asumiendo que se quiere bloquear a toda la Federación Rusa (+11000 bloques de direcciones IP), ejecute lo siguiente:

firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=/usr/local/share/data-countries/ru.zone
firewall-cmd --reload

🖥️ Asumiendo que se quiere bloquear a toda la República de Ucrania (+2800 bloques de direcciones IP), ejecute lo siguiente:

firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=/usr/local/share/data-countries/ua.zone
firewall-cmd --reload

¿Por qué menciona a la Federación Rusa y la República de Ucrania? Porque —al menos hasta diciembre de 2025— la gran mayoría de los ataques cibernéticos provienen de estos dos países. Aunque puedo citar también como importantes fuente de ataques cibernéticos a Iran (archivo /usr/local/share/data-countries/ir.zone) e Israel (archivo /usr/local/share/data-countries/il.zone).

🖥️ Asumiendo que se quiere bloquear a toda la República de Georgia (+320 bloques de direcciones IP), ejecute lo siguiente:

firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=/usr/local/share/data-countries/ge.zone
firewall-cmd --reload

📁 Hay que tener presente que mientras más bloques de direcciones se añadan a la lista negra, más demorará en iniciar o recargar configuración FirewallD.

⚠️ ADVERTENCIA: La interfaz gráfica firewall-config puede que se vuelva difícil o imposible de utilizar si se añaden demasiados bloques de direcciones.

El procedimiento crea dos nuevos archivos en FirewallD:

📁 /etc/firewalld/ipsets/blacklist.xml
📁 /etc/firewalld/zones/drop.xml

⚠️ IMPORTANTE: Se puede revisar el contenido de éstos, aunque se recomienda evitar modificarlos con editor de texto. Éstos se deben gestionar exclusivamente a través de firewalld-cmd para evitar corromper la configuración.

Procedimiento 2: poner en lista negra direcciones IP individuales.

Si se puede hacer algo más simple cambiando el procedimiento y haciéndolo por direcciones IP en ligar de bloques de direcciones, de modo similar a como lo hace Fail2ban. Si así se prefiere, hágase este procedimiento en lugar del anterior que involucra enromes listas de bloques de direcciones IP.

Igualmente descargue y descomprima el archivo con las zonas en un directorio estandarizado.

wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
mkdir -p /usr/share/local/data-countries
tar zxf all-zones.tar.gz -C /usr/local/share/data-countries

🖥️ Genere una lista negra en firewalld especificando que el tipo serán direcciones IP ejecutando lo siguiente:

firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip --option=family=inet --option=hashsize=4096 --option=maxelem=200000

🔍 NOTA: el cambio relevantes es utilizar--type=hash:ip —que corresponde a direcciones IP individuales— en lugar de --type=hash:net —que corresponde a bloques de direcciones IP.

🖥️ Asocie esta lista negra a la zona drop de firewalld ejecutando lo siguiente:

firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist

🖥️ Añada direcciones IP de forma granular ejecutando algo similar al siguiente ejemplo:

firewall-cmd --permanent --ipset=blacklist --add-entry=213.108.134.27
firewall-cmd --reload

Este último procedimiento es menos agresivo que bloquear todo un país completo e incluso se puede gestionar fácilmente desde la interfaz gráfica firewall-config.

🔚 Conclusión

  • Usa el Procedimiento 1 (hash:net) si necesita un bloqueo amplio y por países completos (más agresivo y pesado).
  • Usa el Procedimiento 2 (hash:ip) para un control fino y reactivo, similar a Fail2ban (recomendado para la mayoría de los casos).

Ambos métodos son eficaces para incrementar la seguridad de cualquier servidor. La elección depende de la severidad de la amenaza y los recursos disponibles.

📚 Bibliografía

Fuente: linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist

Siguiente Entrada Entrada Anterior