Bloquear IPs por país en Linux con IPSET

Existen varias opciones para bloquear el acceso al servidor, tanto a un puerto, por ejemplo el 80, el 22 ó cualquier otro en un servidor Linux. La más sencilla pasa por utilizar IPSET. Para ello basta con seguir una serie de pasos muy sencillos:

1. Instalar IPSET:

~#apt update && apt install ipset

2. Una vez instalado creamos la variable que contendrá las entradas de todos los países que queremos bloquear:

~#ipset create countries hash:net,port

3. Comprobamos que se ha creado correctamente:

~#ipset list
Name: countries
Type: hash:net,port
Revision: 7
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 448
References: 0
Number of entries: 0
Members:

4. Ahora añadimos las IPs y los puertos de los países que queremos bloquear. Para ello vamos a crear un pequeño script para extraerlas:

~#mkdir /root/ipset
~#cd /root/ipset
~#touch /root/ipset/ban-ip-countries.sh
~#chmod +x /root/ipset/ban-ip-countries.sh

5. Ahora editamos el archivo con el editor que más nos guste, por ejemplo vim o nano:

~#nano /root/ipset/ban-ip-countries.sh
COUNTRIES=('cn' 'ru' 'in')
ipset flush countries
for i in "${COUNTRIES[@]}"; do
    echo "Ban IP of country ${i}"
    for IP in $(wget -O - https://www.ipdeny.com/ipblocks/data/countries/${i}.zone)
    do
        ipset add countries $IP,22 #En este caso el puerto 22 pero podemos poner más
    done
done

6. Ahora lo ejecutamos:

~#bash ban-ip-countries.sh

7. Una vez ejecutado se habrán generado todas la lista de reglas para todas las IPs/puertos de estos países. Solo queda añadirla las reglas a iptables:

iptables -I INPUT   -m set --match-set countries src -j DROP
iptables -I FORWARD -m set --match-set countries src -j DROP

Fuente: https://mtxserv.com/vps-server/doc/how-to-block-ip-addresses-by-country