fail2ban avancé : jails multiples, filtres et banactions
À la fin de ce tutoriel, vous saurez structurer
jail.local/jail.d/(sans éditerjail.conf), activer plusieurs jails (sshd affiné, recidive, nginx-http-auth ou lab custom), écrire un filtre (filter.d+failregex), choisir unebanaction(nftables / iptables-multiport), et piloterignoreip,bantime/findtime/maxretryavecfail2ban-client status <jail>— suite du bonus P5, pas un redo « apt install + enable sshd seul ».Niveau : Intermédiaire+ · Temps estimé : 45–55 min · Versions testées : Ubuntu 22.04 / 24.04, Debian 12 ; notes Rocky/Alma 9 · Dernière vérification : 2026-09-11
Slug proposé :
linux-fail2ban-jails· Série : Linux Réseau & Sécurité · Remplace / fusionne : N/A — création (chapitre 2) ; P5 reste prérequis
Prérequis
- Hub Linux Réseau & Sécurité
- Bonus P5 ufw + fail2ban : jail
sshdbasique déjà vue — on ne s’arrête pas àapt install fail2ban - Chapitre 1 nftables recommandé (
banactionnft) - Console de secours ;
sudo; pas de secrets ; lab sous/tmp/lab-f2b+ drop-ins/etc/fail2ban/ - Optionnel : nginx lab pour jail
nginx-http-auth(sinon filtre custom fichier log factice)
Coût : 0 €. Risque : vous bannir vous-même — renseignez ignoreip avec votre IP admin avant les tests agressifs.
Ce que nous allons construire
jail.conf vs jail.local / jail.d (architecture)
→ [DEFAULT] ignoreip, bantime, findtime, maxretry, banaction
→ Jails multiples : sshd affiné + recidive + nginx-http-auth|custom
→ Filtre custom filter.d + failregex + fail2ban-regex
→ banaction nftables (pont iptables)
→ status / banip / unbanip · nettoyage lab
(Schéma à remplacer par une image locale Excalidraw / draw.io, alt : « fail2ban avancé : multi-jails, filter.d, banaction nftables ».)
Chapitre 2 de la série. Le bonus P5 pose une jail sshd ; ici on orchestre : récidive, filtre métier, action alignée sur nft. Gardez la console ouverte : un failregex trop large ou un ignoreip oublié bannit l’admin aussi vite qu’un attaquant.
Étape 1 — Architecture : jail.conf vs jail.local / jail.d
| Fichier | Rôle | Éditer ? |
|---|---|---|
/etc/fail2ban/jail.conf |
Défauts paquet | Non (écrasé à l’upgrade) |
/etc/fail2ban/jail.local |
Surcharges globales | Oui (ou minimal) |
/etc/fail2ban/jail.d/*.local |
Jails par service | Oui (recommandé) |
/etc/fail2ban/filter.d/ |
Filtres / failregex |
Custom ici |
/etc/fail2ban/action.d/ |
Banactions | Rarement forker |
# fail2ban déjà installé via P5 ? Sinon install minimal — le cœur du lab = conf avancée
dpkg -l fail2ban 2>/dev/null | tail -n 1 || sudo apt install -y fail2ban
ls /etc/fail2ban/jail.d/ 2>/dev/null
sudo fail2ban-client status 2>/dev/null || sudo systemctl enable --now fail2ban
Ordre de merge : jail.conf ← jail.local ← jail.d/*.conf ← jail.d/*.local. Placez vos jails avancées en jail.d/*.local.
Étape 2 — [DEFAULT] : ignoreip, fenêtres, banaction
Affinez les défauts une fois, puis les jails héritent (sauf override).
sudo tee /etc/fail2ban/jail.d/00-defaults-lab.local >/dev/null << 'EOF'
[DEFAULT]
# Votre IP admin / bastion — OBLIGATOIRE en lab (exemples RFC 5737 à remplacer)
ignoreip = 127.0.0.1/8 ::1 192.0.2.10
bantime = 30m
findtime = 10m
maxretry = 4
# Après chapitre nftables — sinon iptables-multiport
banaction = nftables-multiport
# backend journald (Ubuntu/Debian modernes)
backend = systemd
EOF
# Vérifier actions nft disponibles
ls /etc/fail2ban/action.d/nftables* 2>/dev/null | head
| Paramètre | Sens avancé |
|---|---|
ignoreip |
Never-ban (admin, monitoring, CI) |
findtime / maxretry |
Fenêtre + seuil d’échecs |
bantime |
Durée ; bantime.increment possible hors lab |
banaction |
Comment bannir (nftables-multiport, iptables-multiport, ufw…) |
Si nftables-multiport absent : banaction = iptables-multiport ou rester sur le pont ufw du bonus P5 le temps d’aligner nft.
Étape 3 — Jails multiples : sshd affiné + recidive + web
# 1) sshd — affinage (suppose jail P5 connue ; on surcharge)
sudo tee /etc/fail2ban/jail.d/sshd.local >/dev/null << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
backend = systemd
maxretry = 3
findtime = 5m
bantime = 1h
EOF
# 2) recidive — re-ban les IP souvent bannies (jail méta)
sudo tee /etc/fail2ban/jail.d/recidive.local >/dev/null << 'EOF'
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
backend = auto
bantime = 1d
findtime = 1d
maxretry = 3
banaction = nftables-allports
EOF
# 3) nginx-http-auth SI nginx + auth_basic présents ; sinon skip → étape filtre custom
if systemctl is-active nginx >/dev/null 2>&1; then
sudo tee /etc/fail2ban/jail.d/nginx-http-auth.local >/dev/null << 'EOF'
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
backend = auto
maxretry = 5
EOF
else
echo "nginx inactif — jail nginx-http-auth omise ; filtre custom étape 4"
fi
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client status recidive 2>/dev/null || true
| Jail | Rôle |
|---|---|
sshd |
Bruteforce SSH (seuils plus serrés qu’au bonus) |
recidive |
IP « habituées » → ban plus long / all ports |
nginx-http-auth |
401 auth_basic nginx (si stack web) |
Rocky/Alma : chemins log parfois /var/log/secure ; filtres sshd OK avec backend = systemd si journald.
Étape 4 — Filtre custom : filter.d + failregex
Lab sans dépendre de nginx : un log applicatif factice + jail dédiée.
mkdir -p /tmp/lab-f2b
# Log factice (lignes qui doivent matcher)
cat > /tmp/lab-f2b/app-auth.log << 'LOG'
2026-09-11T10:00:01Z AUTH_FAIL ip=203.0.113.50 user=alice
2026-09-11T10:00:02Z AUTH_FAIL ip=203.0.113.50 user=alice
2026-09-11T10:00:03Z AUTH_OK ip=192.0.2.10 user=admin
2026-09-11T10:00:04Z AUTH_FAIL ip=203.0.113.50 user=alice
LOG
sudo tee /etc/fail2ban/filter.d/lab-app-auth.conf >/dev/null << 'EOF'
[Definition]
failregex = ^s*S+ AUTH_FAIL ip=<HOST> user=S+
ignoreregex = AUTH_OK
EOF
# Tester le filtre SANS activer la jail
fail2ban-regex /tmp/lab-f2b/app-auth.log /etc/fail2ban/filter.d/lab-app-auth.conf
sudo tee /etc/fail2ban/jail.d/lab-app-auth.local >/dev/null << 'EOF'
[lab-app-auth]
enabled = true
filter = lab-app-auth
logpath = /tmp/lab-f2b/app-auth.log
backend = polling
banaction = nftables-multiport
port = 8080
maxretry = 3
findtime = 10m
bantime = 15m
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status lab-app-auth
# Ban manuel IP de doc (pas votre IP) :
# sudo fail2ban-client set lab-app-auth banip 203.0.113.50
# sudo fail2ban-client set lab-app-auth unbanip 203.0.113.50
| Directive filtre | Rôle |
|---|---|
failregex |
Lignes = échec ; <HOST> capture l’IP |
ignoreregex |
Exclusions |
fail2ban-regex |
Valide avant prod |
Sans match : affinez la regex sur une copie de log réel (pas de secrets). Documentez chaque filtre custom dans le dépôt d’infra : c’est du code de sécu, pas un one-liner jetable.
Étape 5 — Banactions, status et preuves
# Vue globale
sudo fail2ban-client status
# Détail d’une jail
sudo fail2ban-client status sshd
# Actions / nft : bans visibles côté firewall
sudo nft list ruleset 2>/dev/null | grep -i fail2ban | head ||
sudo iptables -S 2>/dev/null | grep -i f2b | head || true
# Logs service
sudo journalctl -u fail2ban -n 40 --no-pager
# Déblocage si vous vous êtes coincé (console)
# sudo fail2ban-client unban --all
| Action client | Effet |
|---|---|
status / status JAIL |
Jails actives, banned IP |
set JAIL banip IP |
Ban lab |
set JAIL unbanip IP |
Lever un ban |
unban --all |
Secours |
banaction = nftables-multiport pose des sets/chains nft ; nftables-allports (recidive) coupe plus large — d’où ignoreip strict.
Étape 6 — Vérification et nettoyage lab
sudo fail2ban-client status
sudo fail2ban-client status lab-app-auth 2>/dev/null || true
# Retirer les drop-ins LAB seulement (garder sshd P5 si voulu)
sudo rm -f /etc/fail2ban/jail.d/lab-app-auth.local
/etc/fail2ban/jail.d/00-defaults-lab.local
/etc/fail2ban/jail.d/recidive.local
/etc/fail2ban/filter.d/lab-app-auth.conf
# Optionnel : retirer nginx-http-auth.local de lab
# sudo rm -f /etc/fail2ban/jail.d/nginx-http-auth.local
sudo systemctl restart fail2ban
rm -rf /tmp/lab-f2b
sudo fail2ban-client status
echo "lab f2b avancé nettoyé — sshd P5 peut rester"
Validé si : ≥ 2 jails listées (sshd + recidive et/ou lab-app-auth), fail2ban-regex montre des hits, banaction nft (ou iptables) cohérente, ignoreip en place, nettoyage sans casser SSH.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
Jail does not exist |
Drop-in non chargé | restart fail2ban ; nom section [jail] = fichier |
| Filtre 0 match | failregex faux / mauvais logpath |
fail2ban-regex sur extrait réel |
| Auto-ban admin | ignoreip oublié |
Ajouter IP ; unbanip / console |
nftables-multiport fail |
Action absente / nft down | Paquet actions ; ou iptables-multiport |
| recidive ne part pas | /var/log/fail2ban.log absent |
Activer log cible ; backend adapté |
Éditer jail.conf perdu |
Upgrade paquet | Toujours .local / jail.d |
| Deux managers firewall | ufw + nft + banaction | Une stratégie (ch. nft) ; aligner banaction |
Quiz (3 questions)
1. Pourquoi éviter d’éditer jail.conf ?
– A. Il est illisible
– B. L’upgrade du paquet peut écraser vos changements — préférer jail.local / jail.d/*.local
– C. fail2ban refuse de démarrer avec jail.conf
2. Rôle d’un filtre failregex avec <HOST> ?
– A. Chiffrer les logs
– B. Repérer les lignes d’échec et capturer l’IP à bannir
– C. Remplacer nftables
3. À quoi sert la jail recidive ?
– A. Compiler le noyau
– B. Sanctionner plus fort les IP souvent re-bannies
– C. Désactiver SSH
Réponses : 1‑B · 2‑B · 3‑B
FAQ
Combien de jails activer d’un coup ?
P5 : une (sshd). Ici : sshd + recidive, puis une jail web ou custom. Trop de jails mal filtrées = faux positifs.
banaction nftables ou ufw ?
Après le chapitre nftables, préférez nftables-multiport. Le bonus P5 peut encore utiliser ufw — alignez pour une seule pile.
Comment tester un filtre sans bannir ?
fail2ban-regex <logfile> <filterfile> : compte les matches. Puis activez la jail avec bantime court et ignoreip large en lab.
Pour aller plus loin
man jail.conf,man fail2ban-client, filtres dans/etc/fail2ban/filter.d/- Suite : TLS avec certbot : nginx et/ou Caddy
- Prérequis : ufw + fail2ban · nftables
Maillage série Linux Réseau & Sécurité
| ← Précédent | Firewall avancé : nftables (pont ufw) |
| → Suivant | TLS avec certbot : nginx et/ou Caddy |
| Hub | Linux Réseau & Sécurité |
| Prérequis P5 | ufw + fail2ban |
Meta publication (à remplir dans Rank Math / SEO)
- Title SEO : fail2ban avancé : jails, filtres et banactions (2026)
- Meta description (≤ 155) : Configurez plusieurs jails fail2ban, filtres custom et banactions. Suite après ufw Basics — Linux DevOps 2026.
- Focus keyphrase : fail2ban
- KW secondaires : jail.local, failregex, banaction, recidive
- Schemas Rank Math : Article + HowTo (étapes lab) + FAQ (3 questions ci-dessus)
- Image mise en avant :
assets/web/devopelastichayway/cover-linux-fail2ban-jails-1200x630.webp(Visuels Linux — WebP 1200×630) - Catégorie : Linux · Niveau : Intermédiaire+
- Slug :
linux-fail2ban-jails - Statut : HOLD — draft only (ne pas publier)
← Retour parcours Linux — Basics, Admin, Réseau & Sécurité, Shell & Automation.