Xen sur Linux Debian 6 Squeeze

From Wikichris
Jump to: navigation, search

L'objectif de cette page est de décrire pas à pas l'installation de Xen (Serveur de Virtualisation) sur un serveur Debian 6 (Squeeze) vierge.

L'IPv6 est à présent incontournable, je la prend en compte tout au long de l'installation.


Avant de commencer

J'ai réalisé toutes ces étapes sur un serveur Kimsufi d'OVH à 14.99€ par mois. Après bien des incompatibilités, j'ai dû me résigner à abandonner l'idée sur Debibox v3 puisque l'équipe Xen ne supporte et ne teste pas sur processeur Via Nano.

Lors d'une installation en sept 2011 les 3 IP Failover nécessaires à cette installation n'étaient plus disponibles gratuitement. Il m'a fallu acheter des IP Failover RIPE, cf le paragraphe troubleshooting à la fin de cette page

Vos retours sont appréciés, n'hésitez pas à lancer ou participer à la page discussion.


Le cas traité ici convient théoriquement à une distribution Linux installée chez soi, avec une Freebox dont l'IPv6 aura été activée.

L'IPv6 fonctionnerait en tout point pareil (avec le proxy IPv6). Des adaptations seraient nécessaires pour l'IPv4.

Je ne peux pas tester moi-même, vos témoignages seraient appréciés concernant la configuration IPv4 : Discussion.


Peut-être ne le savez-vous pas, mais Xen utilise LVM comme système de fichiers, une couche virtuelle qui se place sur ext3 et permet des manipulations de partitions dont on a jamais osé rêver.

Par exemple, c'est grâve à LVM que nous pourrons créer des Snapshots à des moments précis de la vie du serveur afin de pouvoir revenir en arrière si besoin.


Choix de l'installation

Info : si vous commandez un serveur dédié OVH pour l'occasion, la première installation ne propose pas de partition personnalisée. Il faudra donc retourner dans le manager d'OVH pour lancer une réinstallation

  • Choisir une Debian 6 Squeeze 64bits.
  • (Je choisi l'installation anglaise pour avoir les messages d'erreurs en anglais. Les forums anglophones étant majoritaires)
  • Partitionnement personnalisé :
    1: Partition Principale, ext4, point de montage /, 3000 Mo
    2: Partition Principale, swap, 512 Mo
    On formatera l'espace restant en ligne de commande avec LVM par la suite.

Configuration préliminaire

Tout d'abords, sécuriser l'accés à votre serveur étant une affaire de goût personnel, je le traite séparément sur cette page. Vous pouvez réaliser ces étapes maintenant

Je ne traiterai ici que l'incontournable firewall avec iptables et ip6tables, mais à la fin de la doc pour éviter de vous embrouiller l'esprit.

Routage

Pour activer le routage IPv4 et IPv6 il faut ajouter dans le fichier /etc/sysctl.conf :

net.ipv4.ip_forward=1
net.ipv4.conf.all.proxy_arp=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1

Appliquer les modif :

sysctl -p

IPv6

Puisque nous avons activé le routage IPv6, l'autoconfiguration Stateless d'IPv6 ne fonctionnera plus. Les 3 lignes habituelles sous Debian ne sont donc plus suffisantes.

Dans le fichier /etc/network/interfaces il faut indiquer les routes à présent :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
	address 91.121.12.187
	netmask 255.255.255.0
	network 91.121.12.0
	broadcast 91.121.12.255
	gateway 91.121.12.254

iface eth0 inet6 static
	address 2001:DB8:1:52bb::1
	netmask 56
	post-up /sbin/ip -f inet6 route add 2001:DB8:1:52FF:FF:FF:FF:FF dev eth0
	post-up /sbin/ip -f inet6 route add default via 2001:DB8:1:52FF:FF:FF:FF:FF
	pre-down /sbin/ip -f inet6 route del default via 2001:DB8:1:52FF:FF:FF:FF:FF
	pre-down /sbin/ip -f inet6 route del 2001:DB8:1:52FF:FF:FF:FF:FF dev eth0

Notez que le Netmask est 56 et non plus 64.
Vous l’avez peut-être compris avec cette exemple, les serveurs OVH sont sur un netmask /56 et sa gateway est basée sur l’ipv6 de votre host où vous remplacez les derniers octets ainsi:

aaaa:bbbb:cccc:ddFF:FF:FF:FF:FF

Cela me perturbait d’écrire /56 au netmask, mais OVH est formel sur cette page : http://guides.ovh.com/Ipv4Ipv6

Après un bon deprecated

/etc/init.d/networking restart 

il est temps de tester votre ipv6 :

ping6 ipv6.google.com

Xen

Installation

A l'heure où j'écris ces lignes, le noyau disponible pour Squeeze est le 2.6.32. Vous devriez lancer la commande suivante pour voir lequel vous pouvez installer

apt-cache search xen-linux-system 

Donc nous lançons l'installation de Xen et ses outils :

apt-get install xen-hypervisor xen-linux-system-2.6.32-5-xen-amd64 xen-utils xen-tools

NB: au premier démarrage de mon serveur j'ai lancé un apt-get update / apt-get upgrade. Grub s'est mis à jour et m'a demandé où l'installer, j'ai choisi le disque physique /dev/sda (Premier choix).

Il a crée un nouveau noyau, mais comme vous utilisez Grub 2 il faut maintenant changer à la main l'ordre de priorité des noyaux au boot :

mv /etc/grub.d/06_OVHkernel /etc/grub.d/08_OVHkernel 
mv /etc/grub.d/20_linux_xen /etc/grub.d/06_linux_xen 

Le noyau Xen se retrouve en première position (par ordre alphabétique), ce sera donc lui qui sera utilisé au démarrage.

Il faut mettre à jour Grub2 avec la nouvelle config :

update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-5-xen-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-xen-amd64

Avant de redémarrer, on utilise fdisk pour créer un /dev/sda3 qui prendra tout l'espace restant. LVM

fdisk /dev/sda

p devrait vous montrer ceci :

Command (m for help): p

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00030411

Device Boot Start End Blocks Id System
/dev/sda1 * 1 383 3070976+ 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 383 448 523264 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.

Choisi alors :

  • "n" pour ajouter une nouvelle partition
  • "p" pour principale
  • "3" pour troisième
  • garder les valeurs par défaut qui devraient recouvrir tout l'espace libre
Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (448-30401, default 448): 
Using default value 448
Last cylinder, +cylinders or +size{K,M,G} (448-30401, default 30401): 
Using default value 30401

  • "w" pour sauver les changements

Et si vous voulez un RAID Logiciel fournie par OVH, suivez la même procédure avec sdb

fdisk /dev/sdb

Puis créez l'ensemble RAID après un reboot

reboot
# mdadm -Cv /dev/md2 -l1 -n2 /dev/sdb3 /dev/sda3
mdadm: /dev/sdb3 appears to be part of a raid array:
   level=raid1 devices=2 ctime=Fri Nov  9 23:01:44 2012
mdadm: Note: this array has metadata at the start and
   may not be suitable as a boot device.  If you plan to
   store '/boot' on this device please ensure that
   your boot-loader understands md/v1.x metadata, or use
   --metadata=0.90
mdadm: /dev/sda3 appears to be part of a raid array:
   level=raid1 devices=2 ctime=Fri Nov  9 23:01:44 2012
mdadm: size set to 973162584K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

NB: Mon raid a été construit par OVH, et j'ai automatiquement la dernière ligne de /etc/mdadm/mdadm.conf

ARRAY /dev/md3 level=raid1 num-devices=2 UUID=bf366d65:1970c7de:a4d2adc2:26fd5302

En suite reprenons, vérifier que vous utilisez à présent le noyau Xen :

#uname -a
Linux wiki.gonzofamily.com 2.6.32-5-xen-amd64 #1 SMP Wed Jan 12 05:46:49 UTC 2011 x86_64 GNU/Linux

Les 2 commandes suivantes permettront à LVM d'occuper tout l'espace restant sur le disque virtuel /dev/vg00 :

pvcreate /dev/sda3 #pvcreate /dev/md3 (pour un raid)
vgcreate vg00 /dev/sda3 #vgcreate vg00 /dev/md3 (pour un raid)

Si vous rencontrez l'erreur suivante, c'est les restes d'une installation précédente ayant survécu au format de votre machine :

pvcreate /dev/sda3
Can't initialize physical volume "/dev/sda3" of volume group "vg00" without -ff

Vous pouvez alors supprimer le vg00 précédent pour le recréer vierge

vgremove vg00
Do you really want to remove volume group "vg00" containing 4 logical volumes? [y/n]: y
Do you really want to remove active logical volume test1-swap? [y/n]: y
Logical volume "test1-swap" successfully removed
Do you really want to remove active logical volume test1-disk? [y/n]: y
Logical volume "test1-disk" successfully removed
Do you really want to remove active logical volume test2-swap? [y/n]: y
Logical volume "test2-swap" successfully removed
Do you really want to remove active logical volume test2-disk? [y/n]: y
Logical volume "test2-disk" successfully removed
Volume group "vg00" successfully removed

Puis le recréer:

vgcreate vg00 /dev/sda3

Réseau

Général

Avec Xen on peut choisir entre 3 mode : Bridge, Route, Nat

  • Bridge: Iimpossible chez la plupart des hébergeurs comme OVH en raison du filtrage des adresses MAC
  • NAT: Je compte modifier cette doc pour prendre en compte le mode NAT dès que je l'aurais suffisamment testé
  • ROUTE : afin de profiter des 3 IP failover proposées chez OVH on utilisera ce mode. NB: IP Failover RIPE en option depuis 2011


Nous pourrons avoir jusqu'à 3 serveurs virtuels avec IPv4 publiques, les autres devront se contenter de NAT (non encore documenté ici).

Nous pouvons avoir autant d'IPv6 que de machines virtuelles. Cela tombe bien, c'est l'avenir.


Modifier le fichier /etc/xen/xend-config.sxp concernant ces 3 lignes :

#(vif-script vif-bridge)
(network-script network-route)
(vif-script vif-route)

Vous pouvez maintenant redémarrer Xen

/etc/init.d/xend restart

Actuellement, je rencontre les erreurs non bloquantes suivantes, tout fonctionne car le proxy arp n'est pas nécessaire dans le cas des ip Failover :

/etc/xen/scripts/network-route: line xx: /proc/sys/net/ipv4/conf/eth/proxy_arp: No such file or directory
/etc/xen/scripts/network-route: line xx: /etc/xen/scripts/hotplugpath.sh: No such file or directory

IPv6

Les scripts des Xen ignorent complètement l'IPv6, il faut donc faire de petites modifications, il y a plusieurs possibilités sur le net, j'ai choisi celle-ci : http://sebastian.marsching.com/wiki/Network/IPv6

J'ai du l'améliorer pour l'adapter au cas OVH, notre serveur doit être Proxy NDP pour chaque adresse ipv6

Créons notre propres scripts VIF (ils sont lancés à chaque démarrage d'une machine virtuelle)

/etc/xen/scripts/vif-route-ipv6

#============================================================================
# /etc/xen/scripts/vif-route-ipv6
#
# Script for adding an IPv6 address to a routed Xen VM.
# This script is called by modified version of /etc/xen/script/vif-route.
#
# Usage:
# vif-route-ipv6 (online|offline)
#
# Environment vars:
# vif         vif interface name (required).
# XENBUS_PATH path to this device's details in the XenStore (required).
#             This path is used to extract the VM's UUID.
#
# Read from the store:
# domain      name of Xen domU
#============================================================================

command=$1 

# Read name of domU from Xen Store
domu_name=`xenstore-read ${XENBUS_PATH}/domain` 

# Read configuration
CONFIG_FILE="/etc/xen/ipv6.cfg"
grepstr="ipv6_gateway_addr\["${domu_name}"\]="
config_line=`grep -i ${grepstr} ${CONFIG_FILE}`
ipv6_gateway_addr=${config_line##*=}
grepstr="ipv6_addr\["${domu_name}"\]="
config_line=`grep -i ${grepstr} ${CONFIG_FILE}`
ipv6_addr=${config_line##*=}

if [ -z ${ipv6_gateway_addr} ] ; then
exit 0
fi

case "$command" in
	online)
	  ip -f inet6 addr add dev ${vif} ${ipv6_gateway_addr}
	  ip -6 neigh add proxy ${ipv6_addr} dev eth0
	  ;;
	offline)
	  ip -f inet6 addr del dev ${vif} ${ipv6_gateway_addr}
	  ip -6 neigh del proxy ${ipv6_addr} dev eth0
	  ;;
esac

Il faut le rendre exécutable:

chmod a+x  /etc/xen/scripts/vif-route-ipv6

Créons le fichier /etc/xen/ipv6.cfg

ipv6_addr[test1]=2001:DB8:1:5fbb:1::2
ipv6_gateway_addr[test1]=2001:DB8:1:5fbb:1::1/80
ipv6_addr[test2]=2001:DB8:1:5fbb:2::2
ipv6_gateway_addr[test2]=2001:DB8:1:5fbb:2::1/80

C'est dans ce fichier qu'on choisi l'adresse du routeur et sous-réseau qui sera attribué à chaque machine virtuelle (dont les noms sont ici test1 et test2).

modifier /etc/xen/scripts/vif-route

--- vif-route.dpkg-dist 2010-01-09 15:34:48.000000000 +0100
+++ vif-route   2010-01-09 15:49:17.000000000 +0100
@@ -31,11 +31,13 @@
    echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
    ipcmd='add'
    cmdprefix=
+        XENBUS_PATH="${XENBUS_PATH}" vif="${vif}" $dir/vif-route-ipv6 online
    ;;
offline)
    do_without_error ifdown ${vif}
    ipcmd='del'
    cmdprefix='do_without_error'
+        XENBUS_PATH="${XENBUS_PATH}" vif="${vif}" $dir/vif-route-ipv6 offline
    ;;
esac

Ce diff vous montre où ajouter 2 lignes commençant par XENBUS.

Création d'une machine virtuelle

on lance ceci pour créer une nouvelle image

IP=IPv4_FAILOVER
GW=IPv4_KIMSUFI_PRINCIPALE
NAME=test1
xen-create-image --hostname=$NAME --ip=$IP --gateway=$GW --netmask=255.255.255.255 --lvm=vg00

IPv4_FAILOVER: l'une des ip Failover dont vous avez fait la demande sur le Manager OVH

IPv4_KIMSUFI_PRINCIPALE: l'adresse IP principale de votre serveur Kimsufi


NB: notez le password qui a été généré pour root

Installation Summary
---------------------
Hostname        :  test1
Distribution    :  squeeze
IP-Address(es)  :  178.33.245.91 
RSA Fingerprint :  bf:8b:74:83:77:be:ef:33:3d:ee:c6:7b:e3:61:65:56
Root Password   :  aehS4ESv


Il faut modifier la config le réseau de la nouvelle machine pour y ajouter les routes :

mount /dev/vg00/$NAME-disk /mnt
vi /mnt/etc/network/interfaces
auto eth0
iface eth0 inet static 
	address 178.33.245.91
	netmask 255.255.255.255
	post-up /sbin/route add -net 91.121.12.87 netmask 255.255.255.255 eth0
	post-up /sbin/route add default gw 91.121.12.87

iface eth0 inet6 static
	address 2001:db8:1:5fbb:1::2
	netmask 80
	up route -A inet6 add default gw 2001:db8:1:5fbb:1::1
	down route -A inet6 del default gw 2001:db8:1:5fbb:1::1

NB: notez bien que j'ai retiré la ligne

gateway 91.121.12.87
umount /mnt


et on peut booter la nouvelle machine, et se connecter dessus :

xm create /etc/xen/$NAME.cfg
xm console $NAME

Firewall

Revenons au serveur DOM0 et laissons de coté la machine virtuelle test1. Il faut maintenant penser à configurer le firewall.

Sortons de la machine virtuelle, pour mon clavier US c'est la commande suivante :

CTRL + ]

Si un possesseur de clavier AZERTY peut tester, je crois qu'il est possible que ce soit CTRL + $ sur un azerty


Créons un dossier /etc/iptables.rules qui contiendra vos règles de filtrage ipv4 et ipv6

mkdir /etc/iptables.rules

Créons /etc/iptables.rules/ipv4.rules avec le contenu suivant :

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:in-new - [0:0]

#Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

#Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# packets that are out-of-sequence are silently dropped
-A INPUT -m state --state INVALID -j DROP
#new connections unknown to the kernel are handled in a separate chain
-A INPUT -m state --state NEW -j in-new
#pass SYN packets for SSH
-A in-new -p tcp -m tcp --dport 22 --syn -j ACCEPT

#Allows all outbound traffic
#You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
#-A in-new -p tcp --dport 80 -j ACCEPT
#-A in-new -p tcp --dport 443 -j ACCEPT

#Allow all ICMP traffic
-A INPUT -p icmp -j ACCEPT

#log and reject everything else
#-A INPUT -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[INPUT6]: "
-A INPUT -j REJECT

#log iptables denied calls (access via 'dmesg' command)
#-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#Allow forward each host will have to filter itself
-A FORWARD -j ACCEPT

COMMIT


Créons /etc/iptables.rules/ipv6.rules avec le contenu suivant :

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:in-new - [0:0]

#Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d ::1/128 -j REJECT

#Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# packets that are out-of-sequence are silently dropped
-A INPUT -m state --state INVALID -j DROP
#new connections unknown to the kernel are handled in a separate chain
-A INPUT -m state --state NEW -j in-new
#pass SYN packets for SSH
-A in-new -p tcp -m tcp --dport 22 --syn -j ACCEPT 

#Allows all outbound traffic
#You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
#-A in-new -p tcp --dport 80 -j ACCEPT
#-A in-new -p tcp --dport 443 -j ACCEPT

#Allow all ICMPv6 traffic
-A INPUT -p icmpv6 -j ACCEPT

#log and reject everything else
#-A INPUT -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[INPUT6]: "
-A INPUT -j REJECT

#log iptables denied calls (access via 'dmesg' command)
#-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#Allow forward each host will have to filter itself
-A FORWARD -j ACCEPT

COMMIT

Avant de configurer le système pour appliquer ces filtres à chaque démarrage, il est important de vérifier s'ils sont corrects avec la commande iptables-restore, ainsi si nous perdons la main sur notre serveur, il suffit de redémarrer grace au Manager d'OVH qui propose un hard reboot :

iptables-restore /etc/iptables.rules/ipv4.rules
ip6tables-restore /etc/iptables.rules/ipv6.rules

Une fois les règles testées par vos soins (le plus important: vous pouvez toujours lancer une nouvelle connexion SSH vers votre serveur), vous pouvez indiquer au Système de les lancer à chaque démarrage en créant le fichier suivant :

/etc/network/if-pre-up.d/iptables :

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.rules/ipv4.rules
/sbin/ip6tables-restore < /etc/iptables.rules/ipv6.rules

Penser à rendre ce script exécutable :

chmod a+x /etc/network/if-pre-up.d/iptables

Usage

Une autre page sur ce Wiki aborde l'usage de Xen : Utilisation de Xen

Troubleshooting

Premier essais sur Dedibox

Mes premiers essais pour ce document ont été sur Dedibox v3, voyant que le proccesseur VIA Nano était bien prometteur.

j'ai du me résoudre à revenir comme toujours chez OVH, on ne peut pas utiliser utiliser Xen 4 car il est incompatible avec le processeur Via Nano qui équipe les Dedibox v3.

L'équipe Zen dit ne pas tester ou supporter VIA et propose des solutions officieuses. Il faut utiliser les version 3 mais elles ne sont plus disponibles dans les derniers package Debian.

OVH propose des processeurs Intel exclusivement. Tout est passé comme une lettre à la poste.

Forward IPv6 sur serveur dédié

Lors de la mise en place, je ne parviennais pas à router le traffic IPv6

Un "tcpdump icmp6" voyait les ping6 passer test1 > ipv6.google.com mais ne recevant jamais de réponse.

C'est parce que mon prefix est géré par le routeur OVH qui ne forward pas vers mon serveur Kimsufi. Cela revient à dire que mes packets vont sur internet mais ne retrouvent jamais le chemin du retour.


La solution consiste à activer le Proxy NDP sur notre routeur (DOM0) puis à déclarer chaque adresse pour laquelle il devait jouer son role de proxy

Ajouter la ligne suivante dans /etc/sysctl.conf

net.ipv6.conf.all.proxy_ndp = 1

Lancer la commande suivante :

ip -6 neigh add proxy 2001:db8:1:5fbb:1::2 dev eth0

Et voilà, vos machines sont accessibles en IPv6 natives depuis l'extérieur car DOM0 peut enfin router son IP.


C'est en ce sens que j'ai modifié l'excellent travail de http://sebastian.marsching.com/wiki/Network/IPv6

IP Failover RIPE fail

Lors de mon installation d'un second serveur en septembre 2011, les 3 IP Failover n'étaient plus proposées, j'ai du prendre l'option pour avoir des IP Failover RIPE.


Outre le coût supplémentaire, le principal soucis est que les DNS d'OVH ne répondent pas à ces adresses IP ci. J'ai donc installé dnsmasq sur le serveur DOM0

dpkg -r bind9
apt-get install dnsmasq

Et j'ai autorisé le port DNS sur le firewall pour les marchines virtuelles

dans /etc/iptables.rules/ipv4.rules

#Allows DNS requests from Virtual Machines
-A in-new -p udp --dport 53 -s 176.31.01.01/29 -j ACCEPT

dans /etc/iptables.rules/ipv6.rules

#Allows DNS requests from Virtual Machines
-A in-new -p udp --dport 53 -s 2001:db8:1:5fbb::/64 -j ACCEPT