Problématique : faut qu'ça cause

Ce tutoriel a été rédigé sur le modèle d'un serveur dédié "dedibox" loué par Online.net.

Nota : cet article est la transcription un peu plus détaillée et technique d'un post de moi-même sur le forum d'Online. Il n'y a donc pas de probème de droits :)

Cependant, il peut s'adapter à n'importe quel serveur ayant une distribution proxmox d'installée, au prix du changement de nom de quelques interfaces.

Globalement le problème se résume ainsi :

  • Votre proxmox est installé sur un serveur dédié
  • Vous avez plusieurs machines virtuelles, qui ont besoin de causer entre elles, ou mieux avec l'extérieur (mises à jour, tout ça...)
  • Votre herbergeur est un gros extrémiste sécurise son réseau et il coupe tout accès à votre serveur si vous avez le malheur de sortir sur le réseau avec une adresse IP/MAC privée

 

Il va donc falloir mettre en place un réseau virtuel interne à votre proxmox, et le cas échéant un système de NAT efficace pour permettre à vos VM avec adresses IP privées de sortir sur Internet.

Que ce soit clair, ces règles de pare-feu ne sécurisent en rien votre serveur, elles se contentent uniquement de permettre à vos machines virtuelles de causer entre elles.

Posons les termes : de quoi on parle

Pour rendre plus simples les explications suivantes, je vais poser dès maintenant la configuration que l'on va utiliser.

Le tutoriel se base sur proxmox V2, configuré juste après installation.

Dans ce cadre :

  1. On utilise une distribution Proxmox, donc basée sur Debian
  2. vmbr0 est l'interface bridge créée par proxmox, normalement liée à eth0
  3. vmbr1 est une interface bridge supplémentaire créé par nos soins, sans nécessité d'être liée à une interface physique (éventuellement créée depuis l'interface web proxmox)
  4. Le pare-feu que nous utiliserons sera iptables
  5. Nous configurerons des containeurs OpenVZ (mais la configuration fonctionne avec des KVM en réseau bridgé)
  6. Une machine VMID OpenVZ existe déjà, et elle dispose d'une interface publique avec une adresse MAC générée via l'interface web Online. (hors cadre de ce tuto)
  7. Vos VM utilisent la plage d'adresse IP privées 192.168.0.0/16
  8. Vous possédez déjà quelques connaissances en ligne de commande/iptables

Les mains dans le cambouis

Première chose à faire, se connecter en SSH sur votre hyperviseur proxmox.

Utilisez Putty si vous êtes sous Windows, ou le shell via une applet java dans l'interface Proxmox en alternative.

Dans tous les cas, continuez une fois que vous avez un shell d'ouvert sur votre hyperviseur  :-)

Evitons les blocages intempestifs

La première manip va être de mettre en place un NAT sur l'interface physique qui sert à l'hyperviseur pour joindre Internet. Ceci permettra tout de suite d'éviter la moindre fuite d'un paquet venant d'une VM vers l'extérieur.

En effet, cette fuite pourrait entrainer la coupure de l'accès à votre serveur pour une durée indéterminée, évitons donc tout de suite ce cas là.

Un effet de bord intéressant est que vos futures VM pourront accéder à Internet à l'aide de ce NAT à l'aide d'un peu de routage ! Pratique pour les mises à jour.

Pour mettre en place ce NAT, utilisez les lignes suivantes (à utiliser en root, ou alternativement avec sudo) :

 $ iptables -t nat -A POSTROUTING -o vmbr0 -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE
 $ echo 1 > /proc/sys/net/ipv4/ip_forward

Cela va permettre d'activer l'ip forwarding sur votre interface, et va faire en sorte que toutes vos VM en 192.168.0.0/16 seront nattées lorsqu'elles essaieront de joindre une machine qui n'est pas en 192.168.0.0/16.

Attention, changez les adresses IP selon votre configuration.

Cette configuration est temporaire, elle n'aura plus d'effet au prochain redémarrage. Nous verrons dans la dernière partie comment les rendre permanentes, mais vérifiez que tout fonctionne avant de faire ça.

(Si vous vous plantez et que vous bloquez l'accès à votre système, au moins un redémarrage règle le problème. Une fois les règles permanentes, vous êtes obligés de tout formater...)

Configuration OpenVZ

Nous allons rajouter à la VM une interface réseau qui va bien. C'est également possible de le faire via l'interface web, mais comme on est en SSH on va pas s'embêter à ouvrir un navigateur !

vzctl set VMID --netif_add eth1,,,,vmbr1 --save

Ceci va permettre de rajouter à la machine VMID une interface eth1, branchée sur vmbr1. L'adresse MAC sera générée automatiquement. Le --save rend la modification permanente même après redémarrage de la VM.

Pour faire plus simple, vous pouvez mettre à vmbr1 une adresse IP dans la même plage que les VM (ici 192.168.0.0/16), histoire que l'hyperviseur puisse leur causer aussi. Ce n'est pas obligatoire ceci dit.

Pour faire ça, il suffit de modifier le fichier /etc/network/interfaces -> Voir dans la section "Modification permamentes"

Ensuite, il vous suffit de créer autant de VM que vous le souhaitez en réseau local. La seule contrainte est de leur mettre une interface réseau branchée sur vmbr1 à la création, puis une adresse IP dans la plage qui va bien.

De cette façon vous êtes parés.

Modifications permanentes

Bon aller, pour que tout cela soit permanent même après redémarrage, voici les choses à rajouter.

Les modifications sont à faire sur l'hyperviseur.

Dans /etc/network/interfaces, rajoutez sous la section vmbr0 les lignes suivantes :

echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -o vmbr0 -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -o vmbr0 -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE

De cette façon, le NAT sera configuré au démarrage sur vmbr0.

Pour avoir une adresse IP privée sur vmbr1, soit vous passez par l'interface web, soit vous retournez dans /etc/network/interfaces et vous rajouter dans vmbr1 les lignes qui vont bien (en vous basant sur vmbr0 par exemple)

addresse 192.168.0.1
netmask 255.255.0.0
broadcast 192.168.0.255

 

Voila, j'espère que ce petit tuto vous aura été utile. Si vous avez des questions particulières, n'hésitez pas  :-)

 


Victor Avatar Victor est le rédacteur principal du blog.
Comments

Si vous avez des questions, si quelque chose n'est pas clair, n'hésitez pas à commenter !

  • Avatar
    Permalink

    Bio Teckna

    Posted on

    Bonjour,

    Ton article est parfait ! J'ai eu exactement le même soucis que toi. Je me suis dis que je ne devais pas être le seul et qu'il y avait surement un gentil blogueur qui avait mis comment éviter le super blocage.

    Merci beaucoup, je vais pouvoir virtualiser ma vie et regrouper tout sur une même machine.


    • Avatar
      Permalink

      Victor

      Posted on

      Hello,

      Pas de soucis, heureux d'avoir pu t'aider ! Ca m'étonnait aussi d'être le seul à être tombé sur ce problème ;)

      A plush'

    • Avatar
      Permalink

      Bio Teckna

      Posted on

      C'est encore moi,

      Je galère depuis ce matin pour configurer le NAT comme il faut.
      Hôte :
      eth0 et vmbr0 en mode bridge sur eth0 afin d'avoir l'IP de mon hebergeur (ça c'est fait tout seul)
      J'ai rajouté une autre interface vmbr1 avec l'ip 10.0.1.254 qui représentera la passerelle par defaut des VM. Ensuite j'ai une VM Ubuntu server 12.04 avec un eth0 en 10.0.1.1.
      J'ai mis en place du NAT comme dans votre explication avec les bonnes IP (10.0.1.0 pour le réseau privé). J'ai activé le routage mais c'est cette ligne que je ne comprends pas :

      vzctl set VMID --netif_add eth1,,,,vmbr1 --save

      Je fais cette ligne sur la VM ? sur l'Hôte proxmox ? à quoi sert-elle précisement ? D'après ce que j'ai compris c'est pour relier virtuellement une interface eth1 d'une VM avec l'id VMID à l'interface vmbr1 de l'hôte proxmox. Cependant, sur mon ubuntu serveur "vzctl" n'est pas installé du coup je ne vois pas comment faire vu que je n'ai pas encore internet.

      Est-ce que vous pourriez m'aider s'il vous plait :)

      Merci d'avance

    • Avatar
      Permalink

      Victor

      Posted on

      Hello,

      Alors voyons :) Je pars du principe que vous êtes partis sur une OpenVZ pour l'Ubuntu Serveur. Si c'est bien le cas, la commande vzctl est disponible sur l'hyperviseur Proxmox. C'est une commande pour gérer openVZ en ligne de commande. Avec ces options, elle permet effectivement de rajouter une interface à une VM, nommée eth1 et liée à vmbr1.

      Du coup, dans votre cas, pour coller au tuto : - Vous ne dites pas sur quel vmbr est bridgé l'interface eth0 de votre VM, donc le mieux est de le bridger sur vmbr1, avec son IP en 10.0.1.1. - Du coup, pas besoin de recréer une autre interface pour la VM, eth0 devrait suffire. (En fait, ajouter une deuxième interface permet à des VM de parler sur leur réseau interne, dans le cas où l'on se sert d'une VM comme passerelle. Ici, on va se servir de l'hyperviseur, donc pas forcément utile de créer une deuxième interface) - Une fois le bridge fait sur vmbr1, il faut configurer dans la VM le 10.0.1.254 comme passerelle, ainsi elle se servira de vmbr1 comme liaison vers Internet. - Avec l'IP forward activé et le NAT, normalement tous ce qui passe par vmbr1 et essaye de joindre Internet va être redirigé vers vmbr0 et nattée avant de sortir sur Internet. En théorie, ça devrait marcher si je n'ai rien loupé :)

      Fais moi signe si ce n'est pas au point. Bon courage !

      A plush'

  • Avatar
    Permalink

    badmaniak

    Posted on

    Hello Victor, J'ai essayé de suivre ton tuto à la lettre, mais je n'ai pas forcément le résultat escompté ( en même temps je débute sur proxmox j'utilisais avant plus tôt ESXi):

    Contexte : serveur dédié chez ONline, j'utilise que des kvms (pour le moment), elle sont configurer en NAT sur l'hôte.

    Je souhaite avoir un réseau privé pour l'utilisation de mes VM 192.168.0.0/24 et quelle puissent discuter entre elles, j'ai donc mis en place une configuration sur ma machine Hôte dans /etc/network/interfaces :

    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface
    auto vmbr0
    iface vmbr0 inet static
            address 88.x.x.x
            netmask 255.255.255.0
            network 88.x.x.0
            broadcast 88.x.x.255
            gateway 88.x.x.1
            bridge_ports eth0
            bridge_stp off
            bridge_fd 0
    echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up iptables -t nat -A POSTROUTING -o vmbr0 -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -o vmbr0 -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE
    
    auto vmbr1
    iface vmbr1 inet static
     address  192.168.0.1
     netmask  255.255.255.0
     bridge_ports none
     bridge_stp off
     bridge_fd 0
    

    Merci de me dire si c'est déjà correcte!!

    Sur les VM kvm, j'ai configuré eth0 pour qu'il soit dans le réseau 192.168.0.0/24. Par défaut si j'utilise le DHCP les VM se retrouvent avec une adresse 10.0.2.15 ( c'est d'ailleurs la même pour toutes les vm). Avec l'adresse fournit par le DHCP les VM communiquent avec l’extérieur sans problème ( à part l'icmp) mais dès que je configure l'adresse en statique sur le réseau 192.168.0.0/24, la plus rien.
    Je tourne un peu en rond depuis quelque temps j'ai certainement raté une étape, mais je ne vois pas laquelle....

    Merci d'avance pour ta réponse.


    • Avatar
      Permalink

      badmaniak

      Posted on

      Salut, avec Openvz ça fonctionne, par contre toujours pas avec KVM .

    • Avatar
      Permalink

      Victor

      Posted on

      Hello,

      Navré pour le temps de réponse, j'ai été un peu absent ces derniers temps. Mea culpa !

      Ta configuration hyperviseur me semble correcte déjà :)

      Tu dis que le système fonctionne avec OpenVZ, c'est à dire avec des OpenVZ montée en bridge sur vmbr1 ?
      Pour tes KVM, as tu utilisé un réseau bridgé directement sur vmbr1 ? Le premire truc qui me vient à l'esprit, c'est que la route par défaut ou le DNS n'est pas configuré sur les KVM, ce qui fait que en static, ça ne fonctionne pas, alors qu'en DHCP si. Est ce que tu as bien mis la directive gateway dans le /etc/network/interfaces de tes KVM ? Et configuré le DNS dans /etc/resolv.conf ? (ou la directive dns-nameserver dans /etc/network/interfaces)

      En OpenVZ, ça fonctionne peut être si tu es resté en venet et pas en veth.

      Tu as peut être sinon un pare-feu qui tourne sur l'hyperviseur et qui laisserait passer le 10.0 et pas le 192.168 ?

      J'espère pouvoir t'aider même un mois après :)
      Tiens moi au courant si ces quelques suggestions donnent un résultat.

      A plush'

    • Avatar
      Permalink

      badmaniak

      Posted on

      Salut Victor,

      Désolé pour ma réponse tardive, en fait le configuration à grandement évolué, tout fonctionne, j'ai crée un script iptables pour faire communiquer mes vm entre elles OPENVZ et KVM mais surtout pour sécuriser mon serveur, le tout "Naté " sur l'interface publique vbmr0. Bref merci pour l’article et tes conseils qui m'ont bien orientés vers ma solution.

      @+

  • Avatar
    Permalink

    Yogz

    Posted on

    Hello,

    Merci pour le tuto ! J'ai essayé d'appliquer la config sur une dedibox sous centos/KVM.
    J'ai bien un reseau local sur le range d'ip 192.168...
    J'ai ajouté un bridge sur mon hypersiveur sur lequel sont connectées mes interfaces privées de mes VMs.
    Depuis une VM possédant uniquement une interface privée je peux pinger l'ensemble des Ips de mon serveurs (mes deux ip publiques notamment) mais je n'ai aucun accès à internet... Quelle serait la configuration à appliquée pour pouvoir avoir accès au net depuis ma VM ?

    Merci de ton aide


    • Avatar
      Permalink

      Victor

      Posted on

      Hello,

      Je verrai 3 choses à tester pour commencer :
      - Est ce que tu as bien un NAT de configuré (la partie de configuration avec Masquerade) sur ton interface publique ?
      - Est ce que tu as bien configuré l'IP forward sur tes interfaces (echo 1 > /proc/sys/net/ipv4/ip_forward), ce qui pourrait bloquer le transfert des paquets entre les interfaces, mais ça m'étonnerait si tu arrives à pinguer tes IP publiques
      - Enfin, peut être tout simplement un problème de DNS sur tes machines privées ? Que donne un "ping 8.8.8.8" (l'adresse du DNS de google) ? S'il marche, alors c'est que ta VM n'a pas de DNS correct de configuré.

      Jusqu'ici cette configuration a plutôt bien fonctionné, alors n'hésite pas à revenir vers moi si tu as besoin d'aide ou si tu trouves la solution, je pourrai mettre à jour le tuto :)

      A plush'

  • Avatar
    Permalink

    ibasaw

    Posted on

    Bonjour,

    Je suis bloqué pour faire communiquer mes toutes mes vm/ct entre elles, voir le descriptif ici: http://forum.ovh.com/showthread.php?96960-proxmox-communication-entre-vm-ct

    Merci pour votre aide


    • Avatar
      Permalink

      Victor

      Posted on

      Hello ibasaw Mieux vaut tard que jamais, j'ai regardé ton poste et répondu, en espérant que ça t'aidera :)

      Bon courage !

  • Avatar
    Permalink

    xataz

    Posted on

    Bonjour,

    Je suis tomber sur ton sujet après de très longue recherche, mais il ne correspond pas encore a ce que je cherche, peut etre pourra tu m'aider.
    J'ai un serveur dédier, avec deux IP publique, mon but étant t'utilisé la 1ere pour acceder a proxmox uniquement, et la 2eme a mon sous réseau, donc je veux un container openvz qui fait office de passerelle.
    COnfigurer l'IP Failover, aucun soucis. Mais c'est derière, impossible de rattaché une interface virtuel a mon container.
    Aurait tu une idée ?
    Merci par avance


    • Avatar
      Permalink

      Victor

      Posted on

      Hello xataz,

      A première vue, je dirais que tu dois utiliser l'interface réseau venet, et pas veth pour ton container ?

      Avec veth, tu peux gérer les paramètres réseaux depuis l'intérieur du CT, ce que je trouve plus pratique personnellement pour les serveurs passerelles.

      Sinon, depuis l'interface proxmox elle-même, tu peux rajouter une interface, en indiquant sur quel bridge la "brancher". Dans ton cas, ça devrait sans doute être vmbr0, le bridge portant l'IP publique de l'hyperviseur.

      Une fois cette interface ajoutée, aucun souci pour configurer l'IP publique dessus.

      Ce que je te conseilel ensuite, c'est de créer une deuxième interface à ton CT, de a même façon via l'interface proxmox, mais branchée elle sur un 2eme bridge, type vmbr1 (quitte à ce qu'il ne soit lié à aucune interface physique). Ca permettra de brancher tes autres VM sur ce bridge, et donc d'avoir un genre de swith virtuel dédié à ton réseau privé.

      J'espère que ça pourra t'aider :) Sinon, n'hésite pas à détailler ton souci.

  • Avatar
    Permalink

    Boubacar

    Posted on

    Bonjour Je vies vous demander de l'aide mon soucis: possedant un serveur Kimsufi KS-3 avec Ipv4E iPV6 sans Ip failover, 1er hypothese j'aimerai le virualiser en y installant Proxmox v3.3 des vm mais en plus d'une vm pfsense en frontal pour la sécurité et permetre l'accès internet aux Vms et appliquer des regles d'iptables sur le serveur vue qu'il y une seule adresse ip publique 2eme hypothese installer vmware esxi avec pfsense en frontal et libérer l'adresse ipv4 pour pfsense et attribuer l'ipv6 au vmware esxi merci de votre aide

Ajouter un commentaire / Add a Comment

Vous pouvez utiliser la syntaxe Markdown pour formatter votre commentaire.

You can use the Markdown syntax to format your comment.

Flux Atom pour commentaire / Comment Atom Feed

Published

Category

Réseaux

Tags

Restez en contact