Sur un serveur dédié, il n’est pas rare d’avoir des adresses IP à bannir pour se débarrasser de visiteurs malveillants, de spammeurs ou de bots qui effectuent des requêtes farfelues visant à perturber le bon fonctionnement des services du serveur.
Heureusement, toutes ces petites contrariétés peuvent être résolues en quelques secondes grâce à un firewall comme iptables.
Ce petit tutoriel vous montre les quelques commandes à retenir pour lister, bannir ou débloquer des adresses IP avec iptables ainsi qu’un petit script bash qui vous permettra d’automatiser la gestion de ces trois fonctions très simplement.
Bannir une IP
Pour bannir une adresse IP avec iptables, il suffit de lancer cette commande:
Vos mises à jour vous font peur ?
PHP 8.x qui casse un plugin, un thème qui n'est plus maintenu, une mise à jour de WooCommerce qui change tout — je gère les montées de version proprement, avec environnement de staging et rollback prévu.
Mettons votre stack à jour sans risque →iptables -I INPUT -s x.x.x.x -j DROPCode language: CSS (css)
L’argument DROP indique que l’adresse IP indiquée (x.x.x.x) n’aura plus accès à la machine.
Lister les IP bloquées
Pour voir la liste des adresses IP bloquées, il suffit de demander à iptables la liste et de ne sélectionner que celles qui sont en DROP:
iptables -L INPUT -v -n | grep DROP
Résultat :
Chain INPUT (policy DROP 23 packets, 4122 bytes)
Débloquer une IP
Pour débloquer une IP, il faut d’abord afficher la liste des IP bannies:
iptables -L INPUT -v -n | grep DROP
Toutes les IP sont classées dans un ordre numéroté, ligne par ligne. Il suffit d’indiquer le numéro de la ligne de la règle à supprimer avec la commande:
iptables -D INPUT numero-de-la-regle
L’argument -D (pour delete) permet de supprimer la règle qui correspond à l’adresse IP que nous souhaitons supprimer. Par exemple, si on veut supprimer la règle 1, il suffit d’indiquer:
iptables -D INPUT 1
Vous aurez remarqué que toutes ces commandes sont bien fastidieuses et leurs syntaxes assez complexes à retenir.
Voyons donc comment créer un script bash qui prendrait en charge toutes ces commandes.
Script Bash pour automatiser la gestion des IP bannies dans iptables
Voici un script bash qui devrait grandement vous simplifier la gestion des IP dans iptables.
Il permet de bloquer, débloquer et lister les adresses IP en toute simplicité.
1. Sur le serveur, créez un nouveau fichier bash, banip :
nano banip
2. Insérez ce script dans le fichier :
#!/bin/bash
# Script name : Ban/Unban IP with Iptables
function help {
echo "Syntax: $0 -[L][u] targets"
echo " Parameters come first. Target is expressed as an IP address."
echo " No specified parameter will ban the IP."
echo " -L to list currently banned IPs."
echo " -u to unban IPs."
exit 1
}
# If no arguments are passed, call the "help" function.
if [ -z "$1" ]; then
help
fi
# Define some variables
ACTION="-A"
txtred=$(tput setaf 1)
txtyel=$(tput setaf 3)
txtcya=$(tput setaf 6)
txtrst=$(tput sgr0)
while getopts "huL" OPTION
do
case $OPTION in
h)
help
;;
u)
ACTION="-D"
shift $(($OPTIND - 1))
;;
L)
ACTION="-L"
shift $(($OPTIND - 1))
;;
\?)
help
;;
esac
done
if [ $ACTION == "-L" ]; then
echo $txtcya"List of Banned IPs:"$txtrst
iptables -L INPUT -v -n | grep DROP
else
# ban work loop
for ZTARGET in "$@"
do
echo $txtcya"Applying action $txtred$ACTION$txtcya to $txtyel$ZTARGET"$txtrst
iptables $ACTION INPUT -s $ZTARGET -j DROP
done
fiCode language: PHP (php)
3. Donnez les droits d’exécution au fichier:
chmod +x banip
Détails et fonctionnement du script
- pour bannir une IP, il suffit de lancer le script suivi de l’IP à bannir:
./banip x.x.x.x - l’argument -h lance l’aide du script. Il est aussi possible d’invoquer le fichier sans argument:
# help & usage ./banip ./banip -h - l’argument -L affiche la liste des IP bloquées :
# banned IP list ./banip -L - l’argument -u (pour unban) débloque une IP donnée:
# unban IP ./banip -u x.x.x.x
Votre gestion des IP sous iptables devrait désormais être grandement facilitée.
Un projet WordPress en tête ?
Vous avez une idée claire de ce que vous voulez, mais pas les ressources en interne pour le faire bien. Je développe des sites et extensions WordPress sur-mesure — sans délais à rallonge ni mauvaises surprises.
Décrivez-moi votre projet →