Hello @rodinux !
Je suis tombé dans un « rabbit hole », tu sais quand tu cherches pendant des heures une solution à problème tout simple et que tu commence à faire de l’engineering poussé pour rien ? Quand tu m’as dit que tu t’étais fait ban en voulant créer un mail, je n’ai pas trop cherché sur le moment, puis je me suis posé la question : « il n’a pas tenté de se loguer, mais plutôt de créer une boîte mail ? » et j’ai fini par trouver.
Mon piège « pot de miel », il consiste à servir un webhost vide, tous ceux qui passent par là déclenchent une écriture dans les fichiers log (access.log), chaque service possède le sien (peertube-access.log, mastodon-access.log, mail-access.log…). Sauf que, petit malin que je suis, j’ai oublié (à moitié) d’ajouter le paramétrage du log pour le service mail, je l’ai fait pour la consultation sur le port 443 mais pas pour le port 80, bien que normalement la redirection https se fait rapidement. Quand nginx détectait une visite sur mail.mesnumeriques.fr, n’ayant pas d’instruction pour écrire dans un fichier journal spécifique, il écrivait dans le journal par défaut et global (qui ne l’est plus puisque chaque service possède le sien).
Question : Pourquoi ça a fonctionné pour une trentaine d’utilisateurs ?
Je soupçonne que les utilisateurs précédents sont passés car ils ont cliqué directement sur le lien HTTPS, ils ont donc atteint directement le port 443 sans jamais transiter par le port 80, ouais c’est nul.
J’en ai profité pour aligner les A+ sur Cryptcheck (SMTP et HTTPS), ça me faisait de la peine de voir des « E » 
Voici comment mon « pot de miel » nginx fonctionne : un vhost par défaut tourne mais ne propose aucun contenu.
Côté log, et ça c’est juste là au moment où je t’écris :
185.242.226.100 - - [02/May/2026:11:10:27 +0200] « GET / HTTP/1.1 » 444 0 « - » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 »
20.163.34.74 - - [02/May/2026:11:15:58 +0200] « GET /hudson HTTP/1.1 » 444 0 « - » « Mozilla/5.0 zgrab/0.x »
79.124.40.174 - - [02/May/2026:11:22:30 +0200] « GET /actuator/gateway/routes HTTP/1.1 » 444 0 « - » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 »
45.142.193.142 - - [02/May/2026:11:32:43 +0200] « GET /api/sonicos/is-sslvpn-enabled HTTP/1.1 » 444 0 « - » « Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 »
5.61.209.107 - - [02/May/2026:11:35:04 +0200] « GET /SDK/webLanguage HTTP/1.1 » 444 0 « - » « Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.46 »
79.124.40.174 - - [02/May/2026:11:59:10 +0200] « \x16\x03\x01\x05\xA8\x01\x00\x05\xA4\x03\x03W\xB1v\xD0\x12j\xB0\x99P&s\x05bA\xC4B\x1F\x0B\x8B\xF3\xA9*\xD5z|xf{\xAA-\x99/ \xC2p\xCDd0\xFD’\xCB\x82\xAC\x84\xD4\xD4\xCC@d\x97\x04\xAF\xF8\xE1i!\xCD53\x8E\x17\xF4\xB8^\x90\x00\x1A\xC0+\xC0/\xC0,\xC00\xCC\xA9\xCC\xA8\xC0\x09\xC0\x13\xC0 » 400 157 « - » « - »
78.128.112.74 - - [02/May/2026:12:00:00 +0200] « SSH-2.0-Go » 400 157 « - » « - »
Bulgarie, Roumanie, Chine… seulement là pendant que je te parle, note que parfois nginx répond « 444 » en gros il ne prend même pas la peine de répondre, c’est efficace.
Côté fail2ban j’ai créé une petite règle toute bête qui dit « si tu vois passer quelque chose ici tu tire ! »
[sniper]
enabled = false (normalement c’est sur true)
filter = sniper
logpath = /E/log/access.log
maxretry = 1
bantime = 1 m
action = mikrotik[name=Nginx]
Pour le filtre, j’ai fait au plus simple :
[Definition]
failregex = ^ .+$
ignoreregex =
L’action se fait via un script qui est appelé par fail2ban :
[Definition]
actionban = /usr/local/bin/f2b-mikrotik.sh
[Init]
Ma fierté, ça reste ce script parce que c’est nouveau pour moi et que je continue à découvrir ce que je peux faire avec mon routeur Mikrotik :
#!/bin/bash
IP=$1
NAME=$2
COUNTRY=$(geoiplookup « $IP » | cut -d’,’ -f1 | awk ‹ {print $NF} › | tr -dc ‹ [:alnum:] ›) ← je me suis bien amusé à comprendre comment extraire des données et les réduire à ce que l’on veut garder
if [ -z « $COUNTRY » ]; then COUNTRY=« XX »; fi
if [[ « $IP » == « : » ]]; then
BLOCK=$(echo « $IP » | cut -d’:’ -f1-4) ← savoir quand c’est de l’ipv6 et ne bloquer qu’un masque c’était pas facile
[[ « $BLOCK » == *« : » ]] && BLOCK=« ${BLOCK%?} » ← c’est un peu brouillon mais comme les ipv6 n’ont jamais la même taille j’ai dû bricoler un truc pour enlever les derniers « : »
ssh -i /root/.ssh/id_rsa prout@l'ip de mon routeur \ <-- connection ssh à mon routeur
"/ipv6 firewall address-list add list=F2B address=$BLOCK::/64 timeout=7d comment=\"F2B-$NAME ($COUNTRY)\"" <-- ajout à la liste du firewall avec le préfixe du pays et pour une durée de 7 jours avec un masque de /64 (ça fait beaucoup mais ban des réseaux comme CENSYS ça fait du bien)
else
BLOCK_V4=$(echo « $IP » | cut -d’.’ -f1-3) ← même chose avec l’ipv4 ah oui on coupe l’ip de sorte de ne garder que xx.xx.xx
ssh -i /root/.ssh/id_rsa prout@routeur
« /ip firewall address-list add list=F2B address=$BLOCK_V4.0/24 timeout=7d comment="F2B-$NAME ($COUNTRY)" » comme pour l’ipv6 on prend xx.xx.xx.0/24 ban 7 jours
fi
Et pour ne pas fûmer le routeur on ne crée pas de règle de firewall dans filter mais plutôt dans raw comme je l’avais expliqué dans la présentation :
Note le nombre d’ipv4/24 bannies en bas à gauche de l’image (~22000 sont des attaques sur mon serveur DNS et celles-ci sont ban à vie parce qu’elles reviennent systématiquement)
Le réglage du firewall est un pur plaisir et d’une simplicité extrême, il y a 2 règles en réalité identiques, une cible la liste Fail2ban envoyée par mon serveur, et une liste CIDR « terres brûlées » ou j’ajoute moi manuellement les réseaux qui m’empoisonnent comme ceux où se trouvent les bots de Facebook, CENSYS, ONYPHE, certains VPN…
Bon ça devait être un petit message, mais je me suis encore laissé emporté par mon enthousiasme
et je sais que je vais me faire fusiller, qu’on va critiquer mes méthodes agressives.
J’essaie de temps en temps de faire des vidéos de sensibilisation pour mettre en garde ceux qui débutent dans l’auto-hébergement, là je n’ai montré que le « bruit » d’internet, on va dire que c’est normal, le but est de faire comprendre qu’héberger ses données soi-même c’est beaucoup de responsabilité et bien plus encore quand on hébergé du plublic.
J’espère que d’autres chatons m’aideront à améliorer mon univers.
Merci de m’avoir lu jusqu’au bout 
Bon week-end à tous !