fail2ban
Bannissement des adresses après des échecs répétés de connexion SSH.
Contexte
Le Raspberry Pi n'est pas exposé directement à Internet. Les accès extérieurs passent par le serveur principal :
| Accès | Chemin | Adresse vue par le Pi |
|---|---|---|
| SSH depuis l'extérieur | Sshwifty (derrière Authelia) sur le serveur principal | Celle du serveur principal |
| Jellyfin | SWAG sur le serveur principal | Celle du serveur principal ; Jellyfin journalise l'adresse réelle (proxy de confiance) |
| Sauvegardes Plakar | SFTP depuis le serveur principal | Celle du serveur principal |
La protection de Jellyfin contre la force brute repose sur SWAG, côté serveur principal (prison nginx-unauthorized sur les réponses 401).
SSH
Authentification par clé uniquement :
| Option | Valeur |
|---|---|
| PasswordAuthentication | no |
| KbdInteractiveAuthentication | no |
| PubkeyAuthentication | yes |
| PermitRootLogin | without-password (root par clé seulement) |
Configuration
| Fichier | Contenu |
|---|---|
| /etc/fail2ban/jail.d/defaults-debian.conf | Fourni par Debian : banaction = nftables, prison sshd avec backend = systemd |
| /etc/fail2ban/jail.local | Copie complète de jail.conf avec les réglages ci-dessous |
Ordre de lecture : jail.conf, jail.d/*.conf, puis jail.local. Le banaction = iptables-multiport de jail.local l'emporte donc sur le nftables de Debian. iptables passe par nftables en arrière-plan : les bannissements fonctionnent.
Réglages en vigueur :
| Réglage | Valeur |
|---|---|
| Prison active | sshd uniquement |
| Source | Journal systemd (_SYSTEMD_UNIT=ssh.service) |
| maxretry / findtime | 3 échecs en 10 minutes |
| bantime | 10 minutes |
| bantime.increment | Oui, multiplicateurs 1, 2, 4, 8, 16, 32, 64 à chaque récidive |
| ignoreip | Aucune adresse exclue |
| Action | iptables-multiport sur le port SSH |
Les échecs venant de Sshwifty ou de Plakar sont attribués à l'adresse du serveur principal : trois échecs en 10 minutes bannissent le serveur principal du port SSH du Pi, ce qui coupe aussi les sauvegardes pendant la durée du bannissement.
Commandes
sudo fail2ban-client set sshd unbanip <IP> # débannir
sudo fail2ban-client get sshd ignoreip # adresses exclues
sudo fail2ban-client get sshd actions # action appliquée
sudo fail2ban-client -t # tester la configuration
sudo journalctl -u fail2ban -n 50
Options non utilisées
| Réglage | Effet |
|---|---|
| ignoreip = 127.0.0.1/8 ::1 <IP_SERVEUR> | Ne jamais bannir le serveur principal |
| [recidive] avec enabled = true | Bannissement d'une semaine sur tous les ports après des bannissements répétés |
| jail.local réduit aux seules différences | Configuration lisible ; jail.conf reste la référence mise à jour par Debian |