---
title: Fail2Ban
created: 2026-06-07
updated: 2026-06-07
type: app
tags: [catalogue, networking, security, brute-force, ip-banning, python]
confidence: high
contested: false
sources: [https://selfh.st/apps/?tag=networking, https://github.com/fail2ban/fail2ban]
---

# 🚫 Fail2Ban

> **Daemon de protection anti-brute-force** qui surveille les logs de services (SSH, web, mail…) et bannit automatiquement les IP suspectes via iptables/nftables. Le standard historique de la sécurité périmétrique self-hosted.

| Métadonnée | Valeur |
| :--- | :--- |
| **Site web** | [fail2ban.org](https://www.fail2ban.org) |
| **GitHub** | [fail2ban/fail2ban](https://github.com/fail2ban/fail2ban) |
| **License** | GPL-2.0 |
| **Langage** | Python |
| **Étoiles** | 14 800 ⭐ |
| **Dernière MAJ** | 2026-05-12 |
| **Catégorie** | [[cat-networking\|Networking]] |

## Description

Fail2Ban est un **framework de prévention d'intrusions** écrit en Python qui lit en continu les fichiers de journalisation (syslog, auth.log, nginx, postfix, etc.) et déclenche des actions — le plus souvent un **ban IP via iptables, nftables ou ufw** — lorsqu'un comportement suspect est détecté. Plusieurs tentatives SSH échouées depuis la même IP ? Fail2Ban ajoute cette IP à une « jail » et la bloque pour une durée configurable (par défaut 10 minutes, récidive = durée exponentielle).

L'outil est structuré autour de **filtres (regex)** et de **jails (politiques)** : un filtre reconnaît un motif dans les logs (ex. « Failed password for »), une jail définit combien d'occurrences déclenchent un ban, sur quelle durée, et quelle action exécuter. Plus de 100 filtres sont fournis par défaut (sshd, apache, nginx, postfix, dovecot, recidive, etc.), couvrant la majorité des services courants d'un homelab.

Fail2Ban s'intègre dans une **défense en profondeur** : il ne remplace pas un pare-feu applicatif (WAF) ni l'authentification forte, mais il **réduit drastiquement la surface d'attaque** en bloquant en bordure les scans et attaques automatisées. Il est l'ancêtre et le complément local de solutions collaboratives comme [[app-crowdsec]], qui pousse la logique plus loin avec un partage d'IOC entre instances.

## Installation

### Docker Compose (recommandé)

L'image officielle monte le daemon avec iptables, en `network_mode: host` ou via un sidecar : le plus simple est `network_mode: host` afin que Fail2Ban puisse manipuler la table INPUT d'iptables du système hôte.

```yaml
# docker-compose.yml
services:
  fail2ban:
    image: crazymax/fail2ban:latest
    container_name: fail2ban
    restart: unless-stopped
    network_mode: host
    cap_add:
      - NET_ADMIN
      - NET_RAW
    volumes:
      - /var/log:/var/log:ro
      - /home/fail2ban/data:/data
      - ./action.d:/etc/fail2ban/action.d:ro
      - ./filter.d:/etc/fail2ban/filter.d:ro
      - ./jail.d:/etc/fail2ban/jail.d:ro
      - ./fail2ban.local:/etc/fail2ban/fail2ban.local:ro
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
```

### Installation manuelle (Debian/Ubuntu)

```bash
sudo apt update && sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
```

## Configuration

Le fichier canonique est `/etc/fail2ban/jail.local` (qui surcharge `jail.conf`). Exemple minimaliste :

```ini
[DEFAULT]
backend = systemd
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = nftables-multiport

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = %(sshd_log)s
maxretry = 3

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

Commandes utiles :

```bash
sudo fail2ban-client status         # état global
sudo fail2ban-client status sshd    # état d'une jail
sudo fail2ban-client set sshd unbanip 203.0.113.42
sudo fail2ban-client banned         # IP bannies cumulées
```

## Alternatives

### Open Source

- [[app-crowdsec]] — Successeur moderne, collaboratif (blocklist partagée), Go
- [[app-crowdsec-manager]] — Dashboard web de visualisation CrowdSec
- **DenyHosts** — Spécialisé SSH, plus maintenu
- **sshguard** — Plus léger, écrit en C, basé sur PF/ipfw
- **iptables recent match** — Solution noyau sans daemon (règle pure)

### Propriétaire (ce que Fail2Ban remplace)

- **Cloudflare WAF** (payant) — filtrage en périphérie CDN
- **Imperva / Akamai** Bot Manager (entreprise)
- **Fail2ban-as-a-Service** (Cognito, Castle.io)

## Sécurité

- **Mettre à jour** régulièrement (CVE historiques sur le parsing des filtres).
- **Ne jamais logger en clair les mots de passe** : Fail2Ban stocke les bannis, pas les credentials.
- **Combiner avec un VPN** (WireGuard) plutôt qu'exposer SSH sur Internet.
- **Whitelist IP de confiance** via `ignoreip = 192.168.0.0/16 203.0.113.0/24` dans `[DEFAULT]`.
- **Utiliser `recidive`** : une jail qui bannit longuement (1 semaine) les IP qui recidivent après un premier ban.
- **Notifications** : webhook Discord/Slack via `action.d/` pour réagir en temps réel.
- **Docker** : attention aux containers en `bridge` — `network_mode: host` est nécessaire pour qu'iptables voie le trafic entrant réel.

## Ressources

- [Site officiel](https://www.fail2ban.org)
- [Wiki & documentation](https://github.com/fail2ban/fail2ban/wiki)
- [Image Docker crazy-max](https://github.com/crazy-max/docker-fail2ban)
- [Awesome Fail2Ban](https://github.com/chaifeng/awesome-fail2ban)
- [Communauté](https://github.com/fail2ban/fail2ban/discussions)

## Pages Liées

- [[cat-networking|Networking]] — Catégorie parente
- [[cat-security|Sécurité]] — Catégorie transversale
- [[app-crowdsec]] — Successeur moderne et collaboratif
- [[app-crowdsec-manager]] — Dashboard CrowdSec
- [[recettes-docker-compose|Recettes Docker Compose]] — Templates partagés
- [[securisation-home-lab]] — Guide sécurité global
