Modifications entre les versions 6 et 7
Version 6 à la date du 2007-06-01 11:45:51
Taille: 6456
Éditeur: JérômeSantini
Commentaire:
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"
Texte supprimé. Texte ajouté.
Ligne 114: Ligne 114:
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. 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.

Ce document présente quelques possibilités d'organisation réseau pour des serveurs virtuels OpenVZ sur un serveur [:Debian:].

TableOfContents()

La méthode « ProgFou »

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

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__
    
    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
    
    __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

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 :

auto vz1
iface vz1 inet manual
        bridge_ports    eth1
        bridge_stp      off
        bridge_fd       1
        bridge_maxwait 0

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.

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éé à la premiere étape.

% cat /etc/vz/vznet.conf 
EXTERNAL_SCRIPT=/usr/local/bin/vzaddbr

Exemple de script :

% cat /usr/local/bin/vzaddbr
#!/bin/bash

BRIDGE=vz1
ETH=$3

/sbin/ifconfig $ETH up

/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
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 de rien n'était.


CatégorieVirtualisation

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