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
  • 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/mysql

Lancer Nginx Proxy Manager

docker-compose up -d

Accé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
  • Modifiez immédiatement ces identifiants après la première connexion !

Étape 3 : Configurer le DNS interne

Utilisation du résolveur DNS pfSense

  1. Naviguez vers Services > DNS Resolver
  2. Activez le résolveur DNS s'il n'est pas déjà activé
  3. 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>

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

  1. Cliquez sur « Proxy Hosts »« Add Proxy Host »
  2. 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)
  3. Répétez l'opération pour d'autres services :
    • Proxmox : Port 8006, Scheme https
    • Databases : Le port varie, Scheme http

Étape 5 : Demander des certificats SSL

Activer Let’s Encrypt

  1. Dans l'entrée Proxy Host, accédez à l'Onglet SSL
  2. Sélectionnez « Request a new SSL Certificate » (Demander un nouveau certificat SSL)
  3. Options :
    • Force SSL : ✓
    • HTTP/2 Support : ✓
    • HSTS Enabled : ✓ (recommandé)
    • Email for Let’s Encrypt : Votre e-mail
  4. 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 :

  1. Utilisez la méthode de défi DNS
  2. Configurez les identifiants du fournisseur DNS dans NPM
  3. Demandez le certificat wildcard : *.yourdomain.com

Étape 6 : Ouvrir le port 443 dans le pare-feu

Configuration pfSense

  1. Naviguez vers Firewall > NAT > Port Forward
  2. 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
  3. 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:8006

Tests par navigateur

  1. Ouvrez votre navigateur
  2. Naviguez vers https://n8n.lab
  3. 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

  1. 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
  2. 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/logs

Surveillance 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.