Sécurisez vos services web avec BunkerWeb : reverse proxy et WAF open-source
Sommaire
I. Présentation
Un reverse proxy joue un rôle essentiel dans l’ouverture de vos services sur internet : placé entre les utilisateurs et vos applications, il gère la terminaison TLS et effectue le rôle de passerelle entre le réseau public et le réseau privé. Pourtant, des solutions courantes comme NGINX, HAProxy ou encore Traefik, bien qu’efficaces dans ces fonctions, restent vulnérables par défaut aux attaques. Un certificat TLS aura beau chiffrer les données transitant par le proxy, il ne bloquera en rien les menaces au niveau de la couche applicative.
C’est dans ce genre de situations que BunkerWeb répond à cette lacune en combinant reverse proxy et WAF (Web Application Firewall) dans un seul outil open-source. Développé par la société française Bunkerity, BunkerWeb intègre nativement des fonctionnalités importantes : filtrage ModSecurity avec les règles OWASP CRS, renforcement TLS, limitation de requêtes, analyse comportementale et bien d’autres ! Ici, nous découvrirons la version communautaire gratuite.
Dans cet article, nous allons déployer BunkerWeb via Docker Compose, de l’installation jusqu’à la publication d’un service. Cette approche pratique nous permettra de transformer notre passerelle web en une véritable forteresse open-source !

Cet article est le fruit d’une collaboration avec Tristan BRINGUIER. Nous tenons à le remercier pour sa participation active, incluant la fourniture de l’environnement technique et son support à la rédaction.
II. Prérequis
Pour déployer BunkerWeb, assurez-vous d’avoir les éléments suivants :
- Un serveur Linux (Debian, Ubuntu, etc.) avec un environnement Docker installé dessus
- Une adresse IP publique avec les ports 80/TCP, 443/TCP et 443/UDP redirigés vers BunkerWeb
- Minimum 6 Go de RAM, à dimensionner en fonction du nombre de services et de la charge
- Un nom de domaine
Si vous avez besoin d’aide pour installer Docker, n’hésitez pas à suivre ce tutoriel : Installation de Docker sur Debian
Dans notre cas, nous allons utiliser une machine sous Debian 12 avec 2 CPU et 8 Go de RAM.
III. Déploiement de BunkerWeb via Docker Compose
Nous allons utiliser Docker Compose pour le déploiement, car il centralise toute la configuration de l’application (services, réseaux, volumes) dans un unique fichier YAML. Cela apporte une lisibilité accrue par rapport à de multiples commandes Docker ainsi qu’une gestion des volumes et des réseaux grandement simplifiés.
A. Préparation de l’environnement
Commencez par créer un répertoire dédié pour notre projet BunkerWeb :
B. Création du fichier compose.yaml
Collez dans le fichier le fichier Docker Compose présenté ci-dessous. Prenez le temps de bien lire les commentaires intégrés pour comprendre la configuration.
N’oubliez pas de changer le mot de passe par un autre aléatoire ! Vous pouvez également le faire avec la commande suivante (qui génère un mot de passe aléatoire de 32 caractères et remplace le contenu de à votre place tout en nettoyant les commentaires superflus) :
Une fois ceci fait, nous devons créer une première fois le réseau docker . C’est ce réseau qui fera la jonction entre nos applications et BunkerWeb pour connecter simplement les deux parties.
C. Lancement du conteneur
Une fois le fichier créé et le réseau docker créé, nous pouvons démarrer la stack avec la commande suivante :
Nous pouvons constater le bon déploiement du docker compose avec la commande .

Une fois les images téléchargées et les conteneurs lancés, nous pouvons consulter les logs avec :
D. Premier démarrage via l’interface web d’administration
À cette étape de l’article, les enregistrements DNS et redirections de ports doivent être faits. C’est-à-dire que votre domaine ou sous-domaine doit bien pointer vers l’adresse IP publique de votre BunkerWeb.
Accédons à l’assistant de configuration via notre navigateur web à l’adresse suivante :
Dans un premier temps, nous renseignons les propriétés du compte administrateur. Ce compte sera l’identifiant permettant l’accès à l’interface web d’administration.

Ensuite, nous configurons les modalités d’accès à l’interface web d’administration. “Server name” correspond à l’adresse de l’interface d’administration. Il ne faut surtout pas modifier “UI Host” et “UI URL“, qui sont les URLs internes de BunkerWeb pour effectuer le reverse proxy.
Concernant le certificat TLS, il est possible d’utiliser un certificat SSL personnalisé, mais nous allons utiliser Let’s Encrypt qui distribue gratuitement et automatiquement des certificats SSL. Nous pouvons donc cocher “Auto Let’s Encrypt“.
Si jamais nous utilisons un domaine dont l’hébergeur de zone DNS est compatible CertBot, il est possible de faire des Wildcard Certificates en cochant la case puis passant le “Challenge Type” à “dns” puis en mentionnant les clés d’API nécessaires.
Beaucoup de fournisseurs sont disponibles, vous pouvez consulter si le vôtre l’est sur la documentation de BunkerWeb !
Dans le cas d’une génération avec la méthode “dns“, nous appliquons ceci :

Dans le cas d’une génération avec la méthode “http“, ceci devrait être appliqué :

Enfin, un récapitulatif sera affiché, résumant les informations essentielles saisies lors des étapes précédentes. Nous cliquons sur “Setup“. !

Une fois l’installation démarrée, BunkerWeb génèrera les configurations et les certificats SSL adéquats. Cela peut prendre jusqu’à 5 minutes.
Lorsque l’installation est terminée, nous serons redirigés sur l’interface web.
IV. Configuration et prise en main de BunkerWeb
Nous voici dans l’interface de BunkerWeb après une reconnexion. Bravo ! Prenons le temps de la découvrir.

Sur la page d’accueil, nous retrouverons quelques statistiques essentielles liées à notre instance. Dans la barre latérale, à gauche, se trouvent les menus suivants :
- Home : Page d’accueil
- Instances : Uniquement utile pour un cluster, c’est dans cette rubrique que sont renseignées les différentes instances composant le cluster
- Global Config : Gérer la configuration générale et commune à tous les services
- Services : Gérer la configuration de chaque VirtualHost / Service
- Configs : Gérer les configurations NGINX avancées
- Plugins : Gérer les modules supplémentaires
- Cache : Gérer les fichiers mis en cache
- Reports : Consulter les alertes et blocages
- Bans : Consulter les bannissements
- Jobs : Gérer les tâches planifiées
- Logs : Consulter les fichiers de journalisation
Les catégories principales que nous utilisons régulièrement sont : Global Config, Services et Bans / Report.
Nous allons maintenant passer en revue quelques paramètres pratiques et vers lesquels nous souhaitons attirer votre attention. Pour ce faire, rendez-vous dans la rubrique “Global Config”.

Nous vous conseillons d’activer les options suivantes :
Général
- : false – désactive la fonctionnalité Stream de NGINX (permettant de forward les ports).
- : false
- : false
Brotli
- : true – active la compression Brotli pour des transferts encore plus légers (vous pouvez ensuite affiner le niveau et les types MIME).
Cache client
- : true – autorise le cache côté navigateur, soulageant ainsi votre serveur.
Gzip
- : true – active la compression Gzip, largement reconnue ; ajustez ensuite les paramètres selon vos besoins.
Let’s Encrypt
- : true – préremplit les champs Let’s Encrypt lors de la création d’un service.
- : [email protected]
Vous pouvez remplir les autres options, comme le type de challenge, et vos credentials, pour automatiser les certificats sur l’ensemble des services avec le même type de challenge.
ModSecurity
- : true – à envisager et privilégier seulement si votre machine dispose d’une capacité inférieure à 12 Go de RAM et que vous avez plusieurs services.
Miscellaneous
- : true – Vous permet d’automatiquement refuser les connexions pour des services qui n’existe pas, et les connexions sur l’adresse IP en brut.
- : true – Bloque la possibilité de CNAME vers vos domaines. À utiliser avec précaution.
Reverse Proxy
- : false – permet d’afficher l’erreur native du service (utile, par exemple, avec Guacamole).
SSL
- : true – force la redirection vers HTTPS.
Real IP (Configuration pour utilisation avec proxy Cloudflare)
- : true – active la récupération des vraies adresses IPs.
- : valeur par défaut – Vous pouvez laisser les valeurs par défaut.
- : cloudflare.com/ips-v4/ – Ces URLs permettront à votre BunkerWeb de récupérer les vraies adresses IPs des clients derrière votre proxy Cloudflare.
- : CF-Connecting-IP – Définis la valeur du Header qui remonte l’IP client.
Note : ces valeurs n’auront aucune incidence sur les services qui ne passeront pas dans le proxy Cloudflare.
Passons à présent au déploiement d’un service.
V. Configuration d’un hôte proxy (service)
Dans cette partie, nous allons déployer un service web interne en le plaçant derrière BunkerWeb. Pour cela, nous prendrons l’exemple d’IT-Tools, une boîte à outils web open source à destination des administrateurs système. L’application sera publiée à l’adresse suivante : .
A. Déploiement du conteneur IT-Tools
Nous allons déployer le service IT-Tools dans un conteneur Docker dédié.
Voici un exemple de configuration minimaliste à intégrer dans notre fichier :
Quelques explications pour vous aider à interpréter ce fichier :
- : nom du service, ici pour déployer l’application IT-Tools.
- : indique l’image Docker à utiliser. Ici , une image disponible sur le Docker Hub.
- : associe le conteneur à un réseau Docker (), ce qui permet la communication entre conteneurs sur ce réseau.
- : ouvre le port 80 à l’intérieur du conteneur. La directive ne publie pas le port sur l’hôte comme , mais le rend accessible aux autres conteneurs sur le même réseau.
- : Donne un nom explicite au conteneur pour le retrouver plus facilement (, logs, etc.).
B. Configuration du service sur Bunkerweb
Ouvrez la section Services puis cliquez sur Create new service. Suivez ensuite les étapes décrites ci-après. Nous allons procéder section par section pour effectuer l’ensemble de la configuration.
Web service – Front service
- “SERVER_NAME” : nom(s) de domaine à protéger. Dans notre cas :
- “Let’s Encrypt” : si n’est pas à true, renseignez les champs manuellement.
- “Template” : choisissez un profil de sécurité (low, medium, high) adapté à la criticité de l’application.
- “Security mode” : Si vous avez de trop nombreux blocages, mettez-vous en “detect“, pour pouvoir déclencher les règles, sans blocage, vous serez en capacité de voir les logs, sans que les blocages soient effectifs.
Pour configurer Let’s Encrypt, dans le cas où vous ne l’avez pas fait dans la config globale. Petit rappel pour les différents fournisseurs DNS, vous pouvez consulter la documentation de BunkerWeb !
Dans le cas d’une génération avec la méthode “dns“, cela donne :

Dans le cas d’une génération avec la méthode “http“, cela donne :
Attention, il faut bien d’abord pointer votre nom de domaine vers l’IP de votre BunkerWeb, et ne pas cocher “Wildcard Certificate“, ce n’est pas compatible avec la génération via HTTP.

Web service – Upstream server
- “REVERSE_PROXY_HOST” : URL interne du service (incluant le schéma ou ).
Dans notre cas, ce sera , car nous avons nommé le container , et le port exposé est le 80.
- “REVERSE_PROXY_WS” : activez-le pour la prise en charge des WebSockets (indispensable pour le bon fonctionnement de certaines applications) !

HTTP – General
Vous pouvez laisser les valeurs par défaut, sauf si besoin spécifique.

HTTP – Headers
Activez “USE_CORS” pour contrôler le partage de ressources entre sites (pratique pour limiter le vol de cookies).

Conseil : les valeurs par défaut conviennent à la plupart des cas.
Security – Bad behavior
Le module “Bad behavior” bannit les clients générant trop d’erreurs (401, 402, 403, 429, etc…). Par exemple, si un client génère beaucoup d’erreurs 404 (page introuvable), c’est suspect.

Note : les valeurs par défaut sont généralement suffisantes.
Security – Blacklisting
Activez “USE_BLACKLIST” pour bloquer immédiatement les IP ou user-agents référencés dans les listes internes ou personnelles. Par défaut, la configuration protège déjà contre les robots les plus agressifs.
Activez “USE_DNSBL” pour bloquer les IPs connues pour être agressives. DNSBL est une autre liste d’adresses IPs.
Vous pouvez laisser activer les deux listes communautaires “Community Blacklist” par défaut et activez la 3ème si vous le souhaitez. Ce sont des listes publiques qui ne sont pas alimentées directement par BunkerWeb.

Security – Limiting
Ajustez les quotas uniquement si un service légitime se voit bloqué.
- “USE_LIMIT_CONN” : limite le nombre de connexions simultanées.
- “USE_LIMIT_REQ” : limite le nombre de requêtes par seconde d’un client. Au-délà de la limite indiquée, le client recevra une erreur .

Security – Antibot
Si jamais vous avez besoin de rajouter un captcha, choisissez JavaScript tant que possible pour préserver l’ergonomie. Si besoin de plus de sécurité, vous pouvez activer un captcha sur les pages les plus sensibles.
- “USE_ANTIBOT” : active la protection contre les bots
- “ANTIBOT_MODE” : (résolution manuelle) ou (tests invisibles).
- “ANTIBOT_PROVIDER” : reCAPTCHA, hCaptcha, Turnstile, etc. (clé site et secret requis, en fonction du service sélectionné).

Security – Auth basic
Vous pouvez placer une authentification basique HTTP, avec un login et un mot de passe.

Security – Country
- “BLACKLIST_COUNTRY” : bloque la liste de pays indiqués (, par exemple.)
- “WHITELIST_COUNTRY” : autorise uniquement les pays listés (, etc.).
Vous pouvez consulter cette page pour voir la liste des pays sous le format de la norme ISO-3166.
Toute requête provenant d’un pays exclu reçoit un 403 Forbidden (accès refusé).
Si vous souhaitez configurer cette option, je vous conseille de le faire dans “Global Config”, afin que ce soit actif sur TOUS vos services par défaut.

Security – ModSecurity
ModSecurity analyse chaque requête / réponse à l’aide du Core Rule Set (OWASP). Conservez les réglages par défaut, puis excluez au besoin des règles via la rubrique “Custom configuration”. Pour aller plus loin, voici la documentation de Bunkerweb, qui en explique le fonctionnement.

Finaliser le déploiement
Cliquez sur Save : BunkerWeb lance immédiatement le déploiement en arrière-plan (patientez environ 1 min).
Votre service est maintenant protégé et accessible à l’extérieur !
C. Tester le déploiement
Nous pouvons nous rendre sur pour tester : Jackpot, le service est fonctionnel ! D’une part, l’application est publiée grâce à la fonction de reverse proxy, et d’autre part, elle est protégée par BunkerWeb.

VI. Conclusion
Suite à la lecture de ce tutoriel, vous devriez être en mesure d’installer BunkerWeb sur votre serveur et d’effectuer la configuration de base pour sécuriser vos applications web. L’application est conçue pour être facile à prendre en main et à configurer, tout en offrant des options avancées pour renforcer la sécurité de vos services web.