Le Gardien Numérique de Mon Homelab : Mise en place d'un proxy inverse sécurisé avec HTTPS
Objectifs
- Accéder à tous vos services web internes (Proxmox, n8n et bases de données) de manière sécurisée via des domaines HTTPS en utilisant un proxy inverse.
- Utiliser Let’s Encrypt pour des certificats SSL gratuits et automatisés.
Pourquoi utiliser un proxy inverse ?
Un proxy inverse agit comme une passerelle centralisée vers les services de votre homelab, offrant plusieurs avantages cruciaux :
- Gestion SSL unifiée : Point unique pour la gestion des certificats
- Couche de sécurité : Protection contre l'exposition directe des services
- Noms de domaine personnalisés : URLs propres au lieu de combinaisons IP:PORT
- Équilibrage de charge : Répartition du trafic sur plusieurs serveurs backend
Aperçu de l'architecture
Internet/LAN
↓
pfSense Firewall
↓
Nginx Proxy Manager (Proxy inverse)
↓
├── Proxmox (192.168.x.x:8006)
├── n8n (192.168.x.x:5678)
├── Databases (192.168.x.x:XXXX)
└── Other Services
Étape 1 : Déployer la VM/Conteneur du proxy inverse
Option A : VM légère
- Créez une nouvelle VM sur Proxmox (Debian/Ubuntu recommandé)
- Allouez des ressources minimales : 1 CPU, 2 Go de RAM, 10 Go de stockage
- Installez Docker et Docker Compose
Option B : Conteneur LXC (Recommandé)
- Utilisez les scripts d'aide Proxmox pour un déploiement plus rapide
- Utilisation des ressources plus efficace
- Gestion plus facile
Installer Docker et Docker Compose
# Mettre à jour le système
sudo apt update && sudo apt upgrade -y
# Installer Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Installer Docker Compose
sudo apt install docker-compose -y
# Ajouter l'utilisateur au groupe docker
sudo usermod -aG docker $USERÉtape 2 : Installer Nginx Proxy Manager
Configuration Docker Compose
Créez docker-compose.yml:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80' # HTTP
- '81:81' # Admin UI
- '443:443' # HTTPS
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
db:
image: 'jc21/mariadb-aria:latest'
container_name: npm-database
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./data/mysql:/var/lib/mysqlLancer Nginx Proxy Manager
docker-compose up -dAccéder à l'interface d'administration
- Naviguez vers :
http://<proxy-vm-ip>:81 - Identifiants par défaut :
- E-mail :
admin@example.com - Mot de passe :
changeme
- E-mail :
- Modifiez immédiatement ces identifiants après la première connexion !
Étape 3 : Configurer le DNS interne
Utilisation du résolveur DNS pfSense
- Naviguez vers Services > DNS Resolver
- Activez le résolveur DNS s'il n'est pas déjà activé
- Sous Host Overrides (Surcharges d'hôtes), ajoutez
des entrées :
- Host :
proxmox, Domain :lab, IP :<proxy-ip> - Host :
n8n, Domain :lab, IP :<proxy-ip> - Host :
db, Domain :lab, IP :<proxy-ip>
- Host :
Alternative : Fichier Hosts local
À des fins de test, modifiez votre fichier /etc/hosts
local :
<proxy-ip> proxmox.lab
<proxy-ip> n8n.lab
<proxy-ip> db.lab
Étape 4 : Ajouter des services comme hôtes proxy
Dans l'interface utilisateur de Nginx Proxy Manager
- Cliquez sur « Proxy Hosts » → « Add Proxy Host »
- Onglet Détails :
- Domain Names :
n8n.lab - Scheme :
http - Forward Hostname/IP :
<n8n-container-ip> - Forward Port :
5678 - Block Common Exploits : ✓
- Websockets Support : ✓ (important pour n8n)
- Domain Names :
- Répétez l'opération pour d'autres services :
- Proxmox : Port
8006, Schemehttps - Databases : Le port varie, Scheme
http
- Proxmox : Port
Étape 5 : Demander des certificats SSL
Activer Let’s Encrypt
- Dans l'entrée Proxy Host, accédez à l'Onglet SSL
- Sélectionnez « Request a new SSL Certificate » (Demander un nouveau certificat SSL)
- Options :
- Force SSL : ✓
- HTTP/2 Support : ✓
- HSTS Enabled : ✓ (recommandé)
- Email for Let’s Encrypt : Votre e-mail
- Cliquez sur Save
Let’s Encrypt va automatiquement : - Générer le certificat SSL - Configurer HTTPS - Configurer le renouvellement automatique (tous les 90 jours)
Défi DNS (Pour les certificats Wildcard)
Si vous possédez un domaine et que vous souhaitez
*.yourdomain.com :
- Utilisez la méthode de défi DNS
- Configurez les identifiants du fournisseur DNS dans NPM
- Demandez le certificat wildcard :
*.yourdomain.com
Étape 6 : Ouvrir le port 443 dans le pare-feu
Configuration pfSense
- Naviguez vers Firewall > NAT > Port Forward
- Créez la règle :
- Interface : WAN
- Protocol : TCP
- Destination Port Range : 443
- Redirect Target IP :
<proxy-vm-ip> - Redirect Target Port : 443
- Description : Proxy inverse HTTPS
- Créez une règle de pare-feu correspondante si nécessaire
Pare-feu VM/Conteneur
Si vous utilisez UFW :
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 81/tcp # Interface d'administration (limiter au LAN uniquement !)Étape 7 : Tester l'accès
Tests internes
Depuis votre LAN :
curl -k https://n8n.lab
curl -k https://proxmox.lab:8006Tests par navigateur
- Ouvrez votre navigateur
- Naviguez vers
https://n8n.lab - Vérifiez :
- ✅ Certificat SSL valide (cadenas vert)
- ✅ Le service se charge correctement
- ✅ Aucun avertissement de certificat
Renforcement de la sécurité
Restreindre l'accès à l'interface d'administration
Dans Nginx Proxy Manager :
- Access Lists → Créez-en une nouvelle
- Authorization : Exiger un nom d'utilisateur/mot de passe
- Appliquez à l'hôte proxy de l'interface d'administration
Règles de pare-feu :
# Autoriser l'interface d'administration uniquement depuis le LAN sudo ufw deny 81/tcp sudo ufw allow from 192.168.0.0/16 to any port 81
Activer Fail2Ban
Protection contre les attaques par force brute :
sudo apt install fail2ban -y
# Créer un filtre NPM
sudo nano /etc/fail2ban/filter.d/npm.conf[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD).*HTTP.*" (4|5)\d\d
ignoreregex =Surveillance et maintenance
Vérifier l'expiration du certificat
Nginx Proxy Manager renouvelle automatiquement les certificats 30 jours avant leur expiration.
Vérifiez dans l'interface utilisateur : - SSL Certificates → Vérifiez les dates d'expiration
Surveillance des journaux
# Afficher les journaux NPM
docker logs -f nginx-proxy-manager
# Emplacement des journaux d'accès
cd ./data/logsSurveillance des performances
Ajoutez la surveillance avec : - Prometheus + Grafana - Uptime Kuma pour la disponibilité des services
Problèmes courants et solutions
Problème 1 : La demande de certificat échoue
Problème : Le défi Let’s Encrypt échoue
Solution : - Vérifiez que le port 80 est accessible depuis Internet - Vérifiez la résolution DNS - Essayez le défi HTTP au lieu du DNS
Problème 2 : La connexion WebSocket échoue
Problème : Les fonctionnalités en temps réel ne fonctionnent pas (n8n, console Proxmox)
Solution : - Activez Websockets
Support dans l'hôte proxy - Ajoutez une configuration Nginx
personnalisée : nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
Problème 3 : Accès au WebUI Proxmox refusé
Problème : Impossible d'accéder à Proxmox via le proxy
Solution : - Définissez Forward Scheme
sur https - Ajoutez des en-têtes personnalisés :
nginx proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;
Conclusion
La mise en place d'un proxy inverse avec Nginx Proxy Manager offre un accès centralisé et sécurisé à tous les services de votre homelab. La combinaison de certificats SSL automatisés, de noms de domaine personnalisés et d'une gestion unifiée crée une infrastructure professionnelle, à la fois sécurisée et facile à maintenir.
Cette configuration sert de gardien numérique à votre homelab, protégeant les services tout en offrant un accès pratique. Avec une configuration et un renforcement de la sécurité appropriés, vous pouvez exposer en toute sécurité des services sélectionnés à Internet tout en maintenant une protection robuste contre les accès non autorisés.
N'oubliez pas : La sécurité est un processus continu. Mettez régulièrement à jour votre proxy inverse, surveillez les journaux et examinez les modèles d'accès.