Modifications entre les versions 7 et 20 (s'étendant sur 13 versions)
Version 7 à la date du 2007-06-01 12:42:16
Taille: 6704
Éditeur: JérômeSantini
Commentaire: précision sur la connexion réseau à l'hôte en mode "pont"
Version 20 à la date du 2018-01-19 17:16:04
Taille: 3854
Éditeur: MoussaNombre
Commentaire: Ajout du sommaire
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
Ce document présente quelques possibilités d'organisation réseau pour des serveurs virtuels OpenVZ sur un serveur [:Debian:]. <<TableOfContents()>>
Ligne 3: Ligne 3:
||<tablestyle="float: right">[[TableOfContents()]]|| Pour la configuration réseau des machines virtuelle, la méthode « pont Ethernet » est celle qui est conseillée à l'AUF. L'avantage de cette méthode est de présenter, '''côté machines virtuelle, une configuration réseau 100% similaire à celle de machines physiques'''.
Ligne 5: Ligne 5:
== La méthode « ProgFou » ==  * [[http://en.wikipedia.org/wiki/Ethernet_bridge|Explications de la notion de pont Ethernet (en anglais)]]
 * [[http://wiki.openvz.org/Veth| Configuration du pont Ethernet avec OpenVZ (en anglais)]]
Ligne 7: Ligne 8:
=== Principes ===
 * les serveurs virtuels sont une segmentation sécuritaire des services offerts
 * cette segmentation ne devrait pas être visible ou gênante pour les utilisateurs
 * l'organisation réseau doit être la plus « naturelle » possible (pas de bidouillage infâme)
 * mise en réseau autonome (une sorte de DMZ) des serveurs virtuels
= Sur la machine hôte =
Ligne 13: Ligne 10:
=== Implémentation ===
 * utilisation du bloc d'adresses `192.168.127.0/24`, choix arbitraire en référence au réseau `127.0.0.0/8`
 * utilisation d'une interface `dummy` pour la « connexion » du serveur hôte :
 {{{
sudo sh -c 'echo dummy >> /etc/modules'
sudo modprobe dummy
sudo sh -c 'cat >> /etc/network/interfaces' << __EOF__
 * Installer le package {{{bridge-utils}}}
Ligne 21: Ligne 12:
auto dummy0
iface dummy0 inet static
    address 192.168.127.254
    netmask 255.255.255.0
    network 192.168.127.0
    broadcast 192.168.127.255
 * Configurer un '''pont ethernet''' sur la machine hôte. Si l'interface choisie est {{{eth1}}}, par exemple, mettre pour cela dans le {{{/etc/network/interfaces}}} quelque chose du genre :
Ligne 28: Ligne 14:
__EOF__
sudo ifup dummy0
}}}
 * deux méthodes possibles d'interaction avec les serveurs virtuels :
  * masquage à l'aide de la traduction d'adresses
  * utilisation d'un frontal se positionnant en intermédiaire
  {{{
# Extrait de /etc/network/interfaces sur la machine hôte.
# On créé un bridge "vz1" sur lequel on connecte "eth1" (la vraie carte).
# On y connectera ensuite les machines virtuelles, comme si on les
# connectait à un switch relié à eth1.
Ligne 35: Ligne 20:
=== Masquage des serveurs virtuels via traduction d'adresse ===

À mettre dans un script lancé au démarrage du serveur hôte :
{{{
IPT="/sbin/iptables"
IPTN="$IPT -t nat"

IF_PUBLIC="eth0"
IP_PUBLIC="207.46.232.182"

NET_VZ="192.168.127.0/24"
IF_VZ="dummy0"
IP_VZ="192.168.127.254"
IP_VZ_DNS="192.168.127.9"
IP_VZ_MYSQL="192.168.127.10"
IP_VZ_SMTP="192.168.127.11"
IP_VZ_IMAP="192.168.127.11"
IP_VZ_WWW="192.168.127.12"

# masquage en sortie :
$IPTN -A POSTROUTING -s "$NET_VZ" -o "$IF_PUBLIC" -j SNAT --to-source "$IP_PUBLIC"

# masquage en entrée :
$IPTN -A PREROUTING -d "$IP_PUBLIC" -p udp -m udp --dport 53 -j DNAT --to-destination "$IP_VZ_DNS"
$IPTN -A PREROUTING -d "$IP_PUBLIC" -p tcp -m tcp --dport 53 -j DNAT --to-destination "$IP_VZ_DNS"
$IPTN -A PREROUTING -d "$IP_PUBLIC" -p tcp -m tcp --dport 3306 -j DNAT --to-destination "$IP_VZ_MYSQL"
$IPTN -A PREROUTING -d "$IP_PUBLIC" -p tcp -m multiport --dports 25,465 -j DNAT --to-destination "$IP_VZ_SMTP"
$IPTN -A PREROUTING -d "$IP_PUBLIC" -p tcp -m multiport --dports 143,993 -j DNAT --to-destination "$IP_VZ_IMAP"
$IPTN -A PREROUTING -d "$IP_PUBLIC" -p tcp -m multiport --dports 80,443 -j DNAT --to-destination "$IP_VZ_WWW"
}}}

=== Installation d'un frontal ===

''...(à compléter)...''

==== Frontal web avec Apache ====

/!\ '''Attention''' : il faut utiliser au minimum la version 2.0 de Apache.

Il faut au préalable activer le module `proxy` de Apache :
{{{
sudo a2enmod proxy
sudo apache2ctl graceful
}}}

Exemple pour renvoyer les requêtes vers un serveur virtuel, à mettre par exemple dans `/etc/apache2/sites-available/default` :
{{{
  <IfModule mod_proxy.c>
    ProxyRequests Off
    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>
    ProxyPass / http://192.168.127.12/moodle
    ProxyPassReverse / http://192.168.127.12/moodle
  </IfModule>
}}}

(!) Pour sécuriser au mieux les services web, on pourra utiliser des sites virtuels (''!VirtualHost'') sur le frontal pour renvoyer vers plusieurs serveurs virtuels indépendants.

== La méthode « pont ethernet » ==

L'avantage de cette méthode est de présenter, côté machines virtuelle, une configuration réseau 100% similaire à celle de machines physiques.

 * (<!>mettre ici un lien vers une explication des ponts ethernet en général, et sous linux en particulier<!>)
 * (<!>mettre ici le lien vers la doc openvz wiki correspondante)
 
Installer le package {{{bridge-utils}}}

Configurer un pont ethernet sur la machine hôte. Si l'interface choisie est {{{eth1}}}, par exemple, mettre pour cela dans le {{{/etc/network/interfaces}}} quelquechose du genre :
{{{
Ligne 109: Ligne 23:
        bridge_stp off
        bridge_fd 1
        bridge_maxwait 0
Ligne 114: Ligne 25:
Si la machine dispose de plusieurs interfaces, je préfere ne pas mettre d'ip sur l'interface associée au pont, et de configurer une autre interface pour accéder à la machine hôte. Dans ce cas, ajouter un {{{net.ipv4.conf.eth0.forwarding=0}}} dans le /etc/sysctl.conf pour l'interface (ici, eth0) qui servira uniquement à administrer la machine. Cette interface peut même être branchée sur un réseau différent, ultra-protégé, pour limiter les accés à l'hôte, qu'il est vital de bien protéger : un accés illégitime à l'hôte donnerait accés à tous les serveurs hebergés dessus.  . Remarque : si la machine dispose de plusieurs interfaces, il est intéressant de ne pas mettre d'ip sur l'interface associée au pont. On configure une autre interface pour accéder à la machine hôte directement. Dans ce cas, ajouter `net.ipv4.conf.eth0.forwarding=0` dans le /etc/sysctl.conf pour l'interface (ici, eth0) qui servira uniquement à accéder à la machine hôte. Cette interface peut même être branchée sur un réseau différent, ultra-protégé, pour limiter les accès à l'hôte, qu'il est vital de bien protéger : un accés illégitime à l'hôte donnerait accès à tous ses serveurs virtuels...!
Ligne 116: Ligne 27:
Vérifier que le forwarding est bien activé pour la machine :
{{{
% grep ^net.ipv4.ip_forward /etc/sysctl.conf
net.ipv4.ip_forward = 1
 * Le fichier `/etc/vz/vznet.conf` configure le comportement réseau lors du démarrage de nouvelle machines. Y ajouter le chemin vers un script qui ajoutera à chaque fois l'interface Ethernet de la machine démarrée au pont créé ci-dessus :

  {{{
$ cat /etc/vz/vznet.conf
EXTERNAL_SCRIPT=/usr/sbin/vznetaddbr
Ligne 122: Ligne 34:
Le fichier {{{/etc/vz/vznet.conf}}} configure le comportement réseau lors du démarrage de nouvelle machines. Y ajouter le chemin vers un script qui ajoutera à chaque fois l'interface ethernet de la machine démarrée au pont créé à la premiere étape.  * Enfin, dernière étape, configurer une interface ethernet virtuelle sur chaque machine, et l'ajouter au bridge vz1 (dernier paramètre). Exemple pour la machine 211 :
Ligne 124: Ligne 36:
{{{
% cat /etc/vz/vznet.conf
EXTERNAL_SCRIPT=/usr/local/bin/vzaddbr
}}}
  {{{# vzctl set 211 --netif_add "eth0,00:E1:00:00:21:1A,veth211.1,00:E1:00:00:21:1B,vz1" --save}}}
Ligne 129: Ligne 38:
Exemple de script :  . Note : Vous pouvez ensuite vérifier dans /etc/vz/conf/211.conf que la ligne NETIF est correctement configurée.
Ligne 131: Ligne 40:
{{{
% cat /usr/local/bin/vzaddbr
#!/bin/bash
 * '''Attention au choix des adresses MAC''' :
  1. ne pas attribuer deux fois la même adresse MAC pour deux machines différente.
  1. Attention au préfixe ! Il faut choisir un préfixe supérieur à celui de l'adresse MAC de l'interface physique. En effet dans l'algorithme de gestion de pont, c'est toujours '''la plus petite adresse MAC qui est choisie pour être celle du pont'''. Or il ne faut pas que l'adresse MAC change lorsqu'une machine virtuelle est démarrée ou stoppée. Il faut donc que l'adresse MAC la plus petite soit celle de la machine physique, qui ne change pas.
  1. Astuce : utiliser pour les deux derniers octets le numéro de la machine elle même (le VEID), avec à la fin A et B respectivement pour l'interface côté machine virtuelle et côté hôte. Ainsi, pour la machine 101, `00:E0:00:00:10:1A` côté machine virtuelle et `00:E0:00:00:10:1B` côté machine hôte.
Ligne 135: Ligne 45:
BRIDGE=vz1
ETH=$3
= Et sur les machines virtuelles ? rien ! =
Ligne 138: Ligne 47:
/sbin/ifconfig $ETH up Enfin, enfin, enfin, côté machine virtuelle : rien de particulier, configurer l'interface eth0 comme si de rien n'était !
Ligne 140: Ligne 49:
/usr/sbin/brctl addif $BRIDGE $ETH
}}}

Enfin, dernière étape, configurer une interface ethernet virtuelle sur chaque machine :

{{{vzctl set 211 --netif_add "ifname=eth0,mac=00:E1:00:00:21:1A,host_ifname=veth211.1,host_mac=00:E1:00:00:21:1B" --save}}}

Choix des adresses mac :
 * ne pas attribuer deux fois la même adresse mac pour deux machines différente.
 * à dakar, j'utilise pour les deux derniers octects le numero de la machine elle même (le VEID), avec A et B respectivement pour l'interface côté machine virtuelle et côté hôte.
 * Attention au préfixe ! Choisir un préfixe legerement supérieur à celui de l'adresse mac de l'interface physique : dans l'algorithme de gestion de pont, c'est toujours la plus petite adresse mac qui est choisie pour être celle du pont. Le fait que l'adresse mac change lorsqu'une machine est démarrée ou stoppée peut provoquer des perturbations diverses.

Enfin (ENFIN), côté machine virtuelle : rien de particulier, configurer l'interface eth0 comme si de rien n'était :
{{{
# cat /var/lib/vz/root/211/etc/network/interfaces
  {{{
# cat /var/lib/vz/private/211/etc/network/interfaces
Ligne 160: Ligne 56:
 address 172.18.1.211
 netmask 255.255.255.0
        address 172.18.1.211
        netmask 255.255.255.0
Ligne 164: Ligne 60:
La machine virtuelle est connectée au réseau comme si de rien n'était.

----
CatégorieVirtualisation
La machine virtuelle est connectée au réseau comme si elle était sur un switch... comme si de rien n'était.

Pour la configuration réseau des machines virtuelle, la méthode « pont Ethernet » est celle qui est conseillée à l'AUF. L'avantage de cette méthode est de présenter, côté machines virtuelle, une configuration réseau 100% similaire à celle de machines physiques.

Sur la machine hôte

  • Installer le package bridge-utils

  • Configurer un pont ethernet sur la machine hôte. Si l'interface choisie est eth1, par exemple, mettre pour cela dans le /etc/network/interfaces quelque chose du genre :

    • # Extrait de /etc/network/interfaces sur la machine hôte.
      # On créé un bridge "vz1" sur lequel on connecte "eth1" (la vraie carte).
      # On y connectera ensuite les machines virtuelles, comme si on les
      # connectait à un switch relié à eth1.
      
      auto vz1
      iface vz1 inet manual
              bridge_ports    eth1
  • Remarque : si la machine dispose de plusieurs interfaces, il est intéressant de ne pas mettre d'ip sur l'interface associée au pont. On configure une autre interface pour accéder à la machine hôte directement. Dans ce cas, ajouter net.ipv4.conf.eth0.forwarding=0 dans le /etc/sysctl.conf pour l'interface (ici, eth0) qui servira uniquement à accéder à la machine hôte. Cette interface peut même être branchée sur un réseau différent, ultra-protégé, pour limiter les accès à l'hôte, qu'il est vital de bien protéger : un accés illégitime à l'hôte donnerait accès à tous ses serveurs virtuels...!

  • Le fichier /etc/vz/vznet.conf configure le comportement réseau lors du démarrage de nouvelle machines. Y ajouter le chemin vers un script qui ajoutera à chaque fois l'interface Ethernet de la machine démarrée au pont créé ci-dessus :

    • $ cat /etc/vz/vznet.conf
      EXTERNAL_SCRIPT=/usr/sbin/vznetaddbr
  • Enfin, dernière étape, configurer une interface ethernet virtuelle sur chaque machine, et l'ajouter au bridge vz1 (dernier paramètre). Exemple pour la machine 211 :
    • # vzctl set 211 --netif_add "eth0,00:E1:00:00:21:1A,veth211.1,00:E1:00:00:21:1B,vz1" --save

  • Note : Vous pouvez ensuite vérifier dans /etc/vz/conf/211.conf que la ligne NETIF est correctement configurée.
  • Attention au choix des adresses MAC :

    1. ne pas attribuer deux fois la même adresse MAC pour deux machines différente.
    2. Attention au préfixe ! Il faut choisir un préfixe supérieur à celui de l'adresse MAC de l'interface physique. En effet dans l'algorithme de gestion de pont, c'est toujours la plus petite adresse MAC qui est choisie pour être celle du pont. Or il ne faut pas que l'adresse MAC change lorsqu'une machine virtuelle est démarrée ou stoppée. Il faut donc que l'adresse MAC la plus petite soit celle de la machine physique, qui ne change pas.

    3. Astuce : utiliser pour les deux derniers octets le numéro de la machine elle même (le VEID), avec à la fin A et B respectivement pour l'interface côté machine virtuelle et côté hôte. Ainsi, pour la machine 101, 00:E0:00:00:10:1A côté machine virtuelle et 00:E0:00:00:10:1B côté machine hôte.

Et sur les machines virtuelles ? rien !

Enfin, enfin, enfin, côté machine virtuelle : rien de particulier, configurer l'interface eth0 comme si de rien n'était !

  • # cat /var/lib/vz/private/211/etc/network/interfaces
    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet static
            address 172.18.1.211
            netmask 255.255.255.0

La machine virtuelle est connectée au réseau comme si elle était sur un switch... comme si de rien n'était.

OpenVZ/OrganisationRéseau (dernière édition le 2018-01-19 17:16:04 par MoussaNombre)