
Homelab 18 : bannir les scanners avec fail2ban, et le piège Docker qui rend les bannissements inutiles
Dès que les ports 80 et 443 sont ouverts, les scanners arrivent : des milliers de requêtes vers des pages d'administration, de vieilles failles, des mots de passe devinés en boucle. fail2ban lit les journaux de votre proxy et bannit une adresse pour un moment après quelques erreurs. C'est simple et efficace, à une condition qu'une installation Docker casse sans bruit.
Un peu d'histoire
fail2ban date de 2004. Son idée n'a pas vieilli : lire les journaux, compter les échecs par adresse, et quand une adresse échoue trop souvent, ajouter contre elle une règle de pare-feu pour un temps. Il ne connaît rien aux attaques ; il ne connaît que des motifs dans les lignes de journal, ce qui explique qu'un motif qui ne correspond pas à votre format de journal le laisse aveugle sans bruit.
1. Un filtre pour les journaux du proxy
Pour Nginx Proxy Manager, un filtre qui attrape les erreurs et les requêtes refusées :
# filter.d/npm-docker.conf
[Definition]
failregex = ^.* \[error\] \d+#\d+: \*\d+ .*client: <HOST>,.*$
^<HOST> .* "(GET|POST|HEAD).*" (401|403|404|429) .*$
Testez-le sur un vrai journal avant de lui faire confiance : fail2ban-regex /chemin/vers/proxy-host-1_access.log filter.d/npm-docker.conf montre combien de lignes il attraperait.
2. Une prison, dans la bonne chaîne
# jail.d/npm.conf
[npm-docker]
enabled = true
filter = npm-docker
logpath = /var/log/npm/proxy-host-*_access.log
/var/log/npm/proxy-host-*_error.log
maxretry = 5
findtime = 300
bantime = 3600
chain = DOCKER-USER
action = iptables-multiport[name=npm, port="80,443", protocol=tcp, chain="DOCKER-USER"]
Cinq erreurs en cinq minutes, une heure de bannissement.
Le piège Docker
Par défaut, fail2ban écrit ses bannissements dans la chaîne INPUT du pare-feu. Le trafic vers un port publié par Docker est relayé vers le conteneur et ne traverse jamais INPUT : le bannissement existe, les compteurs montent, et l'attaquant continue. Docker fournit une chaîne pour vos propres règles sur ce chemin, DOCKER-USER : mettez-y le bannissement.
Vérifiez par où passe vraiment le trafic, pas seulement qu'une règle existe : les compteurs de paquets vous le disent.
sudo nft list ruleset | grep -A3 f2b # ou : sudo iptables -L DOCKER-USER -v -n
Puis bannissez une adresse que vous contrôlez, depuis votre téléphone en données mobiles, et vérifiez que le site cesse de lui répondre.
Pièges
Ne bannissez pas votre propre réseau. Ajoutez votre plage locale et votre réseau privé à ignoreip, sinon un script capricieux à la maison vous enferme dehors de vos propres services.
Un 404 seul n'est pas une attaque : un lien cassé sur votre site en produit aussi. Cinq en cinq minutes depuis la même adresse est un seuil raisonnable ; commencez par une semaine en mode « compter seulement » sur vos journaux, et regardez ce qui aurait été banni.
Sources
Utile ? Dites-nous ce qu'il faut mesurer ensuite.