Skip to content
G. G. testé !
🌐rĂ©seau 🔒sĂ©curitĂ© 📖guide

SWAG, mon reverse proxy 🔒 Auto-Reload, Recaptcha, AccĂšs Int/Ext, GĂ©oblocage... (09/XX)

Quatre fonctionnalités SWAG : auto-reload natif depuis v3.1.0, reCAPTCHA CrowdSec finalisé, différenciation accÚs interne/externe, et géoblocage avec DB-IP.

2 min de lecture
SWAG, mon reverse proxy 🔒 Auto-Reload, Recaptcha, AccĂšs Int/Ext, GĂ©oblocage... (09/XX)
Regarder la vidĂ©o — timecodes, vidĂ©os liĂ©es 33min 34s

En bref

PrérequisSWAG installé (épisode précédent), CrowdSec configuré, AdGuard Home comme DNS/DHCP
RésultatSWAG qui se recharge automatiquement, captcha CrowdSec fonctionnel, rÚgles réseau internes/externes, géoblocage actif
RessourcesSecuring SWAG — virtualize.link

Cet épisode est le neuviÚme de la série sur mon reverse proxy SWAG. Quatre sujets abordés, par ordre de complexité croissante.

Rappel rapide : Ă  quoi sert un reverse proxy

Pour les gens qui ne connaissent pas encore : un reverse proxy, c’est un guichet d’entrĂ©e unique pour tous vos services auto-hĂ©bergĂ©s. PlutĂŽt que d’exposer chaque service individuellement sur internet — avec tout ce que ça implique en termes de sĂ©curisation individuelle — on centralise tout derriĂšre SWAG, qui gĂšre pour vous la sĂ©curisation des accĂšs.

SWAG s’occupe de :

  • La gestion des certificats HTTPS
  • L’authentification des utilisateurs (avec Authelia, SSO, multifacteur)
  • L’analyse comportementale avec CrowdSec pour dĂ©tecter et bannir les IP suspectes
  • La centralisation des logs

Chez moi, Homepage sert de page d’accueil qui liste tous mes services : Nextcloud pour les fichiers et photos, Jellyfin pour les vidĂ©os et musique, Duplicati pour les sauvegardes, LibreSpeed pour les tests de dĂ©bit, File Browser pour manipuler des fichiers, Vaultwarden pour les mots de passe. Plus la couche domotique avec Jeedom, Home Assistant, et AdGuard Home pour le DNS/DHCP.

Tout ça tourne sur une machine qui fait tourner Open MediaVault avec Docker par-dessus.

Point 1 — Auto-reload natif dans SWAG

C’est la nouveautĂ© la plus directement utile de cet Ă©pisode.

Depuis SWAG v3.1.0-ls356 (publiĂ©e mi-janvier 2025), l’auto-reload est intĂ©grĂ© directement dans l’image de base. Ce n’était pas le cas avant — il fallait utiliser un Docker mod sĂ©parĂ©, que j’avais d’ailleurs mentionnĂ© dans une vidĂ©o prĂ©cĂ©dente. Ce mod est maintenant dĂ©prĂ©ciĂ© (deprecation notice dans le README de l’image), remplacĂ© par la fonctionnalitĂ© native.

ConcrĂštement, l’auto-reload surveille tous les fichiers sous config/nginx/ (probablement via inotify en interne) et dĂ©clenche automatiquement un rechargement de la configuration nginx Ă  chaque modification. Plus besoin de faire docker compose restart swag aprĂšs avoir modifiĂ© un fichier .conf.

Pour l’activer, deux variables d’environnement à ajouter dans le docker-compose de SWAG :

environment:
  - SWAG_AUTORELOAD=true
  - SWAG_WATCH_LIST=  # optionnel, personnalisable

Par défaut SWAG_AUTORELOAD=false, donc si vous ne le mettez pas, rien ne change.

DĂ©monstration en direct : j’ai renommĂ© le fichier librespeed.subdomain.conf en .backup — SWAG a immĂ©diatement dĂ©tectĂ© le dĂ©placement et rechargĂ© sa configuration. En rafraĂźchissant la page LibreSpeed, le service Ă©tait dĂ©jĂ  inaccessible, remplacĂ© par la page 404 par dĂ©faut de mon reverse proxy. Pareil dans l’autre sens : modifier le fichier dĂ©clenche un rechargement visible dans les logs avec un modify suivi d’un rechargement.

Mise en garde importante : je conseille de dĂ©sactiver l’auto-reload en production une fois les services stables. En phase de mise en place ou d’expĂ©rimentation, c’est super pratique. Mais si on modifie un fichier par inadvertance et que ça dĂ©clenche un rechargement avec une configuration incorrecte, ça peut rendre des services momentanĂ©ment inaccessibles. Pire : si on dĂ©commente des lignes de protection Authelia par erreur, on peut se retrouver Ă  exposer des services non sĂ©curisĂ©s sur internet sans s’en rendre compte immĂ©diatement.

La bonne pratique en production : faire toutes ses modifications, les passer en revue avec VS Code pour vĂ©rifier l’ensemble des changements, puis faire un seul rechargement intentionnel.

Point 2 — reCAPTCHA CrowdSec enfin fonctionnel

La remediation par captcha Ă©tait une fonctionnalitĂ© que j’avais essayĂ© de configurer il y a longtemps, mais elle ne fonctionnait pas correctement Ă  cause de bugs de compatibilitĂ© entre les dĂ©pendances Lua de nginx (utilisĂ©es par SWAG) et le module CrowdSec. Deux bugs en particulier me posaient problĂšme :

  1. Une erreur critique au dĂ©marrage de SWAG, ouverte par Giovanni Papini — corrigĂ©e il y a peu
  2. Des warnings de dĂ©prĂ©ciation autour de la cryptographie dans les images nginx — moins critique mais embĂȘtant

Ces incompatibilités entre les dépendances Lua de SWAG et CrowdSec faisaient que le captcha était activable sur le papier mais inopérant en pratique. Les deux problÚmes sont maintenant résolus.

Comment ça fonctionne : CrowdSec peut prendre deux types de dĂ©cisions face Ă  une IP suspecte — le ban direct, ou le captcha. Le captcha prĂ©sente un challenge Google reCAPTCHA Ă  l’IP concernĂ©e : si c’est un humain, il rĂ©sout le challenge et passe ; si c’est un bot, il ne peut pas.

La configuration du captcha remediation se fait dans le fichier de profil CrowdSec. On ajoute une entrĂ©e captcha remediation avant l’entrĂ©e de ban standard, avec des conditions pour dĂ©cider quand l’appliquer. L’idĂ©e : si une IP a dĂ©clenchĂ© un scĂ©nario HTTP et que c’est sa premiĂšre alerte, on lui prĂ©sente d’abord un captcha pendant 4 heures. Si elle le rĂ©sout, elle est libĂ©rĂ©e. Sinon, elle reste bloquĂ©e, et les alertes suivantes peuvent dĂ©clencher un ban direct.

DĂ©monstration : j’ai ajoutĂ© manuellement une dĂ©cision captcha sur mon adresse IP locale via cscli decisions add --ip X.X.X.X --type captcha --duration 1h. En retournant sur ma page Homepage, tous les services sont passĂ©s au rouge, et j’avais bien un Google reCAPTCHA qui s’affichait. AprĂšs avoir cliquĂ© (Google a dĂ©tectĂ© une activitĂ© humaine, pas de challenge d’images Ă  rĂ©soudre), j’étais dĂ©banni. J’ai aussi reçu une notification par mail, puisque j’ai configurĂ© les notifications CrowdSec par email — utile pour ĂȘtre informĂ© des bannissements sans avoir Ă  surveiller activement.

Point 3 — DiffĂ©renciation accĂšs interne / externe

Cette configuration n’est pas dans les templates par dĂ©faut de SWAG. Je l’ai mise en place sur ma machine Ă  ma sauce, en m’inspirant d’un blog que je n’ai malheureusement pas retrouvĂ© pour le citer correctement.

Le principe : chaque fichier de configuration de service dans nginx/proxy-confs/ peut avoir deux blocs de rĂšgles d’accĂšs — un pour le rĂ©seau interne, un pour l’accĂšs externe depuis internet. Ça permet d’appliquer des rĂšgles de sĂ©curitĂ© diffĂ©rentes selon l’origine.

Le contexte rĂ©seau chez moi : ma Livebox est le routeur, mais AdGuard Home est le serveur DNS/DHCP. Dans AdGuard Home, j’ai des réécritures DNS : mes noms de domaine publics (monservice.mondomaine.fr) redirigent vers l’IP locale de mon serveur reverse proxy quand on est sur mon rĂ©seau local. RĂ©sultat : que je sois chez moi ou dehors, j’utilise les mĂȘmes URLs. Mais quand je suis chez moi, le trafic passe en local directement — pas besoin de sortir sur internet pour atteindre mes services.

Deux fichiers de configuration à créer dans le dossier nginx/ :

internal.conf — valide uniquement si la requĂȘte vient d’une IP du rĂ©seau local : il faut y dĂ©clarer la plage d’adresses autorisĂ©es (ex. 192.168.1.0/24) avec un allow, suivi d’un deny all pour tout le reste.

external.conf — valide pour les accĂšs depuis internet, avec gestion du gĂ©oblocage : il faut y tester la variable $geo_blacklist et retourner une 404 si elle vaut yes.

Dans chaque fichier .conf de service, j’ajoute ensuite un bloc selon que le service est exposĂ© en interne uniquement, en externe uniquement, ou dans les deux cas. Pour LibreSpeed par exemple, ça n’a aucun sens de l’exposer sur internet — je fais mes tests de dĂ©bit en interne. Je le configure donc en internal uniquement.

L’avantage de cette approche : tout est centralisĂ© dans le fichier de config du service, visible d’un seul coup d’Ɠil. Et si un jour je veux exposer un service qui n’était qu’interne, je change juste le bloc dans le fichier .conf correspondant — avec l’auto-reload, c’est actif immĂ©diatement.

Point 4 (bonus) — GĂ©oblocage avec DB-IP

Le docker mod DB-IP enrichit SWAG avec une base de donnĂ©es de gĂ©olocalisation des adresses IP. On peut ensuite configurer nginx pour rejeter automatiquement les requĂȘtes provenant de certains pays.

Activation dans le docker-compose : dans la variable DOCKER_MODS, on ajoute le module linuxserver/mods:swag-dbip à la suite des autres mods déjà présents (swag-dashboard, swag-crowdsec).

Configuration en deux étapes :

1. Dans nginx/nginx.conf, dans le bloc HTTP : on ajoute un include vers le fichier dbip.conf.

2. Dans dbip.conf (fourni par le docker mod), on liste les pays Ă  bloquer : le bloc geo associe la variable $geo_blacklist Ă  une valeur yes pour chaque code ISO 3166-1 des pays Ă  bloquer, et Ă  no pour les plages d’IP locales (qui ne sont jamais gĂ©olocalisables).

Pour les adresses IP locales (192.168.x.x), il n’y a pas de gĂ©olocalisation possible — elles sont toujours en no donc toujours autorisĂ©es. C’est la raison pour laquelle cette configuration s’articule avec le point 3 : en interne, on vĂ©rifie que c’est bien une IP locale ; en externe, on vĂ©rifie que le pays n’est pas bloquĂ©.

Dans mon cas, j’ai dĂ©jĂ  une liste de pays bloquĂ©s qui me paraissent ne pas avoir de raison lĂ©gitime d’accĂ©der Ă  mes services personnels. Je pense mĂȘme Ă  rajouter les États-Unis — je suis rĂ©guliĂšrement scannĂ© depuis des IPs amĂ©ricaines, et il n’y a aucune raison qu’un amĂ©ricain inconnu accĂšde Ă  mes donnĂ©es personnelles auto-hĂ©bergĂ©es.

En pratique, quel niveau activer ?

Pour synthĂ©tiser ce que j’ai en production :

  • Auto-reload : activĂ© uniquement quand j’ajoute ou modifie des services, dĂ©sactivĂ© le reste du temps
  • reCAPTCHA CrowdSec : activĂ© en permanence — c’est maintenant stable, autant l’avoir
  • Internal/External : activĂ© en permanence, sur tous les services
  • DB-IP : activĂ© en permanence avec une liste de pays bloquĂ©s

Ce sont des couches complĂ©mentaires. Chacune apporte quelque chose, et l’ensemble forme une protection assez solide pour un serveur personnel auto-hĂ©bergĂ©.

La sĂ©rie sur SWAG continuera — il y a encore des sujets Ă  couvrir pour complĂ©ter l’installation.

Signaler une erreur

Pour les questions techniques

Passe par les commentaires YouTube ou le Discord — ta question profite à tout le monde.

Ce formulaire est uniquement pour signaler une erreur dans le contenu.

Retour aux articles
Partager :

Suivre la chaĂźne

Une vidĂ©o chaque jeudi Ă  17h30 — abonnez-vous pour ne rien rater.