Si vous êtes la cible d'attaque DDoS ou de bots, il peut être intéressant de bloquer des adresses IP par pays pour bloquer l'attaquant, par exemple en bannissant les IP chinoises, souvent source de réseau de bots. Dans ce guide, nous allons voir comment procéder sur un VPS linux sous Debian, Ubuntu ou CentOS.

Installer IPSET

Pour bannir des les adresses IP des pays que nous souhaitons, nous allons utiliser ipset disponible dans le gestionnaire de paquet. Vous devez être administrateur root de votre VPS.

Installation IPSET sur Debian

apt update && apt install ipset

Installation IPSET sur Ubuntu

sudo apt update && sudo apt install ipset

Installation IPSET sur CentOS

sudo yum install ipset

Bannir des pays avec IPSET

Maintenant que ipset est présent sur notre système d'exploitation, nous allons le configurer pour bannir les adresses IP des pays que nous souhaitons.

Tout d'abord, on va créer un ensemble qui va contenir les pays dont nous voulons ban les adresses IP.

ipset create countries hash:net,port

Vous pouvez vérifier la création avec ipset list qui doit vous renvoyer:

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:

On ajoute maintenant les adresses IP des pays que nous souhaitons avec le script suivant. Ce script va récupérer la liste de toutes les adresses IP des pays que nous lui demandons.

Créez un fichier ban-ip-countries.sh dans /root/ipset et donnez lui les droits d'éxécutions :

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

Il ne nous reste plus qu'à créer le script de récupération des IP à bannir.

Ajoutez maintenant le contenu suivant avec la commande nano /root/ipset/ban-ip-countries.sh. Éditez le tableau dans la section COUNTRIES si vous voulez bannir d'autres pays. Vous devez indiquer le code format ISO du pays, voir site officiel.

Dans cet exemple, la variable COUNTRIES contient les pays: Chine, Russie, Taiwan, Brésil

COUNTRIES=('cn' 'tw' 'ru' 'in' 'br')

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
    done
done

Appuyez sur les touches CTRL + X pour quitter l'éditeur et sauvegarder le fichier.

Il ne nous reste plus qu'à exécuter le script:

bash ban-ip-countries.sh

Maintenant que nous avons la liste des IP à bannir, il ne nous reste qu'à faire le lien avec le firewall iptables. Créez un fichier /root/iptables.sh :

touch /root/iptables.sh
chmod +x /root/iptables.sh

Editez le fichier avec nano /root/iptables.sh et ajoutez le contenu suivant:

# On vide les règles iptables précédentes
iptables -F
iptables -X

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

Appuyez sur les touches CTRL + X pour quitter l'éditeur et sauvegarder le fichier.

Dernière étape, nous devons exécuter ce dernier script:

bash /root/iptables.sh

Et voila, les IPs sont bannies!