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 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).
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
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
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
Voici une liste de sites qui mettent à disposition des listes d’IP à bannir :
Un site qui référence plusieurs listes :
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
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 :
6 ans ago ·
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
6 ans ago ·
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.
6 ans ago ·
Merci de m’avoir répondu !! C’est très sympa.
Je vais essayer de remplacer la ligne !
5 ans ago ·
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
5 ans ago ·
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.
5 ans ago ·
Bonjour, est-ce que vous allez refaire un tutorial avec nftables sur raspberry et Buster?
Cordialement
5 ans ago ·
Bonjour,
Pour l’instant, je n’ai pas encore migré vers Buster.
Mais, oui, je publierai mes scripts nftables le moment venu.
Didier.
2 ans ago ·
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.
2 ans ago ·
Bonjour,
Une indication du numéro de ligne où l’erreur se produit ?
Didier.
9 mois ago ·
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 ..