Installer et configurer Fail2Ban sur un Raspberry Pi
Fail2Ban permet de bloquer automatiquement les adresses IP à l’origine de tentatives de connexion répétées ou suspectes. Dans cet article, vous allez configurer une première jail dédiée à SSH sur un Raspberry Pi, afin de mettre en place une protection simple et de comprendre le fonctionnement général de Fail2Ban.
Comprendre le rôle de Fail2Ban
Fail2Ban est un outil de protection qui surveille les journaux du système et des services afin d’identifier certains comportements suspects, comme des tentatives de connexion répétées. Lorsqu’un même hôte dépasse un seuil défini, l’adresse IP concernée est temporairement bannie par une action adaptée, souvent appliquée au niveau du pare-feu.
Son fonctionnement repose sur trois éléments principaux :
- une jail, qui définit le service à surveiller ainsi que les paramètres de bannissement ;
- un filtre, défini à l’aide d’une expression régulière, qui permet d’identifier les événements à détecter dans les journaux ;
- une action, qui détermine la réponse à appliquer lorsqu'un seuil est atteint.
Dans un contexte d’auto-hébergement, Fail2Ban complète efficacement un pare-feu comme nftables. Le pare-feu définit les accès autorisés de manière statique, tandis que Fail2Ban réagit dynamiquement aux comportements anormaux repérés dans les journaux. Cette approche est particulièrement utile pour des services exposés comme SSH, souvent ciblés par des tentatives automatisées.
Fail2Ban ne remplace toutefois pas une bonne configuration de sécurité. Il réduit l’impact des attaques par force brute ou des scans répétés, mais il ne corrige ni un mot de passe faible, ni une application mal configurée.
Installer Fail2Ban
Avant de passer à la configuration, commencez par installer le paquet fail2ban sur votre Raspberry Pi.
# Mettre à jour l'index des paquets
sudo apt update
# Installer Fail2Ban
sudo apt install fail2ban
Configurer Fail2Ban
Fail2Ban recommande de conserver le fichier de configuration par défaut jail.conf intact, car ce fichier peut être remplacé lors d'une mise à jour du paquet. Pour personnaliser les réglages, créez plutôt un fichier jail.local à partir de ce modèle.
# Copier la configuration par défaut dans le fichier local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Ouvrir le fichier local pour le personnaliser
sudo nano /etc/fail2ban/jail.local
Cette méthode permet de partir de la configuration par défaut sans modifier le fichier d’origine.
Définir les paramètres globaux
Dans ce guide, les actions de bannissement s’appuient sur nftables. Cette configuration suppose donc que votre pare-feu est déjà en place et opérationnel. Si ce n’est pas encore le cas, commencez par consulter l’article dédié à nftables avant de poursuivre.
Le fichier jail.local permet d'appliquer des réglages communs à l'ensemble des jails. Il est utile de commencer par la section [DEFAULT], qui centralise les options générales comme les adresses à ignorer, la durée de bannissement, le seuil de déclenchement et l’action de bannissement utilisée par Fail2Ban.
[DEFAULT]
# Ne jamais bannir l'interface locale
ignoreip = 127.0.0.1/8 ::1
# Durée du bannissement
bantime = 1h
# Période durant laquelle les tentatives sont comptabilisées
findtime = 10m
# Nombre maximal d'échecs avant bannissement
maxretry = 5
# Action de bannissement pour les jails classiques
banaction = nftables-multiport
# Action de bannissement pour les jails qui écoutent sur tous les ports
banaction_allports = nftables-allports
Les directives suivantes définissent le comportement global de Fail2Ban :
bantimedéfinit la durée du bannissement.findtimeindique la fenêtre de temps pendant laquelle les échecs sont comptabilisés.maxretryfixe le nombre maximal de tentatives autorisées avant le bannissement.banactionprécise l’action de bannissement utilisée par défaut pour les jails classiques. Ici, elle s’appuie surnftables-multiport.banaction_allportsdéfinit l’action utilisée pour les jails qui doivent bloquer une adresse IP sur l’ensemble des ports. Ici, elle s’appuie surnftables-allports.
Format des durées
Fail2Ban accepte des valeurs exprimées en secondes, minutes, heures ou jours, par exemple 30s, 10m, 1h ou 1d.
Activer la jail SSH
Sur un Raspberry Pi administré à distance, la jail sshd est généralement la première à activer. Elle utilise les filtres fournis par Fail2Ban pour détecter les échecs d’authentification sur SSH, puis applique automatiquement l’action de bannissement lorsque le seuil configuré est dépassé.
Dans le fichier jail.local, localisez la section [sshd] et complétez-la avec les paramètres suivants.
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
Cette jail reprend les paramètres globaux définis dans [DEFAULT], tout en surchargeant ici la directive maxretry afin de renforcer la protection de SSH.
enabledactive la jailsshd.portindique le port surveillé par Fail2Ban.logpathdéfinit la source de journaux à analyser.backendprécise la méthode utilisée pour lire ces journaux.maxretryfixe le nombre maximal d’échecs autorisés avant bannissement. Ici, la valeur 3 surcharge celle définie dans[DEFAULT]et montre comment personnaliser une jail localement.
Enregistrez et quittez l’éditeur (Ctrl+O, Entrée, puis Ctrl+X). Redémarrez ensuite le service pour que la nouvelle configuration soit prise en compte.
# Redémarrer le service Fail2Ban pour appliquer les modifications
sudo systemctl restart fail2ban
Vous pouvez consulter le statut général de Fail2Ban avec la commande :
# Afficher l'état général de Fail2Ban
sudo fail2ban-client status
Tester le fonctionnement de la jail SSH
Une fois la configuration appliquée, vérifiez que la jail sshd détecte correctement les échecs d'authentification et bannit les adresses IP comme prévu. Pour faciliter les essais, vous pouvez temporairement définir maxretry = 2 et un bantime court, par exemple 30s, dans la jail sshd. Après cette modification, pensez à redémarrer le service fail2ban.
Observer les journaux en direct
Commencez par ouvrir un premier terminal sur le Raspberry Pi, puis suivez les journaux en temps réel à l’aide de tail -f sur le fichier de log de Fail2Ban.Vous verrez ainsi les bannissements et les débannissements apparaître au fur et à mesure qu’ils se produisent.
# Afficher les événements de Fail2Ban en temps réel
tail -f /var/log/fail2ban.log
Provoquer des échecs de connexion
Depuis un second terminal, tentez plusieurs connexions SSH avec un identifiant ou un mot de passe incorrect. L’objectif est de provoquer suffisamment d’échecs pour atteindre la valeur définie par maxretry. Dès que le seuil est dépassé, Fail2Ban enregistre l’événement dans ses journaux et applique le bannissement.
Avec un bantime de 30s, vous pouvez ensuite patienter quelques instants pour observer le message indiquant le débannissement automatique.
Voici un exemple des messages affichés dans les journaux :
2026-05-25 16:55:08,792 fail2ban.filter [1526]: INFO [sshd] Found 192.168.1.14 - 2026-05-25 16:55:08
2026-05-25 16:55:14,011 fail2ban.filter [1526]: INFO [sshd] Found 192.168.1.14 - 2026-05-25 16:55:13
2026-05-25 16:55:14,103 fail2ban.actions [1526]: NOTICE [sshd] Ban 192.168.1.14
2026-05-25 16:55:44,162 fail2ban.actions [1526]: NOTICE [sshd] Unban 192.168.1.14
Pour quitter l’affichage en temps réel, utilisez le raccourci Ctrl + C.
Vérifier l'état de la jail
Après le test, affichez l’état de la jail sshd. Vous pourrez ainsi vérifier que les tentatives échouées ont bien été comptabilisées ainsi que le nombre d’adresses IP bannies. Cette vue indique également le nombre d’adresses actuellement bannies (Currently banned) et la liste des IP concernées (Banned IP list).
# Afficher l'état détaillé de la jail SSH
sudo fail2ban-client status sshd
Bannir ou débannir une adresse IP
Fail2Ban permet également de bannir ou de débannir manuellement une adresse IP dans une jail donnée. Ces commandes sont utiles pour l’administration, mais aussi pour comprendre concrètement le fonctionnement de la jail sshd.
# Bannir manuellement une adresse IP dans la jail sshd
sudo fail2ban-client set sshd banip <IP>
# Retirer manuellement une adresse IP de la jail sshd
sudo fail2ban-client set sshd unbanip <IP>
Un bannissement manuel suit la durée définie par bantime dans la jail concernée, ou la valeur héritée depuis [DEFAULT] si aucun réglage local ne la surcharge.
Constater l'intégration avec nftables
Fail2Ban bloque les adresses IP en ajoutant dynamiquement des règles au pare-feu. Dans cette configuration, les éléments correspondants n’apparaissent dans nftables qu’au moment du premier bannissement.
Pour vérifier cette intégration, affichez l’ensemble des règles actives de nftables:
# Afficher le jeu de règles du pare-feu
sudo nft list ruleset
Vous devriez alors voir apparaître une table f2b-table contenant les éléments créés par Fail2Ban pour la jail sshd.
table inet f2b-table {
set addr-set-sshd {
type ipv4_addr
elements = { 192.168.1.14 }
}
chain f2b-chain {
type filter hook input priority filter - 1; policy accept;
tcp dport 22 ip saddr @addr-set-sshd reject with icmp port-unreachable
}
}
Cette table contient un ensemble d’adresses bannies, ici addr-set-sshd, ainsi qu’une chaîne chargée d’intercepter le trafic destiné au port SSH. Si l’adresse source d’un paquet appartient à cet ensemble, la connexion est rejetée par le pare-feu.
Une fois les tests terminés, pensez à rétablir les valeurs de maxretry et de bantime selon vos besoins réels. Les réglages temporaires utilisés pour la démonstration ne sont pas forcément adaptés à une utilisation en production.