Fail2ban est un outil indispensable pour protéger un serveur exposé sur Internet contre les tentatives de brute‑force (SSH, HTTP, etc.). L’outil surveille les logs, détecte les échecs répétés, puis bannit temporairement l’adresse IP via le pare‑feu.
Objectifs de cet article :
- Installer Fail2ban sur Ubuntu/Debian
- Comprendre sa philosophie (filters, jails, actions)
- Activer une protection SSH simple et efficace
- Comment vérifier le bon fonctionnement, dépanner et des pistes pour aller plus loin (recidive, notifications)
Pré‑requis :
- Un serveur Debian/Ubuntu avec accès sudo
- Un pare‑feu actif (UFW recommandé sur Ubuntu) ou iptables/nftables
Installation et démarrage
Sur Debian/Ubuntu récents :
sudo apt update
sudo apt install fail2ban
Activer au démarrage et lancer :
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
Philosophie et fichiers importants
- Filters (filtres) : regex qui détectent les lignes suspectes dans les logs (ex :
/etc/fail2ban/filter.d/sshd.conf
). - Actions : que fait Fail2ban quand il bannit ? (ex : ajouter une règle firewall via UFW/iptables/nftables).
- Jails : association filtre + action + paramètres (bantime, findtime, maxretry, etc.).
Ne modifiez jamais les fichiers .conf
fournis par le paquet ; créez des .local
pour surcharger :
- Fichier global :
/etc/fail2ban/jail.local
- Dossiers de configuration utilisateurs :
/etc/fail2ban/jail.d/*.local
et*.conf
(priorité.local
)
Les journaux observés peuvent être des fichiers (ex : /var/log/auth.log
) ou le journal systemd
(backend systemd
).
Configuration de base: protéger SSH
Créer un fichier /etc/fail2ban/jail.local
:
[DEFAULT]
# Temps de bannissement (ex : 10 minutes)
bantime = 10m
# Fenêtre d’observation des échecs
findtime = 10m
# Nombre d’échecs avant ban
maxretry = 5
# Adresse(s) à ne jamais bannir (mettez votre IP publique)
ignoreip = 127.0.0.1/8 ::1
# Lecture de logs via systemd (souvent plus fiable sur Ubuntu/Debian)
backend = systemd
# Choisissez l’action selon votre pare‑feu (voir plus bas)
# banaction = ufw
# banaction = iptables-multiport
# banaction = nftables-multiport
[sshd]
enabled = true
port = 22
# Le filtre sshd est fourni par défaut
filter = sshd
# Journal : laissez Fail2ban deviner avec backend=systemd
# (Sinon: logpath = /var/log/auth.log)
Sauvegardez, puis rechargez la configuration :
sudo systemctl reload fail2ban
# ou
sudo fail2ban-client reload
Choisir le firewall (UFW / iptables / nftables)
Vérifiez quel firewall est installé :
sudo ufw status # si actif, privilégier banaction=ufw
sudo which iptables # compat couche iptables-nft possible
sudo which nft # présence de nftables
- Si UFW est votre pare‑feu :
# dans [DEFAULT]
banaction = ufw
- Sans UFW, sur systèmes modernes (nftables) :
banaction = nftables-multiport
- Anciennes configs encore basées iptables :
banaction = iptables-multiport
Vérifier que ça fonctionne
- État global :
sudo fail2ban-client status
- Détail du jail SSH :
sudo fail2ban-client status sshd
- Voir les IP bannies, les tentatives récentes, etc. Exemple de sortie :
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| `- Total failed: 12
`- Actions
|- Currently banned: 2
`- Total banned: 4
- Débannir manuellement une IP (ex : 203.0.113.10) :
sudo fail2ban-client set sshd unbanip 203.0.113.10
- Bannir manuellement pour tester :
sudo fail2ban-client set sshd banip 203.0.113.10
- Logs Fail2ban :
sudo journalctl -u fail2ban -e
# ou
sudo tail -f /var/log/fail2ban.log
Ajuster la sensibilité (bantime, findtime, maxretry)
- bantime : durée de ban (ex : 10m, 1h, 24h). Unité : s, m, h, d, w.
- findtime : fenêtre pendant laquelle on compte les échecs.
- maxretry : nombre d’échecs permis dans la fenêtre.
Exemple « plus strict » :
[DEFAULT]
bantime = 1h
findtime = 15m
maxretry = 3
Astuce : mettez des valeurs plus permissives au début pour éviter de vous bannir et ajustez progressivement.
Whitelist: ignorer vos IPs
Ajoutez votre IP publique (ou votre bureau/VPN) dans ignoreip
:
ignoreip = 127.0.0.1/8 ::1 198.51.100.42 203.0.113.0/24
Rechargez ensuite Fail2ban.
Aller plus loin
Jail « recidive » (récidivistes)
Le jail recidive
bannit plus longtemps les IP qui déclenchent plusieurs bans dans la journée.
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5
Note : ce jail opère au‑dessus des autres jails (il lit le log Fail2ban). Utile en production.
Protéger Nginx
Plusieurs filtres sont fournis (selon la distribution) : nginx-http-auth
, nginx-botsearch
, etc. Exemple d’un jail basique :
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 10m
bantime = 1h
Vérifiez que le filtre existe sur votre système :
ls /etc/fail2ban/filter.d/ | grep nginx
Sinon, vous pouvez créer vos propres filtres et jails dans *.local
. Testez vos regex avec :
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-botsearch.conf
Notifications email
Vous pouvez recevoir un email lors d’un ban, en utilisant une action prédéfinie (ex : action_mw
, action_mwl
). Il faut disposer d’un agent de mail (ex : postfix
).
Exemple :
[DEFAULT]
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mwl)s
Bonnes pratiques
- Toujours utiliser des fichiers
.local
, ne pas modifier les.conf
d’origine. - Recharger la configuration après modification :
sudo fail2ban-client reload
. - Tester les filtres avec
fail2ban-regex
si un jail ne matche pas. - Surveiller
journalctl -u fail2ban
pour les erreurs (permissions de logs, chemins). - Ne mettez pas un gros
bantime
au début , combinez plutôt avecrecidive
. - Avec UFW, assurez‑vous que les ports légitimes restent ouverts (allow) avant d’activer des jails.