Mes passions, le boulots, mes coups de gueule...




IPtables + IPset : Bannir des grandes listes d’IP extraites de plusieurs sites

Catégories : Geek, Informatique, Linux, Raspberry Pi · par 28 Mai 2018

Introduction

Comme on l’a vu dans cet article, il est possible d’extraire, puis de bloquer, une liste d’IP extraite d’un site comme https://www.blocklist.de/

Malheureusement, lorsque ces listes contiennent plusieurs milliers d’occurrences, IPtables peine à les ajouter une à une. La cadence d’ajout passe de plusieurs dizaines d’IP à la seconde à plusieurs secondes par IP au fur et à mesure de l’avancement de la tâche.


Voici d’autres articles de mon blog qui traitent du même sujet :

IPset

Présentation

IPset a été introduit dans la version 2.6.32 du noyau GNU/Linux et est pris en charge dans Debian 7 et 8, ainsi que dans Red Hat 6 et suivants.

Il permet de stocker des adresses IP, des réseaux, des numéros de port (TCP/UDP), des adresses MAC, des noms d’interfaces ou des combinaisons de ceux-ci.

Comme il utilise une table de hachage pour stocker/récupérer les adresses IP, la recherche est beaucoup plus rapide que des milliers de règles d’interdiction d’IPtables analysées séquentiellement.

Cependant, une liste IPset est limitée à 2^16 entrées (65536).

Installation

Pour installer IPset, nous allons utiliser ces commandes :

$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get install ipset

Ce qui va probablement nous obliger à installer quelques dépendances :

Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances 
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés : 
libipset3 libmnl0
Les NOUVEAUX paquets suivants seront installés :
ipset libipset3 libmnl0
0 mis à jour, 3 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 105 ko dans les archives.
Après cette opération, 337 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o

Ajout d’une règle au firewall

Vous pouvez vous reporter à cet article pour la configuration du firewall avec IPtables : https://www.fanjoe.be/?p=1003

Juste après la suppression des règles précédentes nous allons ajouter la partie IPset :

#Suppression des règles précédentes
iptables -F
iptables -X

#########
# IPset #
#########

ipset create blacklist hash:ip hashsize 4096
iptables -I INPUT   -m set --match-set blacklist src -j DROP
iptables -I FORWARD -m set --match-set blacklist src -j DROP

########
# DROP #
########

Nous avons créé une table appelée blacklist dans laquelle nous allons ajouter notre liste d’IP.

Ensuite, nous avons créé une règle IPtables en Input et en Forward qui va chercher la correspondance avec le contenu de notre table. Si elle « match », le paquet est bloqué.

Tout à la fin de notre fichier firewall, nous allons ajouter cet appel au script que nous allons voir plus loin :

# Exécution du script de BlackListIP-Start
/home/pi/scripts/BlackListIP/BlackListIP-Start.bash

Scripts

Script d’initialisation

On va créer / éditer le fichier /home/pi/scripts/BlackListIP/BlackListIP-Start.bash :

$ sudo nano /home/pi/scripts/BlackListIP/BlackListIP-Start.bash
#!/bin/bash

#####################################################
#                                                   #
#  Script exécuté au boot par /etc/init.d/firewall  #
#                                                   #
#  Ban avec ipset toutes les IP des fichiers :      #
#  /home/pi/scripts/BlackListIP/BlackListIP.txt     #
#                                                   #
#####################################################

# Vérifie que l'on est en Root
if [[ $EUID -ne 0 ]];
then
	echo "Ce script doit être exécuté avec les privilèges administrateur"
   	exit 1
fi

# Flush de la table blacklist.
ipset flush blacklist  > /dev/null

# Charge les IP dans ipset
while read ip
do
	ipset add blacklist $ip
done < /home/pi/scripts/BlackListIP/BlackListIP.txt

On enregistre le fichier et on le rend exécutable :

$ sudo chmod +x /home/pi/scripts/BlackListIP/BlackListIP-Start.bash

Script de mise à jour de la liste d’IP à bloquer

Les sites

Voici une liste de sites qui mettent à disposition des listes d’IP à bannir :

Un site qui référence plusieurs listes :

Le script

On va créer / éditer le fichier /home/pi/scripts/BlackListIP/BlackListIP-Refresh.bash :

$ sudo nano /home/pi/scripts/BlackListIP/BlackListIP-Refresh.bash
#!/bin/bash

#######################################################################
#                                                                     #
#  Script exécuté par cron pour rafraichir la liste des IP publiques  #
#                                                                     #
#  Ban avec ipset toutes les IP du fichier :                          #
#  /home/pi/scripts/BlackListIP/BlackListIP.txt                       #
#                                                                     #
#######################################################################

# Vérifie que l'on est en Root
if [[ $EUID -ne 0 ]];
then
	echo "Ce script doit être exécuté avec les privilèges administrateur"
   	exit 1
fi

BLACKLIST_FILE="/home/pi/scripts/BlackListIP/BlackListIP.txt"
BLACKLIST_FILE_TMP="/home/pi/scripts/BlackListIP/BlackListIP.tmp"

BLACKLISTS=(
"http://danger.rulez.sk/projects/bruteforceblocker/blist.php"
"http://cinsscore.com/list/ci-badguys.txt"
"https://lists.blocklist.de/lists/all.txt"
)

for liste in "${BLACKLISTS[@]}"
do
	LISTE_TMP=$(curl "$liste")
	echo "$LISTE_TMP" | grep -Po '(?:\d{1,3}\.){3}\d{1,3}(?:/\d{1,2})?' >> $BLACKLIST_FILE_TMP
done

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 $BLACKLIST_FILE_TMP | uniq > $BLACKLIST_FILE
rm $BLACKLIST_FILE_TMP

# Flush de la table blacklist pour éviter les doublons.
ipset flush blacklist  > /dev/null

while read ip
do
	#echo $ip
	ipset add blacklist $ip
done < $BLACKLIST_FILE

On enregistre le fichier et on le rend exécutable :

$ sudo chmod +x /home/pi/scripts/BlackListIP/BlackListIP-Refresh.bash

Puis, au lieu de relancer le firewall ou de redémarrer le RPi, nous allons exécuter le script que nous venons d’écrire :

$ sudo /home/pi/scripts/BlackListIP/BlackListIP-Refresh.bash

Il faut compter jusqu’à 5 minutes pour charger toutes les IP (±40000) dans la table.

Si vous voulez une sortie à l’écran pour voir les IP défiler, dé-commentez la ligne # echo $ip

cron

On va mettre la liste des IP à jour avec cron :

$ sudo crontab -e
# Charge la liste des IP blacklistées depuis plusieurs sites tous les jours à 14h
00 14 * * * sudo /home/pi/scripts/BlackListIP/BlackListIP-Refresh.bash

 

Références :

(10) comments

Julien
5 ans ago · Répondre

Bonjour,

Je souhaite changer les listes présentes dans le script BlackListIP-Refresh.bash par celles proposées sur le site https://www.iblocklist.com/lists. Mais les listes directement utilisables sont compressées : y a-t-il un moyen pour que le script puisse les prendre en compte ?
Merci pour les tutos et pour votre aide,

Julien

    fanjoe
    5 ans ago · Répondre

    Bonjour,

    Si toutes les URL pointent vers des fichiers zippés, on pourra remplacer la ligne 30 par celle-ci :

    LISTE_TMP=$(curl -L « $liste » | gunzip -c)

    Didier.

      Julien
      5 ans ago ·

      Merci de m’avoir répondu !! C’est très sympa.
      Je vais essayer de remplacer la ligne !

Eric
5 ans ago · Répondre

Bonjour,
comment vérifier que le script a bien fonctionné ? possibilité de tester d’une manière ou d’une autre ? ou de vérifier dans un log ?
Merci
Eric

    fanjoe
    5 ans ago · Répondre

    Bonjour,

    Pour afficher la liste des IP chargées :

    $ sudo ipset list blacklist

    Si le firewall est configuré comme indiqué en haut du post, toutes les IP listées sont bloquées.

    Didier.

Pierre PERNOT
5 ans ago · Répondre

Bonjour, est-ce que vous allez refaire un tutorial avec nftables sur raspberry et Buster?

Cordialement

    fanjoe
    5 ans ago · Répondre

    Bonjour,

    Pour l’instant, je n’ai pas encore migré vers Buster.

    Mais, oui, je publierai mes scripts nftables le moment venu.

    Didier.

Allan Tori
1 an ago · Répondre

bonjour,
J’utilise votre script depuis plus de 3 ans sans problème , j’ai a présent une erreur dans exécution du script ( BlackListIP-Refresh.bash) : Syntax error: « ( » unexpected,
Je suis toujours en Debian 9 , je fais juste les mise a jour système.

    fanjoe
    1 an ago · Répondre

    Bonjour,

    Une indication du numéro de ligne où l’erreur se produit ?

    Didier.

Alain
3 mois ago · Répondre

bonjour,
j’utilise votre script depuis plusieurs année sans problème , mais depuis novembre j’ai une erreur dans la ligne 23,24,25 les adresses BLACKLISTS exemple:
« http://cinsscore.com/list/ci-badguys.txt » not found , pourtant j’ai tester les adresses sont toujours opérationnel et donne bien une liste d’IP, puis j’obtiens l’erreur : BlackListIP-Refresh.bash: Bad substitution (ligne27) , le fichier « BlackListIP.tx » reste vide. Je suis sous débian 10 depuis debut 2022 et cela fonctionnait sans aucun souci ..

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.