Guide technique — Reverse Proxy

Configuration
Nginx en reverse proxy

Nginx — installation, configuration en reverse proxy devant un container LXC, règles NAT avec iptables et sécurisation du trafic entrant.

Auteur
EHAVOX
Mise à jour
2025
Système
Debian / Ubuntu
Sommaire
01

Installation du service Nginx

Sur Debian / Ubuntu, installez Nginx depuis les dépôts officiels :

bash
sudo apt update
sudo apt install nginx -y

Vérifier que le service est actif :

bash
sudo systemctl status nginx
02

Configuration du reverse proxy

Dans une architecture LXC, Nginx joue le rôle de reverse proxy : il reçoit les requêtes depuis Internet et les transfère vers le container qui héberge le service réel (Apache, app web…).

NET
Internet
Client
:80 / :443
HÔTE
Hôte
Nginx + iptables
proxy_pass
LXC
Container LXC
Apache / App

Le fichier de configuration principal se trouve ici :

path
/etc/nginx/sites-available/default

Exemple de configuration complète d'un reverse proxy avec X-Forwarded-For :

nginx.conf
server {
    listen        80;
    server_name   monsite.local;

    access_log    off;

    # Bloquer toutes les méthodes HTTP sauf GET, HEAD, POST
    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 444;
    }

    location / {
        proxy_pass   http://ip_du_container_lxc:80/;

        # Transmission de l'IP réelle du client au backend
        proxy_set_header   Host               $host;
        proxy_set_header   X-Real-IP          $remote_addr;
        proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto  $scheme;
    }
}
Info
Les en-têtes X-Forwarded-For permettent au serveur Apache (ou autre backend dans le LXC) de récupérer l'adresse IP réelle du client, et non celle du reverse proxy. Consultez le guide Apache pour la configuration côté backend.
Attention
Le code 444 est spécifique à Nginx — il ferme la connexion sans envoyer de réponse. C'est une technique efficace pour bloquer les scans automatiques utilisant des méthodes HTTP non standard.
03

Test & rechargement

Toujours tester la syntaxe avant de redémarrer Nginx :

bash
# Vérifier la syntaxe — doit afficher "syntax is ok"
sudo nginx -t

# Redémarrer le service
sudo systemctl restart nginx

# Recharger sans interrompre les connexions actives (préférable)
sudo systemctl reload nginx
Astuce
Préférez reload à restart en production — reload applique la nouvelle configuration sans couper les connexions existantes, tandis que restart arrête complètement le service.
04

Configuration NAT avec iptables

Pour permettre la redirection du trafic entrant vers votre container LXC, configurez les règles NAT dans le fichier de persistance iptables :

path
/etc/iptables/rules.v4

Ajoutez les règles suivantes dans la table nat :

iptables
# SNAT — autorise la sortie du réseau LXC vers Internet (masquerade)
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE

# DNAT — redirige le trafic HTTPS (443) vers le container Nginx
-A PREROUTING -i votre_carte_réseau -p tcp --dport 443 -j DNAT --to-destination ip_conteneur_nginx

# DNAT — redirige le trafic HTTP (80) vers le container Nginx
-A PREROUTING -i votre_carte_réseau -p tcp --dport 80  -j DNAT --to-destination ip_conteneur_nginx

COMMIT
  • SNAT / MASQUERADE — autorise les containers LXC à sortir vers Internet en masquant leur adresse IP privée derrière celle de l'hôte.
  • DNAT (443) — redirige le trafic HTTPS entrant sur l'interface publique vers l'IP interne du container Nginx.
  • DNAT (80) — même principe pour le trafic HTTP, utile pour les redirections vers HTTPS gérées par Certbot/Let's Encrypt.

Après modification des règles, rechargez iptables pour les appliquer :

bash
sudo netfilter-persistent restart
Attention
Assurez-vous que le paquet iptables-persistent est installé pour que les règles survivent à un redémarrage :

sudo apt install iptables-persistent -y
05

Astuces & sécurisation

  • Restreindre les ports ouverts — autorisez uniquement les ports 80 et 443 via le pare-feu (UFW ou iptables). Tous les autres ports doivent être fermés côté Internet.
  • SSL avec Let's Encrypt — mettez en place un certificat SSL gratuit avec Certbot pour forcer HTTPS et sécuriser les échanges entre le client et Nginx.
  • Désactiver les méthodes HTTP inutiles — la directive return 444 sur les méthodes non standard est déjà incluse dans l'exemple de configuration ci-dessus.
  • Fail2ban sur Nginx — installez et configurez Fail2ban avec la jail nginx-http-auth pour bloquer automatiquement les tentatives d'attaque par force brute.
  • Isoler les services dans LXC — hébergez chaque service (Apache, app…) dans un container LXC dédié. Nginx sur l'hôte ne fait que router — il n'héberge aucune application directement.
Astuce
Architecture recommandée pour un serveur public : Internet → iptables NAT → Nginx (container LXC) → Apache/app (autre container LXC). Consultez le guide LXC pour mettre en place cette isolation réseau complète.