Foro de Alcance Libre

Categoría General Linux => Seguridad en Linux => Mensaje publicado por: Joel Barrios en Dic 17, 2025, 10:14 AM

Título: Receta rápida para bloquear bloques de direcciones por países con firewalld.
Publicado por: Joel Barrios en Dic 17, 2025, 10:14 AM
Hay poca documentación al respecto, pero tengo una siguiente receta basándome sobre el excelente artículo de IfThenElse en linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist (https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist).

Lo primero es evaluar si un mal comportamiento o un incidente amerita realmente bloquear todo un país, aunque éste esté geográfica y culturalmente alejado. Bloquear un país completo puede ser una práctica de seguridad demasiado agresiva.

1. Descargar http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz (http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz)

wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
2. Descomprimir 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 po país.

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

3. Crear una lista negra en firewalld:

firewall-cmd --permanent --new-ipset=blacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000
Donde --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; --option=hashsize=4096 indica el tamaño inicial de la lista; y --option=maxelem indica el tamaño máximo de la lista.

4. Añadir esta lista negra a la zona drop de firewalld:

firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
La zona drop de firewalld tiene como política predeterminada descartar todas las conexiones.

5. Recargar configuración de firewalld:

firewalld --reload
6. Elegir un país para bloquear. Dentro de /usr/local/share/data-countries están 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 Rusia, 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 Rusia tiene más de 11 mil líneas correspondientes a 11 mil bloques de direcciones IP.

Si sólo se quiere bloquea individualmente un bloque de direcciones a la vez, se puede ejecutar 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 de Georgia:

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

Asumiendo que se quiere bloquear Rusia (+11000 bloques de direcciones IP), este sería el procedimiento:

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

Asumiendo que se quiere bloquear Ucrania (+2800 bloques de direcciones IP), este sería el procedimiento:

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

Asumiendo que se quiere bloquear Georgia (+320 bloques de direcciones IP), este sería el procedimiento:

firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=/usr/local/share/data-countries/ge.zone
firewallcmd --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.

NOTA: 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

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.

#############

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.

1. Descargar y descomprimir el archivo con las zonas.

2. Crear una lista negra en firewalld especificando que el tipo serán direcciones IP en lugar de bloques de direcciones IP:

firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip --option=family=inet --option=hashsize=4096 --option=maxelem=200000
3. Añadir esta lista negra a la zona drop de firewalld:

firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
4. Añadir individualmente direcciones IP del siguiente modo:

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

Este último procedimiento es menos agresivo que bloquear por país y se puede gestionar desde la interfaz gráfica firewall-config.