6456
Commentaire:
|
6527
|
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:]. | Ce document présente quelques possibilités d'organisation réseau pour des serveurs virtuels OpenVZ sur un serveur [[Debian]]. ||<tablestyle="float: right;"><<TableOfContents>> || |
Ligne 3: | Ligne 4: |
||<tablestyle="float: right">[[TableOfContents()]]|| | |
Ligne 6: | Ligne 8: |
Ligne 36: | Ligne 37: |
À mettre dans un script lancé au démarrage du serveur hôte : | |
Ligne 37: | Ligne 39: |
À mettre dans un script lancé au démarrage du serveur hôte : | |
Ligne 65: | Ligne 66: |
Ligne 67: | Ligne 67: |
Ligne 71: | Ligne 70: |
Ligne 75: | Ligne 73: |
Ligne 79: | Ligne 78: |
Exemple pour renvoyer les requêtes vers un serveur virtuel, à mettre par exemple dans `/etc/apache2/sites-available/default` : | |
Ligne 80: | Ligne 80: |
Exemple pour renvoyer les requêtes vers un serveur virtuel, à mettre par exemple dans `/etc/apache2/sites-available/default` : | |
Ligne 92: | Ligne 91: |
Ligne 95: | Ligne 93: |
== La méthode « pont ethernet » == |
== La méthode « pont Ethernet » == |
Ligne 99: | Ligne 96: |
* (<!>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) |
* [[javascript:void(0);/*1212143180368*/|Explications de la notion de pont Ethernet (en anglais)]] * (<!>mettre ici le lien vers la doc' OpenVZ wiki correspondante) |
Ligne 104: | Ligne 101: |
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 : | 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 113: | Ligne 111: |
Si la machine dispose de plusieurs interfaces, je préfère 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 hébergés dessus. | |
Ligne 114: | Ligne 113: |
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. 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. |
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 première étape. |
Ligne 125: | Ligne 116: |
% cat /etc/vz/vznet.conf EXTERNAL_SCRIPT=/usr/local/bin/vzaddbr |
% cat /etc/vz/vznet.conf EXTERNAL_SCRIPT=/usr/local/sbin/vzaddbr |
Ligne 128: | Ligne 119: |
Exemple de script : |
Exemple de script : |
Ligne 132: | Ligne 122: |
% cat /usr/local/bin/vzaddbr | % cat /usr/local/sbin/vzaddbr |
Ligne 142: | Ligne 132: |
Enfin, dernière étape, configurer une interface Ethernet virtuelle sur chaque machine : | |
Ligne 143: | Ligne 134: |
Enfin, dernière étape, configurer une interface ethernet virtuelle sur chaque machine : | {{{vzctl set 211 --netif_add "eth0,00:E1:00:00:21:1A,veth211.1,00:E1:00:00:21:1B" --save}}} |
Ligne 145: | Ligne 136: |
{{{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 : |
Ligne 147: | Ligne 138: |
Choix des adresses mac : | |
Ligne 149: | Ligne 139: |
* à 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. |
* à Dakar, j'utilise pour les deux derniers octets le numéro 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 légèrement 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. |
Ligne 152: | Ligne 142: |
Enfin (ENFIN), côté machine virtuelle : rien de particulier, configurer l'interface eth0 comme si de rien n'était : | Enfin (ENFIN), côté machine virtuelle : rien de particulier, configurer l'interface eth0 comme si de rien n'était : |
Ligne 154: | Ligne 145: |
# cat /var/lib/vz/root/211/etc/network/interfaces | # cat /var/lib/vz/private/211/etc/network/interfaces |
Ligne 160: | Ligne 151: |
address 172.18.1.211 netmask 255.255.255.0 |
address 172.18.1.211 netmask 255.255.255.0 |
Ligne 163: | Ligne 154: |
Ligne 167: | Ligne 157: |
CatégorieVirtualisation | . CatégorieVirtualisation |
Ce document présente quelques possibilités d'organisation réseau pour des serveurs virtuels OpenVZ sur un serveur Debian.
Sommaire
|
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 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 quelque chose 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éfère 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 hébergés dessus.
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 première étape.
% cat /etc/vz/vznet.conf EXTERNAL_SCRIPT=/usr/local/sbin/vzaddbr
Exemple de script :
% cat /usr/local/sbin/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 "eth0,00:E1:00:00:21:1A,veth211.1,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 octets le numéro 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 légèrement 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/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 de rien n'était.