Document

SUBSCRIBE TO GET FULL ACCESS TO THE E-BOOKS FOR FREE 🎁SUBSCRIBE NOW

Professional Dropdown with Icon

SUBSCRIBE NOW TO GET FREE ACCESS TO EBOOKS

fail2ban avancé : jails multiples, filtres et banactions

À la fin de ce tutoriel, vous saurez structurer jail.local / jail.d/ (sans éditer jail.conf), activer plusieurs jails (sshd affiné, recidive, nginx-http-auth ou lab custom), écrire un filtre (filter.d + failregex), choisir une banaction (nftables / iptables-multiport), et piloter ignoreip, bantime / findtime / maxretry avec fail2ban-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 sshd basique déjà vue — on ne s’arrête pas à apt install fail2ban
  • Chapitre 1 nftables recommandé (banaction nft)
  • 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.confjail.localjail.d/*.confjail.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

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.