Michael BOUVY
CTO E-commerce

Proxmox / OpenVZ : réseau public + privé

Apache Proxy NAT OpenVZ Proxmox
Published on 2013/01/22

Logo Proxmox

Proxmox Virtual Environment est un serveur open source de virtualisation, basé sur KVM et OpenVZ. Il permet ainsi sur un serveur (host) physique de disposer de plusieurs machines virtuelles (VM). Dans le cas d'hébergement web, on mettra par exemple 1 VM pour Apache/PHP, 1 VM pour MySQL, etC. Si vous utilisez ce mode de fonctionnement sur internet (et non en réseau local), un inconvénient majeur est le fait de nécessiter une IP publique pour chaque VM si vous souhaitez pouvoir y accéder directement depuis l'extérieur. C'est le cas par exemple pour un serveur dédié que vous pouvez louer chez OVH (Kimsufi inclus) ou autre : vous disposerez dans le meilleur des cas, outre l'IP du host physique, de 3 IP (failover) pour vos VM. Dépassées ces 3 VM, vous ne pourrez donc plus leur assigner d'IP publique. La meilleure solution consiste alors à utiliser du NAT (oui, le même que sur vos routeurs à la maison) : il est possible grâce à iptables de définir des redirections de ports depuis le host physique vers des VM sans IP publique.

Configuration initiale

Il vous faut tout d'abord choisir une plage d'IP non routées sur Internet type 192.168.x.x. Partons avec 192.168.0.0/24 (soit 192.168.0.1 à 192.168.0.255). Configurez votre VM en mode "réseau virtuel" VENET avec l'IP de votre choix définie dans la range définie précédemment, prenons 192.168.0.11. Démarrez votre VM : vous devriez pouvoir y accéder depuis votre host (ping, connexion SSH si serveur installé). Il vous reste deux dernières commandes à lancer pour permettre à vos VM de communiquer avec l'extérieur :

echo 1 > /proc/sys/net/ipv4/ip_forward # On autorise le host à transmettre des données extérieures aux VM internes
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o vmbr0 -j MASQUERADE # On active le NAT, en sortie via l'interface vmbr0 (à modifier si besoin)

Redirection de ports

Il vous reste à mettre en place les redirections de ports souhaitées. Par exemple, si nous souhaitons que le port 8080 de notre host redirige vers le port 80 de notre VM 192.168.0.11 :

iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.11:80
Si vous avez un serveur qui écoute sur le port 80 de votre VM, essayer maintenant d'accéder à votre host sur le port 8080.

Reverse Proxy

Malheureusement, la redirection de ports sera très vite limitante si vous souhaitez par exemple avoir plusieurs VMs hébergeant un serveur web. Dans ce cas de figure, une solution existe : l'utilisation d'un reverse proxy (type Apache). Son fonctionnement est simple : il est positionné en frontal HTTP et/ou HTTPS sur votre host, et redirige les requêtes vers les différentes VM (sur leurs IP locales) en fonction du nom de domaine. Pour mettre en place un reverse proxy de ce type, rien de plus simple également ; nous allons utiliser le serveur HTTP Apache. Première étape, l'activation du mod_proxy :

sudo a2enmod proxy
Créez maintenant un fichier /etc/apache2/sites-available/monsite :

<IfModule mod_ssl.c>
 <VirtualHost *:80>
  ErrorLog /var/log/apache2/error.log
  CustomLog /var/log/apache2/access.log combined
  <Proxy https://192.168.0.11/>
   Order Deny,Allow
   Allow from all
  </Proxy>
  ServerName mon.domaine.fr
  ProxyRequests Off
  ProxyPass / https://192.168.0.11/
  ProxyPassReverse / https://192.168.0.11/
 </VirtualHost>
</IfModule>
Enregistre le fichier puis activez le site nouvellement créé et redémarrez Apache :

sudo a2ensite monsite
sudo service apache2 restart
Il ne vous reste plus qu'à tester dans votre navigateur que le domaine défini dans votre fichier de configuration Apache redirige bien vers le serveur web de votre VM.
Michael BOUVY

I'm Michael BOUVY, CTO and co-founder of Click&Mortar, a digital agency based in Paris, France, specialized in e-commerce.

Over the last years, I've worked as an Engineering Manager and CTO for brands like Zadig&Voltaire and Maisons du Monde.

With more than 10 years experience in e-commerce platforms, I'm always looking for new challenges, feel free to get in touch!