Offre de lancement — -20% sur tous les VPS avec le code NVH20 · Déploiement en 60 secondes
Accueil / Documentation / Sécurité
Sécurité

Fail2ban avancé : protéger Nginx, WordPress et la messagerie

Par Équipe NVHCloud 2026-09-18 Lecture : 4 min

Si vous avez suivi sécuriser SSH, Fail2ban protège déjà votre accès SSH. Mais sur un serveur web, les robots s'attaquent surtout à tout le reste : formulaires de connexion, pages d'administration, fichiers de configuration oubliés. Ce guide étend Fail2ban à Nginx, WordPress et la messagerie, et ajoute un bannissement long pour ceux qui reviennent.

1. Comment Fail2ban décide

Fail2ban assemble trois éléments dans une jail :

  • un filtre, une expression régulière qui reconnaît une tentative malveillante dans un journal ;
  • des seuils : maxretry tentatives dans une fenêtre de findtime déclenchent un bannissement de bantime ;
  • une action, en général une règle de pare-feu qui bloque l'adresse.

Fail2ban fournit des dizaines de filtres prêts à l'emploi dans /etc/fail2ban/filter.d/. Ne modifiez jamais les fichiers .conf fournis : placez vos réglages dans des fichiers .local, qui ne sont pas écrasés par les mises à jour.

2. Une base propre avec liste blanche

Commencez par /etc/fail2ban/jail.local :

[DEFAULT]
bantime   = 1h
findtime  = 10m
maxretry  = 5
banaction = ufw
ignoreip  = 127.0.0.1/8 ::1 VOTRE_IP_FIXE

ignoreip est essentiel : ajoutez-y l'adresse de votre bureau ou de votre serveur de supervision. Sans elle, une série de connexions légitimes rapprochées, comme un script de déploiement qui se reconnecte plusieurs fois, peut vous bannir de votre propre serveur.

3. Le piège du backend

Fail2ban lit soit des fichiers de journaux, soit le journal systemd. SSH écrit dans le journal systemd, surtout sur Debian 12, alors que Nginx écrit dans des fichiers. Si vous mettez backend = systemd dans la section [DEFAULT], les jails Nginx ignorent leur logpath et ne voient jamais rien, sans aucun message d'erreur. Réglez donc le backend par jail : systemd pour SSH, auto pour les services qui écrivent dans des fichiers, comme dans les exemples ci-dessous.

4. Protéger Nginx

Ajoutez à jail.local :

[sshd]
enabled = true
backend = systemd
maxretry = 3
bantime  = 24h

[nginx-http-auth]
enabled = true
backend = auto
port    = http,https
logpath = /var/log/nginx/error.log

[nginx-botsearch]
enabled  = true
backend  = auto
port     = http,https
logpath  = /var/log/nginx/access.log
maxretry = 2

[nginx-limit-req]
enabled = true
backend = auto
port    = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
  • nginx-http-auth bannit les échecs répétés sur les zones protégées par mot de passe Nginx.
  • nginx-botsearch repère les robots qui cherchent des pages d'administration et des scripts connus sur votre site.
  • nginx-limit-req bannit les adresses qui dépassent régulièrement la limite de requêtes de Nginx. Il ne fonctionne que si vous avez configuré une directive limit_req, décrite dans limiter l'impact d'une attaque DDoS.

5. Protéger le formulaire de connexion WordPress

Aucun filtre WordPress n'est fourni. Créez /etc/fail2ban/filter.d/wordpress.conf :

[Definition]
failregex = ^<HOST> .* "POST /wp-login\.php
            ^<HOST> .* "POST /xmlrpc\.php
ignoreregex =

Puis la jail correspondante :

[wordpress]
enabled  = true
backend  = auto
port     = http,https
filter   = wordpress
logpath  = /var/log/nginx/access.log
maxretry = 5
findtime = 10m
bantime  = 6h

Un utilisateur légitime soumet le formulaire une ou deux fois ; un robot, des dizaines. Si vous hébergez plusieurs sites avec des journaux séparés, listez-les tous sur plusieurs lignes dans logpath. Pour la configuration de WordPress elle-même, voir installer WordPress sur un VPS.

6. Protéger la messagerie

Si le serveur reçoit du courrier ou authentifie des utilisateurs en SMTP :

[postfix]
enabled = true
backend = systemd
mode    = aggressive

[postfix-sasl]
enabled = true
backend = systemd
maxretry = 3

Le mode aggressive repère aussi les tentatives de relais et les adresses inexistantes. Un serveur qui ne fait qu'envoyer des notifications n'a pas besoin de ces jails : voir configurer Postfix.

7. Punir les récidivistes

Beaucoup de robots reviennent dès la fin de leur bannissement. La jail recidive lit le propre journal de Fail2ban et bannit pour une semaine toute adresse bannie plusieurs fois en une journée :

[recidive]
enabled  = true
backend  = auto
logpath  = /var/log/fail2ban.log
bantime  = 1w
findtime = 1d
maxretry = 3

8. Tester un filtre avant de l'activer

Un filtre qui ne correspond à rien ne protège rien ; un filtre trop large bannit vos visiteurs. Testez-le sur le vrai journal :

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress.conf

La commande indique combien de lignes correspondent. Appliquez ensuite la configuration :

fail2ban-client -t && systemctl restart fail2ban
fail2ban-client status

La première commande vérifie la syntaxe de toute la configuration, la dernière liste les jails actives.

9. Gérer les bannissements

fail2ban-client status wordpress                  # adresses bannies par une jail
fail2ban-client set wordpress unbanip 203.0.113.10 # débannir une adresse
fail2ban-client get sshd ignoreip                 # voir la liste blanche
fail2ban-client banned                            # toutes les adresses bannies

Si vous vous êtes banni vous-même, connectez-vous depuis une autre connexion, par exemple le partage de connexion de votre téléphone, ou par la console de secours, puis débannissez votre adresse et ajoutez-la à ignoreip.

Questions fréquentes

Fail2ban peut-il bloquer mes propres visiteurs ?
Oui, si un filtre est trop large ou un seuil trop bas. Testez chaque filtre avec fail2ban-regex avant de l'activer, gardez des seuils raisonnables et ajoutez vos adresses fixes dans ignoreip. Surveillez aussi le nombre d'adresses bannies dans les premiers jours.
Pourquoi ma jail Nginx ne bannit jamais personne ?
Le plus souvent, backend = systemd est défini dans la section DEFAULT : la jail lit alors le journal systemd au lieu du fichier indiqué dans logpath, où Nginx écrit. Réglez backend = auto sur les jails qui lisent des fichiers, et vérifiez le filtre avec fail2ban-regex.
Fail2ban protège-t-il contre une attaque DDoS ?
Non. Il agit sur des adresses isolées qui répètent des tentatives, en quelques secondes ou minutes. Une attaque distribuée vient de milliers d'adresses et sature la connexion : elle doit être filtrée en amont, sur le réseau de l'hébergeur.
Combien de temps faut-il bannir une adresse ?
Une heure suffit pour la plupart des robots, qui passent à une autre cible. Réservez les bannissements longs à SSH et aux récidivistes, grâce à la jail recidive. Des bannissements très longs pour tout le monde finissent par pénaliser des utilisateurs légitimes dont l'adresse IP a changé de propriétaire.