{"id":11,"date":"2026-09-11T14:03:30","date_gmt":"2026-09-11T14:03:30","guid":{"rendered":"https:\/\/noteback.chabod.eu\/?p=11"},"modified":"2026-09-11T14:03:30","modified_gmt":"2026-09-11T14:03:30","slug":"doc-06-pare-feu-et-fail2ban","status":"publish","type":"post","link":"https:\/\/noteback.chabod.eu\/?p=11","title":{"rendered":"Pare-feu et fail2ban sur k3"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Document g\u00e9n\u00e9r\u00e9 automatiquement depuis <code>\/home\/jerome\/pub\/docs\/06-pare-feu-et-fail2ban.md<\/code> sur kimsufi3, le 11 September 2026 \u00e0 14:03. Toute modification faite ici sera \u00e9cras\u00e9e \u00e0 la prochaine r\u00e9g\u00e9n\u00e9ration : \u00e9diter le fichier source.<\/em><\/p>\n\n\n<p>Pos\u00e9 le 10 septembre 2026 par <code>scripts\/durcir-reseau.sh<\/code>, align\u00e9 sur k4.<\/p>\n<h2 id=\"configuration\">Configuration<\/h2>\n<p><strong>UFW<\/strong> \u2014 entrant refus\u00e9 par d\u00e9faut, sortant autoris\u00e9 :<\/p>\n<table>\n<thead>\n<tr>\n<th>Port<\/th>\n<th>Action<\/th>\n<th>Motif<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>22103\/tcp depuis k4<\/td>\n<td><strong>ALLOW<\/strong><\/td>\n<td>r\u00e9plication et administration, <strong>sans limitation<\/strong><\/td>\n<\/tr>\n<tr>\n<td>22103\/tcp ailleurs<\/td>\n<td><strong>LIMIT<\/strong><\/td>\n<td>6 tentatives par 30 s et par adresse<\/td>\n<\/tr>\n<tr>\n<td>80\/tcp<\/td>\n<td>ALLOW<\/td>\n<td>Traefik, qui tourne en permanence pour <code>noteback<\/code><\/td>\n<\/tr>\n<tr>\n<td>443\/tcp<\/td>\n<td>ALLOW<\/td>\n<td>idem<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>fail2ban<\/strong> \u2014 jail <code>sshd<\/code>, param\u00e8tres identiques \u00e0 k4 :<\/p>\n<ul>\n<li>3 tentatives en 60 minutes<\/li>\n<li><strong>bannissement permanent<\/strong> (<code>bantime = -1<\/code>)<\/li>\n<li>backend <code>systemd<\/code><\/li>\n<li><code>ignoreip<\/code> : k4 (37.187.74.187) et k3 (37.59.39.138), pour qu&#8217;un incident de r\u00e9plication ne bannisse jamais le pair<\/li>\n<\/ul>\n<h2 id=\"ce-qui-a-\u00e9t\u00e9-v\u00e9rifi\u00e9-et-non-suppos\u00e9\">Ce qui a \u00e9t\u00e9 v\u00e9rifi\u00e9, et non suppos\u00e9<\/h2>\n<table>\n<thead>\n<tr>\n<th>Contr\u00f4le<\/th>\n<th>R\u00e9sultat<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Les \u00e9checs SSH sont-ils journalis\u00e9s l\u00e0 o\u00f9 la jail regarde ?<\/td>\n<td><strong>oui<\/strong>, sous <code>_SYSTEMD_UNIT=ssh.service<\/code>, malgr\u00e9 la socket activation<\/td>\n<\/tr>\n<tr>\n<td>Le bannissement pose-t-il une vraie r\u00e8gle ?<\/td>\n<td><strong>oui<\/strong>, dans <strong>nftables<\/strong> \u2014 Ubuntu 26.04 n&#8217;utilise plus iptables<\/td>\n<\/tr>\n<tr>\n<td><code>ignoreip<\/code> prot\u00e8ge-t-il le pair ?<\/td>\n<td><strong>oui<\/strong> en d\u00e9tection automatique : l&#8217;\u00e9chec provoqu\u00e9 depuis k4 n&#8217;a pas \u00e9t\u00e9 compt\u00e9<\/td>\n<\/tr>\n<tr>\n<td><code>ignoreip<\/code> bloque-t-il un <code>banip<\/code> manuel ?<\/td>\n<td><strong>non<\/strong>. Comportement normal de fail2ban : la liste blanche ne vaut que pour la d\u00e9tection<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"deux-pi\u00e8ges-trait\u00e9s\">Deux pi\u00e8ges trait\u00e9s<\/h2>\n<h3 id=\"ufw-limit-bloque-la-r\u00e9plication--constat\u00e9-pas-suppos\u00e9\"><code>ufw limit<\/code> bloque la r\u00e9plication \u2014 constat\u00e9, pas suppos\u00e9<\/h3>\n<p>Premi\u00e8re version de la configuration : <code>limit<\/code> sur 22103 pour tout le monde. R\u00e9sultat imm\u00e9diat le 10\/09\/2026 : au bout de six commandes lanc\u00e9es depuis k4, la connexion est refus\u00e9e. L&#8217;ordre de red\u00e9marrage n&#8217;est jamais parti, et <code>uptime<\/code> a r\u00e9v\u00e9l\u00e9 que la machine n&#8217;avait pas boug\u00e9.<\/p>\n<p>Le probl\u00e8me n&#8217;est pas l&#8217;administration mais <strong>la r\u00e9plication<\/strong> : une passe ouvre plusieurs connexions SSH \u2014 r\u00f4le du pair, horodatage, puis un <code>rsync<\/code> par arborescence. Elle aurait \u00e9t\u00e9 bloqu\u00e9e en silence.<\/p>\n<p>La correction est une r\u00e8gle <code>ALLOW<\/code> pour les adresses du parc, <strong>pos\u00e9e avant<\/strong> le <code>limit<\/code> g\u00e9n\u00e9ral : UFW \u00e9value ses r\u00e8gles dans l&#8217;ordre, et une r\u00e8gle sp\u00e9cifique plac\u00e9e apr\u00e8s un <code>limit<\/code> ne serait jamais atteinte.<\/p>\n<h3 id=\"activer-ufw-\u00e0-distance-peut-couper-lacc\u00e8s\">Activer UFW \u00e0 distance peut couper l&#8217;acc\u00e8s<\/h3>\n<p>Le script autorise le port SSH <strong>avant<\/strong> toute activation, et pose un filet : un <code>ufw disable<\/code> temporis\u00e9 \u00e0 5 minutes, d\u00e9sarm\u00e9 seulement une fois v\u00e9rifi\u00e9 que SSH r\u00e9pond encore. Sur une machine distante, c&#8217;est la pr\u00e9caution qui \u00e9vite le recours au mode rescue.<\/p>\n<h3 id=\"ufw-ne-filtre-pas-les-ports-publi\u00e9s-par-docker\">UFW ne filtre pas les ports publi\u00e9s par Docker<\/h3>\n<p>Docker ins\u00e8re ses r\u00e8gles dans <code>nat\/PREROUTING<\/code>, <strong>en amont<\/strong> du filtrage d&#8217;UFW : un conteneur qui publie un port est joignable m\u00eame si UFW le refuse. Ce n&#8217;est pas une erreur de configuration, c&#8217;est le fonctionnement de Docker.<\/p>\n<p>La d\u00e9monstration est sur k4, o\u00f9 UFW est actif et o\u00f9 les ports 80, 443, 25, 465, 587, 110, 143, 995, 4190 et 22310 sont pourtant tous expos\u00e9s.<\/p>\n<p><strong>UFW prot\u00e8ge donc les services de l&#8217;h\u00f4te, pas les conteneurs.<\/strong> Quand k3 deviendra actif, mailcow ouvrira ses ports sans qu&#8217;UFW n&#8217;y puisse rien \u2014 c&#8217;est son conteneur <code>netfilter<\/code> qui assure ce blocage, et il fait tr\u00e8s bien ce travail. Filtrer les conteneurs demanderait des r\u00e8gles dans la cha\u00eene <code>DOCKER-USER<\/code>, ce qui sort du cadre de ce projet.<\/p>\n<h2 id=\"lappairage-doit-commencer-par-les-listes-blanches\">L&#8217;appairage doit commencer par les listes blanches<\/h2>\n<p><strong>Constat\u00e9 le 10\/09\/2026, aux d\u00e9pens de la mise en service.<\/strong> Le m\u00e9canisme de r\u00f4le install\u00e9 sur k3 avant que sa cl\u00e9 ne soit autoris\u00e9e sur k4 : <code>role.sh<\/code> a tent\u00e9 trois connexions, et k4 a banni k3 <strong>d\u00e9finitivement<\/strong>.<\/p>\n<pre><code>11:33:27  [sshd] Found 37.59.39.138\n11:38:53  [sshd] Found 37.59.39.138\n11:39:11  [sshd] Found 37.59.39.138\n11:39:11  [sshd] Ban 37.59.39.138<\/code><\/pre>\n<p>L&#8217;action <code>nftables-fwd<\/code> de la jail <code>zzz-forward-ban<\/code> bannit <strong>sur toutes les cha\u00eenes<\/strong> : le port 443 de k4, ouvert au monde entier, devenait injoignable depuis k3. Sympt\u00f4me trompeur \u2014 un \u00ab Connection refused \u00bb sur <em>tous<\/em> les ports ressemble \u00e0 une panne r\u00e9seau, pas \u00e0 un bannissement.<\/p>\n<p>Deux causes de bannissement du pair, ind\u00e9pendantes :<\/p>\n<ol type=\"1\">\n<li><strong>La r\u00e9plication<\/strong> ouvre plusieurs connexions SSH par passe \u2014 r\u00f4le du pair, horodatage, puis un <code>rsync<\/code> par arborescence. Un incident quelconque (cl\u00e9 pas encore pos\u00e9e, pair en cours de red\u00e9marrage) suffit \u00e0 atteindre les 3 \u00e9checs. Avec <code>bantime = -1<\/code>, c&#8217;est irr\u00e9vocable sans intervention.<\/li>\n<li><strong>La sonde externe<\/strong> <code>sonde-chabod.sh<\/code>, qui tourne sur k3 toutes les 15 minutes, d\u00e9clenche <code>traefik-4xx-flood<\/code> sur k4 \u2014 traces \u00e0 08:45 et 09:00 ce matin-l\u00e0, avant m\u00eame ce projet.<\/li>\n<\/ol>\n<h3 id=\"r\u00e8gle-\u00e0-appliquer\">R\u00e8gle \u00e0 appliquer<\/h3>\n<p><strong>Poser les listes blanches des DEUX c\u00f4t\u00e9s avant la premi\u00e8re tentative de connexion.<\/strong> Pas apr\u00e8s, pas \u00ab on verra \u00bb : avec un bannissement permanent, la premi\u00e8re erreur est d\u00e9finitive.<\/p>\n<p>Sur k4, un fragment unique <code>zzz-pair-dockersync.conf<\/code> remplace les cinq d\u00e9clarations <code>ignoreip<\/code> concurrentes qui s&#8217;y trouvaient \u2014 c&#8217;est la derni\u00e8re lue qui gagnait, ce qui rendait l&#8217;ensemble illisible.<\/p>\n<h2 id=\"port\u00e9e-r\u00e9elle-de-fail2ban-ici\">Port\u00e9e r\u00e9elle de fail2ban ici<\/h2>\n<p><code>PasswordAuthentication no<\/code> \u00e9tant pos\u00e9, <strong>aucune attaque par mot de passe n&#8217;est possible<\/strong> sur k3 : fail2ban n&#8217;y ajoute donc pas de protection contre l&#8217;intrusion. Son int\u00e9r\u00eat est ailleurs, et reste r\u00e9el \u2014 il coupe court aux scans r\u00e9p\u00e9t\u00e9s, all\u00e8ge le journal, et \u00e9vite qu&#8217;une adresse hostile occupe des connexions. C&#8217;est un r\u00e9ducteur de bruit plus qu&#8217;un rempart, et il vaut mieux le savoir que de s&#8217;en croire prot\u00e9g\u00e9.<\/p>\n<h2 id=\"commandes-utiles\">Commandes utiles<\/h2>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb2-1\"><a href=\"#cb2-1\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"fu\">sudo<\/span> bash \/root\/dockersync\/durcir-reseau.sh <span class=\"at\">--etat<\/span>   <span class=\"co\"># \u00e9tat complet<\/span><\/span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"fu\">sudo<\/span> fail2ban-client status sshd                     <span class=\"co\"># jail<\/span><\/span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"fu\">sudo<\/span> fail2ban-client set sshd unbanip <span class=\"op\">&lt;<\/span>IP<span class=\"op\">&gt;<\/span>           <span class=\"co\"># d\u00e9bannir<\/span><\/span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"fu\">sudo<\/span> ufw status verbose                              <span class=\"co\"># r\u00e8gles<\/span><\/span><\/code><\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Document g\u00e9n\u00e9r\u00e9 automatiquement depuis \/home\/jerome\/pub\/docs\/06-pare-feu-et-fail2ban.md sur kimsufi3, le 11 September 2026 \u00e0 14:03. Toute modification faite ici sera \u00e9cras\u00e9e \u00e0 la prochaine r\u00e9g\u00e9n\u00e9ration : \u00e9diter le fichier source. Pos\u00e9 le 10 septembre 2026 par scripts\/durcir-reseau.sh, align\u00e9 sur k4. Configuration UFW \u2014 entrant refus\u00e9 par d\u00e9faut, sortant autoris\u00e9 : Port Action Motif 22103\/tcp depuis k4 ALLOW [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-11","post","type-post","status-publish","format-standard","hentry","category-exploitation-dockersync"],"_links":{"self":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11"}],"version-history":[{"count":0,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/posts\/11\/revisions"}],"wp:attachment":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}