
Tu sais ce que c’est. Tu installes ton serveur fraîchement configuré, tu ouvres les bons ports, et une minute plus tard… tu regardes les logs et tu vois déjà les premières tentatives de brute-force sur ton SSH. Bienvenue sur Internet.
C’est pas grave en soi, mais ça fatigue. Alors autant mettre un petit videur à l’entrée. Un truc simple, discret, mais efficace : Fail2Ban.
Et mieux encore : on va le configurer sur mesure pour protéger :
- SSH (classique mais indispensable)
- Nginx (contre les tentatives de scan ou brute-force)
- Le serveur mail (Postfix, Dovecot… selon ton stack)
Pas de surcouche inutile, pas de solution magique : juste des règles précises, propres, et qui bloquent ce qui doit l’être.
1. Installer Fail2Ban
On commence par le plus simple. Sous Debian / Ubuntu :
sudo apt update && sudo apt install fail2ban
Sous CentOS / RHEL :
sudo dnf install fail2ban
Le service est généralement désactivé par défaut :
sudo systemctl enable --now fail2ban
Une fois lancé, Fail2Ban surveille certains fichiers de log et, selon les règles (appelées jails), peut bannir une IP temporairement via iptables ou nftables
.
2. Structure des fichiers : où écrire quoi
/etc/fail2ban/jail.conf
: le fichier principal. Ne le modifie pas directement.-
Crée plutôt
/etc/fail2ban/jail.local
ou, mieux encore, un fichier par service :/etc/fail2ban/jail.d/nginx.local
/etc/fail2ban/jail.d/ssh.local
- etc.
Pareil pour les filtres :
- Les fichiers sont dans
/etc/fail2ban/filter.d/
- Tu peux en créer ou modifier à la volée, on verra ça plus bas.
3. Sécuriser SSH rapidement
Un classique, mais toujours utile.
Crée le fichier /etc/fail2ban/jail.d/ssh.local
:
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
bantime = 3600
findtime = 600
maxretry = 4
Explication rapide :
bantime
: durée du ban (en secondes)findtime
: période pendant laquelle on compte les échecsmaxretry
: nombre d’échecs avant ban
Tu peux tester avec une IP manuellement :
sudo fail2ban-client set sshd banip 1.2.3.4
Et vérifier la liste des IP bannies :
sudo fail2ban-client status sshd
4. Protéger Nginx avec des règles personnalisées
Fail2Ban ne gère pas Nginx par défaut, mais tu peux facilement créer tes propres règles pour bloquer :
- Les scans de vulnérabilités (accès à
/phpmyadmin
,/wp-login
, etc.) - Les erreurs 404 en rafale
- Les tentatives de brute-force sur un login
a. Créer un filtre Nginx custom
Crée un fichier : /etc/fail2ban/filter.d/nginx-bad-requests.conf
[Definition]
failregex = -.*"(GET|POST).*(phpmyadmin|wp-login|xmlrpc|\.env|\.git)"
ignoreregex =
Tu peux adapter les patterns selon ton app.
b. Créer le fichier jail correspondant
Dans /etc/fail2ban/jail.d/nginx.local
:
[nginx-bad-requests]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
bantime = 1800
findtime = 300
maxretry = 3
Astuce : pour éviter de bloquer des IP par erreur, commence avec
bantime = 60
le temps de tester.
Redémarre Fail2Ban :
sudo systemctl restart fail2ban
5. Protéger Postfix et Dovecot
Si tu gères un serveur mail, tu sais déjà à quel point il attire les bots. Heureusement, Fail2Ban sait bien gérer ça.
a. Activer les jails standard
Crée /etc/fail2ban/jail.d/mail.local
:
[postfix]
enabled = true
port = smtp,ssmtp,submission
logpath = /var/log/mail.log
maxretry = 5
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission
logpath = /var/log/mail.log
maxretry = 5
Les filtres pour Postfix et Dovecot sont déjà fournis avec Fail2Ban (postfix.conf
, dovecot.conf
).
b. Pour aller plus loin
Tu peux créer un filtre dédié pour détecter les authentifications répétées ratées (ou des bots qui essaient des noms d’utilisateur génériques comme info@
, test@
, etc.).
Par exemple, un fichier /etc/fail2ban/filter.d/dovecot-login-abuse.conf
avec :
[Definition]
failregex = (?:auth|imap-login|pop3-login):.*auth failed.*rip=
Puis active-le dans ton mail.local
:
[dovecot-login-abuse]
enabled = true
port = imap,imaps
logpath = /var/log/mail.log
maxretry = 3
bantime = 600
6. Bonus : notifications et unban
Tu veux être alerté quand une IP est bannie ? Active les mails avec :
destemail = ton@email.tld
sender = fail2ban@monserveur
action = %(action_mwl)s
Et pour débloquer une IP (ça arrive, surtout en dev…) :
sudo fail2ban-client set nginx-bad-requests unbanip 123.123.123.123
7. Quelques hébergeurs qui s’y prêtent bien
Fail2Ban fonctionne aussi bien sur un VPS que sur un dédié. L’important, c’est d’avoir un accès root et des logs en clair. Parmi les hébergeurs qui s’y prêtent bien :
- NetCup : très souple mais parfois un peu brut de décoffrage
- Contabo : pas cher, mais testez bien les perfs