Pare-feu et fail2ban sur k3

Document généré automatiquement depuis /home/jerome/pub/docs/06-pare-feu-et-fail2ban.md sur kimsufi3, le 11 September 2026 à 14:03. Toute modification faite ici sera écrasée à la prochaine régénération : éditer le fichier source.

Posé le 10 septembre 2026 par scripts/durcir-reseau.sh, aligné sur k4.

Configuration

UFW — entrant refusé par défaut, sortant autorisé :

Port Action Motif
22103/tcp depuis k4 ALLOW réplication et administration, sans limitation
22103/tcp ailleurs LIMIT 6 tentatives par 30 s et par adresse
80/tcp ALLOW Traefik, qui tourne en permanence pour noteback
443/tcp ALLOW idem

fail2ban — jail sshd, paramètres identiques à k4 :

  • 3 tentatives en 60 minutes
  • bannissement permanent (bantime = -1)
  • backend systemd
  • ignoreip : k4 (37.187.74.187) et k3 (37.59.39.138), pour qu’un incident de réplication ne bannisse jamais le pair

Ce qui a été vérifié, et non supposé

Contrôle Résultat
Les échecs SSH sont-ils journalisés là où la jail regarde ? oui, sous _SYSTEMD_UNIT=ssh.service, malgré la socket activation
Le bannissement pose-t-il une vraie règle ? oui, dans nftables — Ubuntu 26.04 n’utilise plus iptables
ignoreip protège-t-il le pair ? oui en détection automatique : l’échec provoqué depuis k4 n’a pas été compté
ignoreip bloque-t-il un banip manuel ? non. Comportement normal de fail2ban : la liste blanche ne vaut que pour la détection

Deux pièges traités

ufw limit bloque la réplication — constaté, pas supposé

Première version de la configuration : limit sur 22103 pour tout le monde. Résultat immédiat le 10/09/2026 : au bout de six commandes lancées depuis k4, la connexion est refusée. L’ordre de redémarrage n’est jamais parti, et uptime a révélé que la machine n’avait pas bougé.

Le problème n’est pas l’administration mais la réplication : une passe ouvre plusieurs connexions SSH — rôle du pair, horodatage, puis un rsync par arborescence. Elle aurait été bloquée en silence.

La correction est une règle ALLOW pour les adresses du parc, posée avant le limit général : UFW évalue ses règles dans l’ordre, et une règle spécifique placée après un limit ne serait jamais atteinte.

Activer UFW à distance peut couper l’accès

Le script autorise le port SSH avant toute activation, et pose un filet : un ufw disable temporisé à 5 minutes, désarmé seulement une fois vérifié que SSH répond encore. Sur une machine distante, c’est la précaution qui évite le recours au mode rescue.

UFW ne filtre pas les ports publiés par Docker

Docker insère ses règles dans nat/PREROUTING, en amont du filtrage d’UFW : un conteneur qui publie un port est joignable même si UFW le refuse. Ce n’est pas une erreur de configuration, c’est le fonctionnement de Docker.

La démonstration est sur k4, où UFW est actif et où les ports 80, 443, 25, 465, 587, 110, 143, 995, 4190 et 22310 sont pourtant tous exposés.

UFW protège donc les services de l’hôte, pas les conteneurs. Quand k3 deviendra actif, mailcow ouvrira ses ports sans qu’UFW n’y puisse rien — c’est son conteneur netfilter qui assure ce blocage, et il fait très bien ce travail. Filtrer les conteneurs demanderait des règles dans la chaîne DOCKER-USER, ce qui sort du cadre de ce projet.

L’appairage doit commencer par les listes blanches

Constaté le 10/09/2026, aux dépens de la mise en service. Le mécanisme de rôle installé sur k3 avant que sa clé ne soit autorisée sur k4 : role.sh a tenté trois connexions, et k4 a banni k3 définitivement.

11:33:27  [sshd] Found 37.59.39.138
11:38:53  [sshd] Found 37.59.39.138
11:39:11  [sshd] Found 37.59.39.138
11:39:11  [sshd] Ban 37.59.39.138

L’action nftables-fwd de la jail zzz-forward-ban bannit sur toutes les chaînes : le port 443 de k4, ouvert au monde entier, devenait injoignable depuis k3. Symptôme trompeur — un « Connection refused » sur tous les ports ressemble à une panne réseau, pas à un bannissement.

Deux causes de bannissement du pair, indépendantes :

  1. La réplication ouvre plusieurs connexions SSH par passe — rôle du pair, horodatage, puis un rsync par arborescence. Un incident quelconque (clé pas encore posée, pair en cours de redémarrage) suffit à atteindre les 3 échecs. Avec bantime = -1, c’est irrévocable sans intervention.
  2. La sonde externe sonde-chabod.sh, qui tourne sur k3 toutes les 15 minutes, déclenche traefik-4xx-flood sur k4 — traces à 08:45 et 09:00 ce matin-là, avant même ce projet.

Règle à appliquer

Poser les listes blanches des DEUX côtés avant la première tentative de connexion. Pas après, pas « on verra » : avec un bannissement permanent, la première erreur est définitive.

Sur k4, un fragment unique zzz-pair-dockersync.conf remplace les cinq déclarations ignoreip concurrentes qui s’y trouvaient — c’est la dernière lue qui gagnait, ce qui rendait l’ensemble illisible.

Portée réelle de fail2ban ici

PasswordAuthentication no étant posé, aucune attaque par mot de passe n’est possible sur k3 : fail2ban n’y ajoute donc pas de protection contre l’intrusion. Son intérêt est ailleurs, et reste réel — il coupe court aux scans répétés, allège le journal, et évite qu’une adresse hostile occupe des connexions. C’est un réducteur de bruit plus qu’un rempart, et il vaut mieux le savoir que de s’en croire protégé.

Commandes utiles

sudo bash /root/dockersync/durcir-reseau.sh --etat   # état complet
sudo fail2ban-client status sshd                     # jail
sudo fail2ban-client set sshd unbanip <IP>           # débannir
sudo ufw status verbose                              # règles

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *