Proxmox / OpenVZ : réseau public + privé

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.

About 

Développeur PHP freelance Symfony2 & Magento, passioné de programmation et d'électronique.

  • googleplus
  • twitter
  • Cosmic

    Génial ton tuto, merci !

  • Pingback: Varnish : use multiple backends depending on host / URL | Michael Bouvy()

  • Alexis Verquin

    Merci pour le tuto cela ma beaucoup éclairé mais chez moi cela ne fonctionne toujours pas, sûrement un chose que je n’ai pas compris. Je suis sur un serveur OVH sous proxmox et la VM est une Ubuntu Server si jamais vous avez le temps et l’envie de me filer un petit coup de pouce n’hésitez pas a me faire signe ^^

    • Michael BOUVY

      Bonjour Alexis. A quel niveau bloquez-vous ?

  • Bonjour,
    Merci beaucoup pour ces explications.
    Tout fonctionne parfaitement mis à part le fait que je ne peux pas accéder à mon serveur Proxmox via SSH à partir d’un CT.
    Je n’arrive pas à comprendre pourquoi.
    J’aimerais savoir également la configuration réseau optimale du fichier /etc/network/interfaces (configuration des différentes interfaces réseau)
    Merci
    Ronan

  • Destroileur

    Bonjour,

    J’ai du mal et sa ne fonctionne pas…
    Personne qui est dispo sur skype pour m’aider ?
    ID: Destroileur

    Cordialement,