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
La configuration de Fail2Ban repose sur un système de priorité entre plusieurs fichiers. Une bonne compréhension de ce mécanisme facilite grandement la maintenance de votre serveur sur le long terme.
Comprendre le système de surcharge
Fail2Ban utilise des fichiers .conf fournis par défaut lors de l'installation. Ces fichiers sont automatiquement remplacés lors des mises à jour du paquet. Pour protéger vos personnalisations, le logiciel lit ensuite les fichiers .local correspondants.
Si une directive existe dans les deux fichiers, la valeur du fichier .local l'emporte. Tout le reste est hérité du fichier .conf d'origine. C'est le principe de la surcharge partielle.
De nombreux tutoriels recommandent encore de copier intégralement le fichier jail.conf vers jail.local. Cette pratique est aujourd'hui déconseillée. Une copie complète fige votre configuration et masque vos véritables modifications au milieu de centaines de lignes par défaut. Elle vous prive également des améliorations apportées par les futures mises à jour du logiciel.
La bonne pratique consiste à créer des fichiers .local minimalistes. De plus, Fail2Ban lit automatiquement le contenu du répertoire jail.d/ par ordre alphabétique. Vous allez donc définir vos règles générales dans un fichier central, puis isoler la configuration de chaque service dans son propre fichier.
La pré-configuration sous Debian
Sur les versions récentes comme Debian 12, l'installation crée automatiquement le fichier /etc/fail2ban/jail.d/defaults-debian.conf. Ce fichier préconfigure le pare-feu nftables et active la surveillance SSH via systemd. La création de vos propres fichiers .local reste indispensable. Elle vous garantit un contrôle total sur vos réglages et écrase les valeurs par défaut en cas de besoin.
Définir les paramètres globaux
Dans ce guide, les actions de bannissement s’appuient sur nftables, le standard sur les systèmes Debian récents. Cette configuration suppose donc que votre pare-feu est déjà en place. Si ce n’est pas le cas, consultez d'abord l’article dédié à nftables.
Créez le fichier jail.local pour y placer uniquement vos paramètres globaux :
# Créer un fichier de configuration local minimaliste
sudo nano /etc/fail2ban/jail.local
Ajoutez la section [DEFAULT] suivante. Elle centralise les options communes à toutes vos futures jails :
[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 par défaut (adapté à Debian 12+)
banaction = nftables-multiport
# Action de bannissement pour l'ensemble des ports
banaction_allports = nftables-allports
Ces directives définissent le comportement de base 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.banactionetbanaction_allportsprécisent le mécanisme de pare-feu utilisé. L'utilisation denftablesgarantit une compatibilité optimale avec les distributions modernes.
Format des durées
Fail2Ban accepte des valeurs exprimées en secondes, minutes, heures ou jours, par exemple 30s, 10m, 1h ou 1d.
Enregistrez et quittez l’éditeur avec Ctrl+O, Entrée, puis Ctrl+X.
Activer la jail SSH de façon modulaire
Sur un Raspberry Pi administré à distance, la jail sshd est généralement la première à activer. Pour respecter la structure modulaire abordée plus haut, vous n'allez pas l'ajouter dans jail.local. Vous allez plutôt créer un fichier dédié dans le répertoire jail.d/.
Le préfixe numérique 00 dans le nom du fichier garantit sa lecture en premier par le système.
# Créer le fichier dédié au service SSH
sudo nano /etc/fail2ban/jail.d/00-sshd.local
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 3
Cette jail hérite des paramètres globaux de votre fichier jail.local. Elle surcharge toutefois certaines directives pour s'adapter spécifiquement au service SSH :
enabledactive la surveillance.backend = systemdindique à Fail2Ban de lire les journaux via journald. Ce réglage est indispensable sur les systèmes récents, car l'ancien fichierauth.loga tendance à disparaître.maxretryabaisse la tolérance à trois échecs pour renforcer la sécurité de l'accès distant.
Enregistrez puis quittez l'éditeur. Redémarrez ensuite le service pour appliquer l'ensemble de votre nouvelle configuration :
# 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. Apportez ces modifications temporaires directement dans votre fichier /etc/fail2ban/jail.d/00-sshd.local. Après cet ajout, 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 et consulter 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 respecte la durée définie par la directive bantime de la jail concernée. Si aucun réglage local ne la surcharge, le système applique la valeur héritée de la section [DEFAULT].
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, le pare-feu rejette immédiatement la connexion.
Une fois les tests terminés, pensez à ouvrir de nouveau le fichier /etc/fail2ban/jail.d/00-sshd.local pour rétablir ou supprimer les valeurs de maxretry et de bantime. Les réglages temporaires utilisés pour la démonstration ne sont pas adaptés à une utilisation quotidienne.