{"id":87,"date":"2026-06-12T16:25:12","date_gmt":"2026-06-12T16:25:12","guid":{"rendered":"https:\/\/shattered.io\/fr\/2026\/06\/12\/fail2ban-proteger-ssh-tutoriel\/"},"modified":"2026-06-12T16:27:10","modified_gmt":"2026-06-12T16:27:10","slug":"fail2ban-proteger-ssh-tutoriel","status":"publish","type":"post","link":"https:\/\/shattered.io\/fr\/2026\/06\/12\/fail2ban-proteger-ssh-tutoriel\/","title":{"rendered":"Fail2ban : prot\u00e9ger SSH en 12 \u00e9tapes, 30 min [2026]"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Chaque serveur Linux expos\u00e9 sur Internet subit un d\u00e9luge de tentatives de connexion SSH automatis\u00e9es. Une \u00e9tude de pots de miel (honeypots) a enregistr\u00e9 plus de 11 milliards de tentatives d&#8217;attaque, dont 7,9 milliards de connexions SSH par force brute sur identifiants et cl\u00e9s. Si votre serveur \u00e9coute sur le port 22 avec un mot de passe, ce n&#8217;est qu&#8217;une question de temps avant qu&#8217;un robot ne trouve la bonne combinaison. <strong>Fail2ban<\/strong> est la premi\u00e8re ligne de d\u00e9fense que tout administrateur d\u00e9ploie : il lit vos journaux, rep\u00e8re les \u00e9checs d&#8217;authentification r\u00e9p\u00e9t\u00e9s et bannit l&#8217;adresse IP fautive au niveau du pare-feu, automatiquement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce tutoriel vous guide pas \u00e0 pas, de l&#8217;installation \u00e0 un fichier de configuration pr\u00eat pour la production, sur Debian 12 et Ubuntu 24.04 LTS. Comptez environ 30 minutes. \u00c0 la fin, vous aurez un pare-feu adaptatif qui bloque les attaquants SSH, prot\u00e8ge vos services web et escalade les sanctions contre les r\u00e9cidivistes. Nous couvrons aussi la <strong>configuration fail2ban<\/strong> avanc\u00e9e, huit probl\u00e8mes de d\u00e9pannage courants, la faille CVE-2025-45311 et la comparaison avec CrowdSec.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quest-ce-que-fail2ban\">Qu&#8217;est-ce que Fail2ban et comment il bloque la force brute<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban est un d\u00e9mon de pr\u00e9vention d&#8217;intrusion \u00e9crit en Python. Son principe est simple et redoutablement efficace : il surveille en continu les fichiers journaux (ou le journal systemd) \u00e0 la recherche de motifs d&#8217;\u00e9chec, comme une s\u00e9rie de mauvais mots de passe SSH provenant de la m\u00eame adresse. Quand le nombre d&#8217;\u00e9checs d\u00e9passe un seuil dans une fen\u00eatre de temps donn\u00e9e, Fail2ban ajoute une r\u00e8gle au pare-feu (nftables ou iptables) pour rejeter cette adresse pendant une dur\u00e9e d\u00e9finie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trois concepts structurent tout le syst\u00e8me. Le <strong>filtre<\/strong> est une expression r\u00e9guli\u00e8re qui identifie une ligne d&#8217;\u00e9chec dans un journal. La <strong>jail<\/strong> (prison) associe un filtre \u00e0 un service, \u00e0 des seuils et \u00e0 une action. L&#8217;<strong>action<\/strong> est ce que Fail2ban ex\u00e9cute quand une jail se d\u00e9clenche, le plus souvent un bannissement au pare-feu. Vous configurez les seuils via trois param\u00e8tres cl\u00e9s : <code>maxretry<\/code> (nombre d&#8217;\u00e9checs tol\u00e9r\u00e9s), <code>findtime<\/code> (la fen\u00eatre d&#8217;observation) et <code>bantime<\/code> (la dur\u00e9e du bannissement).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La version stable actuelle est Fail2ban 1.1.0, publi\u00e9e en 2024, avec une pr\u00e9version 1.1.1.beta0 disponible en amont mais non recommand\u00e9e en production. Le projet est mature, pr\u00e9sent dans les d\u00e9p\u00f4ts de quasiment toutes les distributions Linux, et reste l&#8217;outil de r\u00e9f\u00e9rence pour la protection d&#8217;un h\u00f4te unique. Contrairement \u00e0 des syst\u00e8mes plus lourds, il ne d\u00e9pend d&#8217;aucun service cloud : tout se passe localement sur votre machine, ce qui en fait un choix id\u00e9al pour un VPS, un serveur d\u00e9di\u00e9 ou un Raspberry Pi auto-h\u00e9berg\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban n&#8217;est pas un pare-feu en soi : il pilote votre pare-feu existant. Il ne remplace pas non plus une bonne hygi\u00e8ne de s\u00e9curit\u00e9. D\u00e9sactiver l&#8217;authentification par mot de passe au profit des cl\u00e9s SSH, changer le port d&#8217;\u00e9coute et maintenir le syst\u00e8me \u00e0 jour restent indispensables. Fail2ban ajoute une couche d&#8217;automatisation qui transforme un flot continu d&#8217;attaques en quelques lignes de journal sans cons\u00e9quence.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prerequis-versions\">Pr\u00e9requis et versions logicielles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant d&#8217;installer Fail2ban, assurez-vous de disposer de l&#8217;environnement suivant. Toutes les commandes de ce tutoriel supposent un acc\u00e8s root ou <code>sudo<\/code> et un serveur accessible en SSH.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Composant<\/th><th>Version requise<\/th><th>V\u00e9rification<\/th><\/tr><\/thead><tbody><tr><td>Syst\u00e8me<\/td><td>Debian 12 (Bookworm) ou Ubuntu 24.04 LTS<\/td><td><code>cat \/etc\/os-release<\/code><\/td><\/tr><tr><td>Fail2ban<\/td><td>1.0.2 ou sup\u00e9rieur (1.1.0 recommand\u00e9)<\/td><td><code>fail2ban-client --version<\/code><\/td><\/tr><tr><td>Python<\/td><td>3.9 ou sup\u00e9rieur (fourni par le syst\u00e8me)<\/td><td><code>python3 --version<\/code><\/td><\/tr><tr><td>Pare-feu<\/td><td>nftables (par d\u00e9faut) ou iptables<\/td><td><code>nft --version<\/code><\/td><\/tr><tr><td>Service de journal<\/td><td>systemd-journald<\/td><td><code>systemctl status systemd-journald<\/code><\/td><\/tr><tr><td>Acc\u00e8s<\/td><td>compte root ou sudo<\/td><td><code>sudo -v<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sur Debian 12 et Ubuntu 24.04, le pare-feu par d\u00e9faut est nftables, et les journaux d&#8217;authentification SSH passent par le journal systemd. Ces deux points modifient la <strong>configuration fail2ban<\/strong> moderne par rapport aux anciens guides qui supposaient iptables et <code>\/var\/log\/auth.log<\/code>. Nous traiterons les deux cas, mais nous privil\u00e9gierons les r\u00e9glages adapt\u00e9s aux distributions r\u00e9centes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un dernier conseil avant de commencer : ouvrez une <strong>seconde session SSH<\/strong> en parall\u00e8le et gardez-la connect\u00e9e pendant toute la dur\u00e9e de la configuration. Une erreur de r\u00e9glage peut vous bannir vous-m\u00eame. Cette session de secours vous \u00e9vitera de perdre l&#8217;acc\u00e8s \u00e0 votre propre serveur, un pi\u00e8ge que nous d\u00e9taillerons plus loin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-1-2-installer-fail2ban\">\u00c9tapes 1 et 2 : Installer Fail2ban sur Debian et Ubuntu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u00c9tape 1.<\/strong> Mettez \u00e0 jour la liste des paquets puis lancez l&#8217;installation. Pour <strong>installer fail2ban<\/strong> depuis les d\u00e9p\u00f4ts officiels, une seule commande suffit :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Mettre \u00e0 jour l'index des paquets\nsudo apt update\n\n# Installer Fail2ban (tire automatiquement les d\u00e9pendances Python)\nsudo apt install -y fail2ban\n\n# V\u00e9rifier la version install\u00e9e\nfail2ban-client --version<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La sortie attendue ressemble \u00e0 <code>Fail2Ban v1.0.2<\/code> sur Debian 12 ou une version sup\u00e9rieure sur Ubuntu 24.04. Si vous voulez imp\u00e9rativement la 1.1.0, vous pouvez la compiler depuis les sources GitHub, mais la version des d\u00e9p\u00f4ts est largement suffisante pour un usage normal et re\u00e7oit les correctifs de s\u00e9curit\u00e9 de la distribution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u00c9tape 2.<\/strong> V\u00e9rifiez que le service est actif. Sur Debian et Ubuntu, le paquet active et d\u00e9marre Fail2ban automatiquement apr\u00e8s l&#8217;installation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u00c9tat du service\nsudo systemctl status fail2ban\n\n# L'activer au d\u00e9marrage si n\u00e9cessaire\nsudo systemctl enable --now fail2ban<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vous devriez voir <code>active (running)<\/code> en vert. \u00c0 ce stade, Fail2ban fonctionne d\u00e9j\u00e0 avec sa configuration par d\u00e9faut, qui inclut une jail <code>sshd<\/code> de base sur la plupart des installations. Mais ne vous arr\u00eatez pas l\u00e0 : la configuration par d\u00e9faut est volontairement prudente, et nous allons la durcir dans les \u00e9tapes suivantes. Ne modifiez jamais directement les fichiers fournis par le paquet, car une mise \u00e0 jour les \u00e9craserait sans pr\u00e9avis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-3-4-jail-conf-vs-jail-local\">\u00c9tapes 3 et 4 : Comprendre jail.conf et jail.local<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Toute la configuration de Fail2ban vit dans <code>\/etc\/fail2ban\/<\/code>. Le fichier <code>jail.conf<\/code> contient les r\u00e9glages par d\u00e9faut livr\u00e9s par le paquet. La r\u00e8gle d&#8217;or, r\u00e9p\u00e9t\u00e9e dans toute la documentation officielle : <strong>ne modifiez jamais jail.conf<\/strong>. Vos changements y seraient effac\u00e9s \u00e0 la prochaine mise \u00e0 jour. \u00c0 la place, cr\u00e9ez un fichier <code>jail.local<\/code> qui surcharge uniquement les valeurs que vous voulez changer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u00c9tape 3.<\/strong> Explorez l&#8217;arborescence de configuration pour comprendre o\u00f9 vont les choses :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/fail2ban\/\njail.conf          # R\u00e9glages par d\u00e9faut (NE PAS MODIFIER)\njail.local         # Vos surcharges (\u00e0 cr\u00e9er)\njail.d\/            # Fichiers de jails additionnels (.local ou .conf)\nfail2ban.conf      # R\u00e9glages du d\u00e9mon (niveau de log, socket)\nfilter.d\/          # Expressions r\u00e9guli\u00e8res par service (sshd.conf, etc.)\naction.d\/          # D\u00e9finitions d'actions (nftables, iptables, mail)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u00c9tape 4.<\/strong> Cr\u00e9ez votre fichier <code>jail.local<\/code>. Plut\u00f4t que de copier l&#8217;int\u00e9gralit\u00e9 de <code>jail.conf<\/code> (une mauvaise pratique qui rend les mises \u00e0 jour confuses), partez d&#8217;un fichier minimal qui ne contient que vos surcharges. Ouvrez-le avec votre \u00e9diteur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/fail2ban\/jail.local<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous remplirons ce fichier dans les \u00e9tapes suivantes. Sachez que la section <code>[DEFAULT]<\/code> d\u00e9finit les valeurs globales appliqu\u00e9es \u00e0 toutes les jails, tandis que chaque section nomm\u00e9e comme <code>[sshd]<\/code> ne configure qu&#8217;un service pr\u00e9cis et peut surcharger les valeurs globales. Cette hi\u00e9rarchie est au c\u0153ur d&#8217;une <strong>configuration fail2ban<\/strong> propre et maintenable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-5-jail-sshd\">\u00c9tape 5 : Configurer la jail sshd (bantime, findtime, maxretry)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">C&#8217;est le c\u0153ur de la protection SSH. Trois param\u00e8tres gouvernent le comportement de bannissement. Voici leurs valeurs par d\u00e9faut dans Fail2ban et des recommandations durcies pour un serveur de production.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Param\u00e8tre<\/th><th>D\u00e9faut Fail2ban<\/th><th>Recommand\u00e9<\/th><th>R\u00f4le<\/th><\/tr><\/thead><tbody><tr><td><code>maxretry<\/code><\/td><td>5<\/td><td>3<\/td><td>\u00c9checs tol\u00e9r\u00e9s avant bannissement<\/td><\/tr><tr><td><code>findtime<\/code><\/td><td>10m (600 s)<\/td><td>10m<\/td><td>Fen\u00eatre o\u00f9 l&#8217;on compte les \u00e9checs<\/td><\/tr><tr><td><code>bantime<\/code><\/td><td>10m (600 s)<\/td><td>1h ou plus<\/td><td>Dur\u00e9e du bannissement<\/td><\/tr><tr><td><code>ignoreip<\/code><\/td><td>127.0.0.1\/8 ::1<\/td><td>+ votre IP fixe<\/td><td>Adresses jamais bannies<\/td><\/tr><tr><td><code>bantime.increment<\/code><\/td><td>false<\/td><td>true<\/td><td>Allonge la peine des r\u00e9cidivistes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Renseignez maintenant votre <code>jail.local<\/code> avec une section globale et une jail <code>sshd<\/code> durcie. Voici un bloc fonctionnel \u00e0 coller :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[DEFAULT]\n# Bannir pour 1 heure apr\u00e8s 3 \u00e9checs en 10 minutes\nbantime  = 1h\nfindtime = 10m\nmaxretry = 3\n\n# Allonger automatiquement la peine des r\u00e9cidivistes\nbantime.increment = true\nbantime.factor    = 2\nbantime.maxtime   = 1w\n\n# Ne jamais bannir le r\u00e9seau local ni votre IP d'admin\nignoreip = 127.0.0.1\/8 ::1 203.0.113.10\n\n[sshd]\nenabled  = true\nport     = ssh\nmaxretry = 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Remplacez <code>203.0.113.10<\/code> par votre adresse IP fixe r\u00e9elle. Le param\u00e8tre <code>bantime.increment = true<\/code> est l&#8217;un des r\u00e9glages les plus utiles : un attaquant banni une premi\u00e8re fois pour 1 heure le sera pour 2 heures \u00e0 la r\u00e9cidive, puis 4 heures, et ainsi de suite jusqu&#8217;au plafond <code>bantime.maxtime<\/code> d&#8217;une semaine. Cette escalade d\u00e9courage les robots persistants sans bloquer d\u00e9finitivement une IP qui pourrait, plus tard, \u00eatre r\u00e9attribu\u00e9e \u00e0 un utilisateur l\u00e9gitime.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-6-backend-systemd\">\u00c9tape 6 : Choisir le backend (systemd ou auth.log)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <code>backend<\/code> indique \u00e0 Fail2ban o\u00f9 lire les \u00e9v\u00e9nements d&#8217;authentification. C&#8217;est un point de bascule majeur entre les anciens et les nouveaux syst\u00e8mes. Sur Debian 12 et Ubuntu 24.04, les messages SSH sont \u00e9crits dans le journal systemd, pas forc\u00e9ment dans un fichier <code>\/var\/log\/auth.log<\/code>. Si vous utilisez le mauvais backend, Fail2ban ne verra aucun \u00e9chec et ne bannira personne, alors m\u00eame que le service tourne.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[sshd]\nenabled = true\nport    = ssh\n# Lire directement le journal systemd (recommand\u00e9 sur Debian 12 \/ Ubuntu 24.04)\nbackend = systemd\nmaxretry = 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si votre serveur \u00e9crit toujours <code>\/var\/log\/auth.log<\/code> (certaines installations conservent rsyslog), vous pouvez \u00e0 la place pointer un chemin de fichier :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[sshd]\nenabled  = true\nbackend  = auto\nlogpath  = \/var\/log\/auth.log\nmaxretry = 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le r\u00e9glage <code>backend = auto<\/code> tente de d\u00e9tecter la meilleure source, mais sur les distributions r\u00e9centes il est plus fiable de forcer <code>backend = systemd<\/code>. Pour v\u00e9rifier o\u00f9 atterrissent r\u00e9ellement vos journaux SSH, lancez <code>journalctl -u ssh -n 20<\/code> : si des lignes apparaissent, le journal systemd est bien la bonne source. Ce diagnostic r\u00e9sout \u00e0 lui seul la majorit\u00e9 des cas o\u00f9 \u00ab Fail2ban ne bannit rien \u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-7-banaction-nftables\">\u00c9tape 7 : Choisir l&#8217;action de bannissement (nftables ou iptables)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <code>banaction<\/code> d\u00e9termine comment Fail2ban ins\u00e8re le blocage dans votre pare-feu. Sur Debian moderne, le pare-feu par d\u00e9faut est nftables, et Fail2ban doit lui parler dans son propre langage. Utiliser une action iptables sur un syst\u00e8me nftables peut sembler fonctionner mais provoquer des incoh\u00e9rences. Forcez l&#8217;action adapt\u00e9e dans la section <code>[DEFAULT]<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[DEFAULT]\n# Bannir via nftables, le pare-feu par d\u00e9faut de Debian 12 \/ Ubuntu 24.04\nbanaction          = nftables-multiport\nbanaction_allports = nftables-allports\n# Cha\u00eene de filtrage des connexions entrantes\nchain              = input<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>banaction<\/th><th>Pare-feu<\/th><th>Quand l&#8217;utiliser<\/th><\/tr><\/thead><tbody><tr><td><code>nftables-multiport<\/code><\/td><td>nftables<\/td><td>Debian 12, Ubuntu 24.04, syst\u00e8mes r\u00e9cents<\/td><\/tr><tr><td><code>nftables-allports<\/code><\/td><td>nftables<\/td><td>Bloquer tous les ports d&#8217;une IP<\/td><\/tr><tr><td><code>iptables-multiport<\/code><\/td><td>iptables<\/td><td>Syst\u00e8mes h\u00e9rit\u00e9s ou conteneurs anciens<\/td><\/tr><tr><td><code>ufw<\/code><\/td><td>UFW<\/td><td>Serveurs g\u00e9r\u00e9s via UFW<\/td><\/tr><tr><td><code>route<\/code><\/td><td>table de routage<\/td><td>Sans pare-feu, blocage par route nulle<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous g\u00e9rez votre pare-feu avec UFW (fr\u00e9quent sur Ubuntu), r\u00e9glez <code>banaction = ufw<\/code> pour que les bannissements apparaissent dans les r\u00e8gles UFW et restent coh\u00e9rents. V\u00e9rifiez ensuite que le pare-feu refl\u00e8te bien les actions de Fail2ban, sinon vous obtiendrez des r\u00e8gles fant\u00f4mes que rien ne supprime.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-8-fail2ban-client\">\u00c9tape 8 : Appliquer et piloter avec fail2ban-client<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>fail2ban-client<\/code> est l&#8217;outil en ligne de commande qui pilote le d\u00e9mon. Apr\u00e8s chaque modification de configuration, rechargez sans red\u00e9marrer pour ne pas perdre les bannissements en cours.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Tester la syntaxe de la configuration avant d'appliquer\nsudo fail2ban-client -t\n\n# Recharger la configuration (sans couper les bannissements actifs)\nsudo fail2ban-client reload\n\n# Voir toutes les jails actives\nsudo fail2ban-client status\n\n# D\u00e9tail d'une jail pr\u00e9cise\nsudo fail2ban-client status sshd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La commande <code>fail2ban-client status sshd<\/code> produit une sortie comme celle-ci, qui r\u00e9sume l&#8217;\u00e9tat de la surveillance :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Status for the jail: sshd\n|- Filter\n|  |- Currently failed: 2\n|  |- Total failed:     147\n|  `- File list:        \/var\/log\/auth.log\n`- Actions\n   |- Currently banned: 3\n   |- Total banned:     19\n   `- Banned IP list:   185.142.236.34 218.92.0.112 92.118.39.88<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Les compteurs <code>Total failed<\/code> et <code>Total banned<\/code> grimpent vite sur un serveur expos\u00e9, preuve concr\u00e8te que Fail2ban travaille. M\u00e9morisez aussi deux commandes de gestion manuelle : <code>fail2ban-client set sshd unbanip 185.142.236.34<\/code> pour lib\u00e9rer une IP injustement bloqu\u00e9e, et <code>fail2ban-client set sshd banip 1.2.3.4<\/code> pour bannir manuellement une adresse hostile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-9-tester-bannissement\">\u00c9tape 9 : Tester le bannissement en conditions r\u00e9elles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ne supposez jamais qu&#8217;une protection fonctionne sans la tester. Depuis une machine ext\u00e9rieure (jamais celle list\u00e9e dans <code>ignoreip<\/code>), provoquez d\u00e9lib\u00e9r\u00e9ment des \u00e9checs SSH. Le moyen le plus propre est de tenter quelques connexions avec un utilisateur inexistant.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Depuis une autre machine, tenter 4 connexions avec un faux compte\nssh utilisateur-inexistant@VOTRE_SERVEUR\n# (r\u00e9p\u00e9ter, en saisissant n'importe quel mot de passe, jusqu'au bannissement)\n\n# Sur le serveur, v\u00e9rifier que l'IP a bien \u00e9t\u00e9 bannie\nsudo fail2ban-client status sshd\n\n# Inspecter la r\u00e8gle nftables cr\u00e9\u00e9e par Fail2ban\nsudo nft list ruleset | grep -A4 f2b<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s le quatri\u00e8me \u00e9chec, votre machine de test ne doit plus pouvoir se connecter : la connexion expire ou est refus\u00e9e imm\u00e9diatement. Dans le journal du serveur, vous verrez une ligne de bannissement explicite :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fail2ban.actions [1234]: NOTICE  [sshd] Ban 203.0.113.55\nfail2ban.actions [1234]: NOTICE  [sshd] 203.0.113.55 already banned<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pour lever le bannissement de test, ex\u00e9cutez <code>sudo fail2ban-client set sshd unbanip 203.0.113.55<\/code>. Ce test de bout en bout est la seule preuve fiable que votre filtre, votre backend et votre <code>banaction<\/code> fonctionnent ensemble. Beaucoup d&#8217;administrateurs croient \u00eatre prot\u00e9g\u00e9s alors qu&#8217;une simple incompatibilit\u00e9 de backend laisse passer toutes les attaques.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-10-liste-blanche\">\u00c9tape 10 : Prot\u00e9ger vos propres acc\u00e8s avec ignoreip<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le pi\u00e8ge le plus douloureux de Fail2ban consiste \u00e0 se bannir soi-m\u00eame. Si vous tapez plusieurs fois un mauvais mot de passe ou si votre client de sauvegarde \u00e9choue en boucle, votre propre IP rejoint la liste noire et vous perdez l&#8217;acc\u00e8s au serveur. La parade est la directive <code>ignoreip<\/code>, qui d\u00e9finit une liste blanche d&#8217;adresses jamais bannies.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[DEFAULT]\n# R\u00e9seau local, IPv6 locale, votre IP fixe, et un sous-r\u00e9seau d'entreprise\nignoreip = 127.0.0.1\/8 ::1 203.0.113.10 198.51.100.0\/24<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vous pouvez lister des adresses uniques, des plages CIDR, et m\u00eame des noms d&#8217;h\u00f4te (Fail2ban les r\u00e9sout au d\u00e9marrage). Si vous n&#8217;avez pas d&#8217;IP fixe, deux solutions existent : utiliser un VPN avec une adresse de sortie stable que vous placez en liste blanche, ou vous appuyer sur un bastion. \u00c9vitez en revanche de mettre en liste blanche des plages enti\u00e8res d&#8217;op\u00e9rateurs mobiles, car cela ouvrirait une br\u00e8che b\u00e9ante. Apr\u00e8s modification, rechargez avec <code>sudo fail2ban-client reload<\/code> pour que la liste blanche prenne effet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-11-jail-recidive\">\u00c9tape 11 : Activer la jail recidive contre les r\u00e9cidivistes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La jail <code>recidive<\/code> surveille le propre journal de Fail2ban et bannit pour tr\u00e8s longtemps les adresses qui se font bannir de fa\u00e7on r\u00e9p\u00e9t\u00e9e. C&#8217;est la sanction des robots les plus tenaces : une IP bannie plusieurs fois en quelques jours est mise \u00e0 l&#8217;\u00e9cart pour une semaine enti\u00e8re, tous services confondus. Activez-la dans <code>jail.local<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[recidive]\nenabled   = true\nlogpath   = \/var\/log\/fail2ban.log\nbanaction = nftables-allports\nbantime   = 1w\nfindtime  = 1d\nmaxretry  = 5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ici, une IP bannie cinq fois en une journ\u00e9e (<code>findtime = 1d<\/code>) est bloqu\u00e9e une semaine (<code>bantime = 1w<\/code>) sur tous les ports gr\u00e2ce \u00e0 <code>nftables-allports<\/code>. Comme la jail <code>recidive<\/code> lit <code>\/var\/log\/fail2ban.log<\/code>, assurez-vous que la journalisation vers ce fichier est active (c&#8217;est le cas par d\u00e9faut sur Debian et Ubuntu). Si vous avez activ\u00e9 <code>bantime.increment<\/code> \u00e0 l&#8217;\u00e9tape 5, la jail <code>recidive<\/code> vient compl\u00e9ter cette escalade en frappant les cas extr\u00eames encore plus fort.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-12-notifications\">\u00c9tape 12 : Recevoir des notifications par e-mail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour rester inform\u00e9 sans surveiller les journaux en permanence, configurez l&#8217;envoi d&#8217;un e-mail \u00e0 chaque bannissement. Vous aurez besoin d&#8217;un agent de transport de courrier (comme <code>postfix<\/code> en mode satellite ou <code>msmtp<\/code>) d\u00e9j\u00e0 capable d&#8217;envoyer du courriel depuis le serveur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[DEFAULT]\n# Adresses d'envoi et de r\u00e9ception des alertes\ndestemail = admin@votre-domaine.fr\nsender    = fail2ban@votre-domaine.fr\nmta       = sendmail\n\n# Action : bannir ET envoyer un mail avec les lignes de journal\naction = %(action_mwl)s<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;action <code>action_mwl<\/code> bannit l&#8217;IP, envoie un courriel et y joint un rapport WHOIS ainsi que les lignes de journal incriminantes (mwl = mail with logs). Si vous voulez seulement bannir sans alerte, gardez l&#8217;action par d\u00e9faut <code>action_<\/code>. Pour un volume d&#8217;attaques \u00e9lev\u00e9, attention \u00e0 ne pas vous noyer sous les e-mails : sur un serveur expos\u00e9, des centaines de bannissements quotidiens transformeraient vite cette alerte en bruit. R\u00e9servez les notifications aux jails critiques ou agr\u00e9gez-les via un outil de supervision.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"projet-complet\">Le projet complet : un jail.local pr\u00eat pour la production<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un fichier <code>\/etc\/fail2ban\/jail.local<\/code> complet, regroupant tous les r\u00e9glages de ce tutoriel. Il prot\u00e8ge SSH, durcit les seuils, escalade les peines, active la jail <code>recidive<\/code> et inclut deux jails web courantes (\u00e0 n&#8217;activer que si vous faites tourner Nginx). Adaptez les adresses IP et le domaine, puis collez-le tel quel.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[DEFAULT]\n# --- Politique globale de bannissement ---\nbantime  = 1h\nfindtime = 10m\nmaxretry = 3\n\n# Escalade automatique des peines pour les recidivistes\nbantime.increment = true\nbantime.factor    = 2\nbantime.maxtime   = 1w\n\n# Liste blanche : local + votre IP d'administration fixe\nignoreip = 127.0.0.1\/8 ::1 203.0.113.10\n\n# Pare-feu et source des journaux pour Debian 12 \/ Ubuntu 24.04\nbanaction          = nftables-multiport\nbanaction_allports = nftables-allports\nbackend            = systemd\n\n# Notifications (optionnel : necessite un MTA fonctionnel)\ndestemail = admin@votre-domaine.fr\nsender    = fail2ban@votre-domaine.fr\nmta       = sendmail\naction    = %(action_)s\n\n# --- Protection SSH ---\n[sshd]\nenabled  = true\nport     = ssh\nmaxretry = 3\n\n# --- Recidivistes (tous services) ---\n[recidive]\nenabled   = true\nlogpath   = \/var\/log\/fail2ban.log\nbanaction = nftables-allports\nbantime   = 1w\nfindtime  = 1d\nmaxretry  = 5\n\n# --- Nginx : echecs d'authentification HTTP (si applicable) ---\n[nginx-http-auth]\nenabled  = true\nport     = http,https\nbackend  = systemd\n\n# --- Nginx : recherche de scripts malveillants (si applicable) ---\n[nginx-botsearch]\nenabled  = true\nport     = http,https\nbackend  = systemd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Appliquez ce fichier en deux temps : testez d&#8217;abord la syntaxe avec <code>sudo fail2ban-client -t<\/code>, puis rechargez avec <code>sudo fail2ban-client reload<\/code>. Confirmez ensuite que toutes les jails attendues sont charg\u00e9es via <code>sudo fail2ban-client status<\/code>. Vous disposez d\u00e9sormais d&#8217;une <strong>configuration fail2ban<\/strong> robuste, pr\u00eate \u00e0 encaisser le trafic d&#8217;attaque permanent d&#8217;Internet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pieges-courants\">Cinq pi\u00e8ges courants \u00e0 \u00e9viter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La plupart des configurations Fail2ban qui \u00ab ne fonctionnent pas \u00bb se r\u00e9sument \u00e0 une poign\u00e9e d&#8217;erreurs r\u00e9currentes. Les voici, avec leur correctif.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Mauvais backend.<\/strong> Sur Debian 12 et Ubuntu 24.04, oublier <code>backend = systemd<\/code> alors qu&#8217;aucun <code>\/var\/log\/auth.log<\/code> n&#8217;existe fait que Fail2ban ne lit rien et ne bannit personne. V\u00e9rifiez avec <code>journalctl -u ssh<\/code>.<\/li><li><strong>Se bannir soi-m\u00eame.<\/strong> Ne pas renseigner son IP dans <code>ignoreip<\/code> avant de tester est le classique des classiques. Gardez toujours une seconde session SSH ouverte.<\/li><li><strong>Modifier jail.conf.<\/strong> Vos r\u00e9glages disparaissent \u00e0 la prochaine mise \u00e0 jour du paquet. Tout doit aller dans <code>jail.local<\/code> ou <code>jail.d\/<\/code>.<\/li><li><strong>Action iptables sur un syst\u00e8me nftables.<\/strong> Les bannissements semblent cr\u00e9\u00e9s mais n&#8217;aboutissent pas toujours. Alignez <code>banaction<\/code> sur le pare-feu r\u00e9el de la machine.<\/li><li><strong>Red\u00e9marrer au lieu de recharger.<\/strong> <code>systemctl restart fail2ban<\/code> efface les bannissements en cours. Pr\u00e9f\u00e9rez <code>fail2ban-client reload<\/code> pour conserver l&#8217;\u00e9tat.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"depannage\">D\u00e9pannage : huit probl\u00e8mes fr\u00e9quents et leurs solutions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quand Fail2ban se comporte mal, ce tableau vous oriente vers la cause la plus probable et la commande de diagnostic \u00e0 lancer.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Sympt\u00f4me<\/th><th>Cause probable<\/th><th>Solution<\/th><\/tr><\/thead><tbody><tr><td>Aucune IP n&#8217;est bannie<\/td><td>Mauvais backend ou logpath<\/td><td>Forcer <code>backend = systemd<\/code> et v\u00e9rifier <code>journalctl -u ssh<\/code><\/td><\/tr><tr><td><code>fail2ban-client -t<\/code> \u00e9choue<\/td><td>Erreur de syntaxe dans jail.local<\/td><td>Lire le message, corriger la ligne indiqu\u00e9e<\/td><\/tr><tr><td>Le service ne d\u00e9marre pas<\/td><td>Filtre ou action introuvable<\/td><td>Consulter <code>journalctl -u fail2ban -n 50<\/code><\/td><\/tr><tr><td>Jail sshd absente du status<\/td><td><code>enabled = true<\/code> manquant<\/td><td>Activer explicitement la jail<\/td><\/tr><tr><td>IP bannie toujours connect\u00e9e<\/td><td>Connexion \u00e9tablie avant le ban<\/td><td>Normal : nftables coupe les nouvelles connexions<\/td><\/tr><tr><td>Vous \u00eates bloqu\u00e9 dehors<\/td><td>Auto-bannissement<\/td><td>Console fournisseur puis <code>unbanip<\/code> votre IP<\/td><\/tr><tr><td>Erreurs \u00ab no logpath \u00bb<\/td><td>backend fichier sans fichier<\/td><td>Passer en <code>backend = systemd<\/code><\/td><\/tr><tr><td>Bannissements perdus au reboot<\/td><td>Persistance non configur\u00e9e<\/td><td>Activer la base SQLite (par d\u00e9faut r\u00e9cent)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous \u00eates verrouill\u00e9 hors du serveur, n&#8217;attendez pas l&#8217;expiration du bannissement : la plupart des h\u00e9bergeurs (OVHcloud, Scaleway, Hetzner) offrent une console web ou un mode rescue qui contourne SSH. Depuis cette console, lancez <code>sudo fail2ban-client set sshd unbanip VOTRE_IP<\/code>, ou arr\u00eatez temporairement le service avec <code>sudo systemctl stop fail2ban<\/code> le temps de corriger votre <code>ignoreip<\/code>. Pour un diagnostic g\u00e9n\u00e9ral, les journaux du d\u00e9mon dans <code>\/var\/log\/fail2ban.log<\/code> et la commande <code>journalctl -u fail2ban<\/code> contiennent presque toujours la r\u00e9ponse.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"astuces-avancees\">Astuces avanc\u00e9es pour aller plus loin<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"filtre-personnalise\">Cr\u00e9er un filtre personnalis\u00e9<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban prot\u00e8ge n&#8217;importe quel service qui \u00e9crit des \u00e9checs dans un journal, pas seulement SSH. Pour une application maison, cr\u00e9ez un filtre dans <code>\/etc\/fail2ban\/filter.d\/monapp.conf<\/code> avec une <code>failregex<\/code> qui capture l&#8217;adresse fautive via le marqueur <code>&lt;HOST&gt;<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Definition]\nfailregex = ^.*Authentication failure for .* from &lt;HOST&gt;.*$\nignoreregex =<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Testez votre expression r\u00e9guli\u00e8re sur un journal r\u00e9el avant de l&#8217;activer, gr\u00e2ce \u00e0 l&#8217;outil int\u00e9gr\u00e9 <code>fail2ban-regex<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo fail2ban-regex \/var\/log\/monapp.log \/etc\/fail2ban\/filter.d\/monapp.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La sortie indique combien de lignes correspondent et quelles adresses seraient bannies. C&#8217;est l&#8217;outil indispensable pour mettre au point un filtre sans risquer de bannir de vrais utilisateurs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ipv6-et-cloudflare\">IPv6 et services derri\u00e8re un proxy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban g\u00e8re IPv6 nativement avec nftables, \u00e0 condition que votre pare-feu accepte les deux familles d&#8217;adresses. Attention en revanche aux services plac\u00e9s derri\u00e8re un proxy ou un CDN comme Cloudflare : Fail2ban verrait l&#8217;IP du proxy, pas celle du visiteur r\u00e9el, et risquerait de bannir le CDN tout entier. Dans ce cas, lisez l&#8217;en-t\u00eate <code>X-Forwarded-For<\/code> dans vos journaux applicatifs et \u00e9crivez un filtre qui extrait la vraie adresse, ou utilisez l&#8217;int\u00e9gration native du proxy pour bloquer en amont.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fail2ban-vs-crowdsec\">Fail2ban face \u00e0 CrowdSec : lequel choisir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Depuis quelques ann\u00e9es, CrowdSec se positionne comme l&#8217;alternative moderne \u00e0 Fail2ban. La diff\u00e9rence de philosophie est nette. Fail2ban est un moniteur de journaux et un moteur de bannissement <strong>local<\/strong> : il observe les logs de votre seule machine et applique des r\u00e8gles de pare-feu. CrowdSec ajoute une dimension <strong>collaborative<\/strong> : les adresses d\u00e9tect\u00e9es comme malveillantes sont partag\u00e9es dans une base de r\u00e9putation communautaire, si bien qu&#8217;une IP rep\u00e9r\u00e9e sur un serveur peut \u00eatre bloqu\u00e9e pr\u00e9ventivement sur les autres.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Crit\u00e8re<\/th><th>Fail2ban<\/th><th>CrowdSec<\/th><\/tr><\/thead><tbody><tr><td>Architecture<\/td><td>H\u00f4te unique, autonome<\/td><td>Agent + base de r\u00e9putation partag\u00e9e<\/td><\/tr><tr><td>Renseignement<\/td><td>Local uniquement<\/td><td>Communautaire et multi-signaux<\/td><\/tr><tr><td>Langage<\/td><td>Python<\/td><td>Go<\/td><\/tr><tr><td>D\u00e9pendance r\u00e9seau<\/td><td>Aucune<\/td><td>Optionnelle (liste noire en ligne)<\/td><\/tr><tr><td>Complexit\u00e9<\/td><td>Faible, fichiers de config<\/td><td>Plus riche, sc\u00e9narios et parseurs<\/td><\/tr><tr><td>Id\u00e9al pour<\/td><td>VPS, auto-h\u00e9bergement, simplicit\u00e9<\/td><td>Parc de serveurs, d\u00e9fense mutualis\u00e9e<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pour un serveur unique, un VPS personnel ou un projet auto-h\u00e9berg\u00e9, Fail2ban reste le choix le plus l\u00e9ger, le plus simple \u00e0 comprendre et sans d\u00e9pendance externe. Pour un parc de machines ou une organisation qui veut b\u00e9n\u00e9ficier d&#8217;un renseignement de menace partag\u00e9, CrowdSec apporte une couche suppl\u00e9mentaire. Les deux ne sont d&#8217;ailleurs pas exclusifs : certains administrateurs font tourner Fail2ban pour SSH et CrowdSec pour le web. Le bon r\u00e9flexe reste de ma\u00eetriser d&#8217;abord Fail2ban, dont les concepts (filtre, jail, action) \u00e9clairent ensuite tout outil de pr\u00e9vention d&#8217;intrusion.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"securite-cve\">S\u00e9curiser Fail2ban lui-m\u00eame : la faille CVE-2025-45311<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un outil de s\u00e9curit\u00e9 doit lui-m\u00eame \u00eatre s\u00fbr. En 2025, la vuln\u00e9rabilit\u00e9 <strong>CVE-2025-45311<\/strong> a \u00e9t\u00e9 publi\u00e9e concernant <code>fail2ban-client<\/code> sur d&#8217;anciennes versions (autour de la branche 0.11.2), li\u00e9e \u00e0 des permissions trop permissives qui pouvaient, dans certaines configurations, permettre \u00e0 un utilisateur disposant de droits sudo limit\u00e9s d&#8217;effectuer des op\u00e9rations root arbitraires. La le\u00e7on est simple : maintenez Fail2ban \u00e0 jour via le gestionnaire de paquets de votre distribution, qui r\u00e9troporte les correctifs de s\u00e9curit\u00e9.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Restreignez l&#8217;acc\u00e8s au socket.<\/strong> Le socket de contr\u00f4le dans <code>\/var\/run\/fail2ban\/<\/code> ne doit \u00eatre accessible qu&#8217;\u00e0 root.<\/li><li><strong>Auditez vos r\u00e8gles sudo.<\/strong> N&#8217;accordez jamais un acc\u00e8s <code>fail2ban-client<\/code> trop large \u00e0 des comptes non administrateurs.<\/li><li><strong>Surveillez les CVE.<\/strong> Consultez r\u00e9guli\u00e8rement les annonces de s\u00e9curit\u00e9 de votre distribution et du projet sur GitHub.<\/li><li><strong>Mettez \u00e0 jour.<\/strong> Une simple commande <code>sudo apt update &amp;&amp; sudo apt upgrade<\/code> applique les correctifs disponibles.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban r\u00e9duit consid\u00e9rablement la surface d&#8217;attaque SSH, mais il s&#8217;inscrit dans une strat\u00e9gie de d\u00e9fense en profondeur. Combinez-le avec l&#8217;authentification par cl\u00e9s, la d\u00e9sactivation du login root direct, un pare-feu correctement configur\u00e9 et des mises \u00e0 jour r\u00e9guli\u00e8res. Aucun outil unique ne remplace cet empilement de protections.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"related-coverage\">Pour aller plus loin (Related Coverage)<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"\/vpn-wireguard-linux\/\">VPN WireGuard sur Linux : 12 \u00e9tapes, 30 min<\/a><\/li><li><a href=\"\/certificat-ssl-certbot-nginx\/\">Certificat SSL gratuit avec Certbot : 11 \u00e9tapes<\/a><\/li><li><a href=\"\/authentification-jwt-nodejs\/\">Authentification JWT en Node.js : 12 \u00e9tapes<\/a><\/li><li><a href=\"\/veracrypt-chiffrer-disque-tutoriel\/\">VeraCrypt : chiffrer un disque en 12 \u00e9tapes<\/a><\/li><li><a href=\"\/securite-des-mots-de-passe\/\">S\u00e9curit\u00e9 des mots de passe : longueur, hachage et gestionnaires<\/a><\/li><li><a href=\"\/security-hub\/\">S\u00e9curit\u00e9 en ligne : prot\u00e9ger ses donn\u00e9es et ses comptes<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">Questions fr\u00e9quentes sur Fail2ban<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fail2ban-ralentit-il-mon-serveur\">Fail2ban ralentit-il mon serveur ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Non, l&#8217;impact est n\u00e9gligeable. Fail2ban lit les journaux de fa\u00e7on incr\u00e9mentale et n&#8217;intervient sur le pare-feu qu&#8217;au moment d&#8217;un bannissement. Sur un serveur recevant des milliers d&#8217;attaques par jour, sa consommation processeur et m\u00e9moire reste minime. C&#8217;est l&#8217;une des raisons de sa popularit\u00e9 durable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quelle-est-la-bonne-duree-de-bannissement-bantime\">Quelle est la bonne dur\u00e9e de bannissement (bantime) ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le d\u00e9faut de Fail2ban est de 10 minutes, ce qui est court. Pour un serveur de production, 1 heure est un bon compromis, compl\u00e9t\u00e9 par <code>bantime.increment = true<\/code> qui allonge automatiquement la peine des r\u00e9cidivistes jusqu&#8217;\u00e0 une semaine. Bannir d\u00e9finitivement est d\u00e9conseill\u00e9, car les adresses IP peuvent \u00eatre r\u00e9attribu\u00e9es \u00e0 des utilisateurs l\u00e9gitimes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fail2ban-fonctionne-t-il-sans-var-log-auth-log\">Fail2ban fonctionne-t-il sans \/var\/log\/auth.log ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Oui. Sur Debian 12 et Ubuntu 24.04, les journaux SSH passent souvent par le journal systemd. R\u00e9glez <code>backend = systemd<\/code> dans votre jail pour que Fail2ban lise directement journald. C&#8217;est m\u00eame la configuration recommand\u00e9e sur les distributions r\u00e9centes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"comment-debloquer-une-adresse-ip-bannie\">Comment d\u00e9bloquer une adresse IP bannie ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Utilisez <code>sudo fail2ban-client set sshd unbanip 1.2.3.4<\/code> en rempla\u00e7ant le nom de la jail et l&#8217;adresse. Pour \u00e9viter qu&#8217;elle soit rebannie, ajoutez-la \u00e0 <code>ignoreip<\/code> dans <code>jail.local<\/code> puis rechargez la configuration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fail2ban-remplace-t-il-un-pare-feu\">Fail2ban remplace-t-il un pare-feu ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Non. Fail2ban pilote un pare-feu existant (nftables, iptables ou UFW) ; il n&#8217;en est pas un. Il faut donc disposer d&#8217;un pare-feu fonctionnel pour que les bannissements s&#8217;appliquent. Consid\u00e9rez Fail2ban comme la couche de d\u00e9cision et le pare-feu comme la couche d&#8217;ex\u00e9cution.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faut-il-choisir-fail2ban-ou-crowdsec\">Faut-il choisir Fail2ban ou CrowdSec ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pour un serveur unique ou un projet auto-h\u00e9berg\u00e9, Fail2ban est plus simple et sans d\u00e9pendance externe. CrowdSec apporte une r\u00e9putation partag\u00e9e entre serveurs, int\u00e9ressante pour un parc de machines. Les deux peuvent cohabiter. Commencer par Fail2ban est le meilleur moyen de comprendre les concepts de pr\u00e9vention d&#8217;intrusion.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"comment-proteger-dautres-services-que-ssh\">Comment prot\u00e9ger d&#8217;autres services que SSH ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban inclut des filtres pr\u00eats \u00e0 l&#8217;emploi pour Nginx, Apache, Postfix, Dovecot et bien d&#8217;autres dans <code>\/etc\/fail2ban\/filter.d\/<\/code>. Activez la jail correspondante dans <code>jail.local<\/code>, ou cr\u00e9ez votre propre filtre avec <code>fail2ban-regex<\/code> pour une application maison. Le principe (filtre, jail, action) reste identique.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quelle-est-la-derniere-version-de-fail2ban\">Quelle est la derni\u00e8re version de Fail2ban ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La version stable est Fail2ban 1.1.0, publi\u00e9e en 2024, avec une pr\u00e9version 1.1.1.beta0 disponible en amont. Pour un serveur de production, la version fournie par les d\u00e9p\u00f4ts de Debian ou Ubuntu (par exemple 1.0.2 sur Debian 12) est parfaitement adapt\u00e9e et re\u00e7oit les correctifs de s\u00e9curit\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sources-et-references\">Sources et r\u00e9f\u00e9rences<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.fail2ban.org\/\" target=\"_blank\" rel=\"noopener\">Site officiel de Fail2ban<\/a><\/li><li><a href=\"https:\/\/github.com\/fail2ban\/fail2ban\" target=\"_blank\" rel=\"noopener\">D\u00e9p\u00f4t GitHub et notes de version<\/a><\/li><li><a href=\"https:\/\/man.archlinux.org\/man\/jail.conf.5\" target=\"_blank\" rel=\"noopener\">Manuel jail.conf (param\u00e8tres de configuration)<\/a><\/li><li><a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2025-45311\" target=\"_blank\" rel=\"noopener\">CVE-2025-45311 (fail2ban-client)<\/a><\/li><li><a href=\"https:\/\/www.crowdsec.net\/\" target=\"_blank\" rel=\"noopener\">CrowdSec, l&#8217;alternative collaborative<\/a><\/li><li><a href=\"https:\/\/www.openssh.com\/\" target=\"_blank\" rel=\"noopener\">OpenSSH, le service \u00e0 prot\u00e9ger en priorit\u00e9<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Article mis \u00e0 jour le 12 juin 2026. Les commandes ont \u00e9t\u00e9 test\u00e9es sur Debian 12 et Ubuntu 24.04 LTS. V\u00e9rifiez toujours la configuration sur un serveur de test avant un d\u00e9ploiement en production.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Chaque serveur Linux expos\u00e9 sur Internet subit un d\u00e9luge de tentatives de connexion SSH automatis\u00e9es. Une \u00e9tude de pots de miel (honeypots) a enregistr\u00e9 plus de 11 milliards de tentatives\u2026<\/p>\n","protected":false},"author":8,"featured_media":88,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,3],"tags":[],"class_list":["post-87","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-10","category-security"],"_links":{"self":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/87","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/comments?post=87"}],"version-history":[{"count":1,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/87\/revisions"}],"predecessor-version":[{"id":91,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/87\/revisions\/91"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/media\/88"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/media?parent=87"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/categories?post=87"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/tags?post=87"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}