Ouvre les journaux SSH d'un VPS exposé sur Internet : tu y verras des centaines de tentatives de connexion par jour, avec des noms comme admin, test ou ubuntu. Ce sont des robots qui essaient des mots de passe en boucle. fail2ban est l'outil qui les met à la porte.
Le principe tient en une phrase : fail2ban lit les journaux, repère les échecs, et quand une même adresse IP échoue trop souvent, il la bloque dans le pare-feu pendant un certain temps. Voyons comment il fonctionne, comment le régler, et surtout comment vérifier qu'il fait vraiment son travail.
Les trois pièces : filtre, jail, action
fail2ban assemble trois éléments, chacun dans son dossier sous /etc/fail2ban/ :
- Le filtre (
filter.d/) : des expressions régulières qui reconnaissent une ligne d'échec, par exemple « Failed password for root from 203.0.113.42 ». Il en existe pour SSH, nginx, Postfix, et des dizaines d'autres services. - L'action (
action.d/) : ce qu'on fait d'une adresse fautive. Par défaut, une règle de pare-feu (iptables ou nftables) qui rejette ses paquets. - La jail (une « prison ») : elle relie un filtre, une source de journaux et une action, avec ses propres réglages. La jail
sshdsurveille SSH, une jailnginx-http-authsurveillerait les mots de passe d'un site.
bantime, findtime, maxretry
Trois réglages décident de tout. Avec maxretry = 5, findtime = 10m et bantime = 1h, la règle se lit ainsi : 5 échecs en 10 minutes depuis la même IP, et elle est bannie pendant une heure. À la fin du bannissement, fail2ban la libère tout seul.
maxretry: le nombre d'échecs tolérés. Trop bas, tu te bannis toi-même à la moindre faute de frappe ; 3 à 5 est un bon compromis.findtime: la fenêtre de temps dans laquelle les échecs sont comptés. Les unitésm,hetdsont acceptées.bantime: la durée du bannissement.-1bannit pour toujours, ce qui est rarement une bonne idée (les adresses changent de main).
Pour les récidivistes, bantime.increment = true allonge le bannissement à chaque retour de la même adresse : une heure la première fois, puis deux, puis quatre, et ainsi de suite.
Où se trouve la configuration
Ne modifie jamais /etc/fail2ban/jail.conf : une mise à jour du paquet peut l'écraser. Tes réglages vont dans /etc/fail2ban/jail.local (ou dans des fichiers de /etc/fail2ban/jail.d/), qui sont lus après et prennent le dessus. Sur Debian et Ubuntu, le paquet active déjà la jail sshd via jail.d/defaults-debian.conf.
Voici un jail.local complet pour SSH. Remplace 198.51.100.7 par ton adresse IP fixe, si tu en as une : ignoreip liste les adresses qui ne seront jamais bannies.
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.7
[sshd]
enabled = true
# Lit le journal systemd : nécessaire sur Debian 12, sans /var/log/auth.log
backend = systemd/etc/fail2ban/jail.local. Le backend systemd demande le paquet python3-systemd.# Vérifie la configuration, puis recharge
sudo fail2ban-client -t
sudo fail2ban-client reloadVérifier qu'il fonctionne
Un fail2ban installé mais mal réglé ne bannit personne, et rien ne te prévient. Trois commandes suffisent à t'en assurer. D'abord, le service tourne-t-il, et quelles jails sont actives ?
sudo systemctl status fail2ban
sudo fail2ban-client statusEnsuite, le détail de la jail SSH :
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 143
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 3
|- Total banned: 27
`- Banned IP list: 203.0.113.42 192.0.2.77 198.51.100.23Total failed qui reste à 0 sur un serveur exposé depuis des jours est suspect : le filtre ne lit probablement pas le bon journal.Enfin, si tu as un doute sur le filtre, fail2ban-regex le rejoue sur les journaux existants et compte les lignes reconnues. Le journal de fail2ban lui-même, /var/log/fail2ban.log, montre chaque bannissement en direct.
sudo fail2ban-regex systemd-journal sshd
sudo tail -f /var/log/fail2ban.logDébannir une adresse IP
Ça arrive : un collègue se trompe de mot de passe cinq fois, ou c'est toi. Pour libérer l'adresse sans attendre la fin du bannissement :
# Dans une jail précise
sudo fail2ban-client set sshd unbanip 203.0.113.42
# Dans toutes les jails
sudo fail2ban-client unban 203.0.113.42
# Bannir à la main une adresse qui insiste
sudo fail2ban-client set sshd banip 203.0.113.42Ce que fail2ban ne fait pas
fail2ban réduit le bruit et ralentit les attaques par force brute, mais il ne remplace pas une connexion par clé SSH. Si les mots de passe sont désactivés, ces robots n'avaient de toute façon aucune chance : fail2ban leur fait simplement perdre leur temps ailleurs. Il ne protège pas non plus contre une faille dans une application web, et une attaque répartie sur des milliers d'adresses passe sous ses seuils.
Pense aussi aux services dans Docker : leurs ports ne passent pas par les règles habituelles du pare-feu, une jail qui les protège doit agir sur la chaîne DOCKER-USER.