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.