Outils pour utilisateurs

Outils du site


dedibox

Ceci est une ancienne révision du document !


Dedibox et Xen

:!: TUTO A SUIVRE A VOS RISQUES ET PERILS !!!

Introduc

Le but, est d'installer un environnement Xen/Debian sur une Dédibox.

Les problèmes:

  • On n'a qu'1 IP en sortie
  • On a pas totalement le controle des partitions
:!: A priori, on peut tout changer sur la Dedibox, mais on y perdrait la garantie si on a le malheur de taper dans le BIOS … LOL

On va essayer de ne pas trop casser les machins de monitoring installé par Dédibox.

Pré-requis

Accès DRAC : parce que les risques de perdre le contrôle du serveur sont loin d'être nuls.

Matériel

  • Dedibox DC
  • Dell® PowerEdge R210
  • 1x Intel® Core® i3 530
  • 2x 2.93GHz, 64 Bits, Virtualisation
  • 4 Go DDR3 ECC
  • 2 x 1 To SATA2 Raid 0 / Raid 1 HARD

Configuration

system

Debian Squeeze 64 bits

partitions

/boot ext3 500MB
swap swap 1024MB (1GB)
/ ext3 20480MB (20GB)
<unused>

Il est *important* d'avoir 1 partition de libre. On va créer une partition LVM2 plus tard…

1er boot

D'abord, finir l'installation de la Dedibox

apt

Dans /etc/apt/source.list , complété en ajoutant:

# remplace "volatile":  
deb http://ftp.fr.debian.org/debian/ squeeze-updates main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ squeeze-updates main contrib non-free

et ensuite:

# aptitude update
# aptitude full-upgrade

et si le noyau a été modifié (ce qui est fort probable):

# reboot

sysctl.conf

Dans /etc/sysctl.conf , ajouter:

# En cas de crash noyau
kernel.panic=300

Appliquer changement:

# sysctl -p

ou, si vous avez fait les modifs dans un autre fichier:

# sysctl -p /etc/sysctl.d/local.conf

Ipv6

A quoi ça sert ? a rien. donc je vire.

Ajouter dans /etc/sysctl.conf (ou dans un sous fichier):

# désactivation du support pour les interfaces actuelles
net.ipv6.conf.all.disable_ipv6 = 1
# désactivation du support de l’autoconfiguration
net.ipv6.conf.all.autoconf = 0
# désactivation du support par défaut pour les nouvelles interfaces
net.ipv6.conf.default.disable_ipv6 = 1
# et de l'autoconfiguration 
net.ipv6.conf.default.autoconf = 0

Appliquer par:

# sysctl -p <nom_du_fichier_eventuelle_ou_est_la_conf>

Pour ssh. Editer /etc/ssh/sshd_config et décommenter la ligne:

ListenAddress 0.0.0.0

Redemarrer les services residuels, afin qu'ils “oublient” ipv6.

Voila.

Dummy Interface

Lien: http://linax.wordpress.com/2009/09/12/linux-dummy-network-device/

Sous Debian, il faut une interface reseau bridgé pour que Xen puisse ensuite la partagé aux machines virtuelles:

bridge

# aptitude install bridge-utils

ARP leak

Faire en sorte que l'interface reseau qu'on va rajouter ne reponde pas aux requetes ARP qui ne la concerne pas !

Ajouter dans /etc/sysctl.conf (ou un fichier dans ../sysctl.d/) :

# Les requetes ARP ne traversent pas
net.ipv4.conf.all.arp_ignore=1

dummy0

Donc, on installe la “dummy interface” : une fausse interface reseau pour le bien de tous :-)

Charger le pilote:

# modprobe dummy

Voila, une interface “dummy0”, non configuré, apparait.

Pour charger le pilote a chaque boot, ajouter dans /etc/modules :

dummy

Configurer “dummy0”… dans /etc/network/interfaces, ajouter un truc du genre:

auto dummy0
iface dummy0 inet manual

auto brlan
iface brlan inet static
      address 192.168.2.254
      netmask 255.255.255.0
      network 192.168.2.0
      broadcast 192.168.2.255
      bridge_ports dummy0
      bridge_stp off
      bridge_maxwait 0

… où 192.168.2.0/24 est le reseau qu'on va creer. Et notre machine (physique ou Dom0) aura l'IP: 192.168.2.254

Maintenant, on peut monter l'interface:

# ifup dummy0
# ifup brlan

Voila.

LVM2

LVM permet de gérer des partitions de facons trés souples, et offre de puissante fonctions comme le “snapshot” (qui ne sera pas expliqué dans ce tuto)

On a garder une partition libre: on va installer LVM2 dessus.

Pré-requis

Installer LVM2:

# aptitude install lvm2

Partition

Créer la partition de type “LVM”.

# cfdisk /dev/sda

On sort, et a la fin:

# fdisk -l /dev/sda
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          63      506016   83  Linux
/dev/sda2              64         193     1044225   82  Linux swap / Solaris
/dev/sda3             194        2803    20964825   83  Linux
/dev/sda4            2804      121534   953706757+  8e  Linux LVM
:!: pour que la suite fonctionne: il faut rebooter pour que la partition soit vraiment reconnue pour LVM

Volumes LVM

Créer le “Physical Volume” :

# pvcreate /dev/sda4
  Physical volume "/dev/sda4" successfully created

Vérifions:

# pvs
PV         VG   Fmt  Attr PSize PFree
/dev/sda4       lvm2 a-   909,53g 909,53g

Créer un “Volume Group” :

# vgcreate vg0 /dev/sda4
  Volume group "vg0" successfully created

Vérifions:

#vgs
VG   #PV #LV #SN Attr   VSize   VFree
vg0    1   0   0 wz--n- 909,52g 909,52g

Voila. On peut créer des “Volume Logique” dans le “Volume Group” vg0 (qui est sur le Volume Physique /dev/sda4)

Xen4

Installer

Installer Xen 4

# aptitude install xen-linux-system-2.6 xen-qemu-dm xen-tools

“xen-qemu-dm”, c'est pour le cas où souhaité installer des machines totalement virtualiser, comme Windows par exemple.

Vérifier les paquets installés:

# dpkg -l | grep xen
ii  libxenstore3.0                      4.0.1-2                      Xenstore communications library for Xen
ii  linux-image-2.6.32-5-xen-amd64      2.6.32-35                    Linux 2.6.32 for 64-bit PCs, Xen dom0 support
ii  xen-hypervisor-4.0-amd64            4.0.1-2                      The Xen Hypervisor on AMD64
ii  xen-linux-system-2.6-xen-amd64      2.6.32+29                    Xen system with Linux 2.6 for 64-bit PCs (meta-package)
ii  xen-linux-system-2.6.32-5-xen-amd64 2.6.32-35                    Xen system with Linux 2.6.32 on 64-bit PCs (meta-package)
ii  xen-qemu-dm-4.0                     4.0.1-2                      Xen Qemu Device Model virtual machine hardware emulator
ii  xen-tools                           4.2-1                        Tools to manage Xen virtual servers
ii  xen-utils-4.0                       4.0.1-2                      XEN administrative tools
ii  xen-utils-common                    4.0.0-1                      XEN administrative tools - common files
ii  xenstore-utils                      4.0.1-2                      Xenstore utilities for Xen

grub2

Il faut ajuster la configuration , car dans le cas présent, “xen” ne demarrera pas par défaut.

Pour changer l'ordre du menu grub:

# cd /etc/grub.d/
# mv 10_linux 21_linux

Pour ne pas que la conf de grub prennent en charge des images LVM et attribuer quelques resources au Dom0 (et pas trop):

# TJ -------------------
GRUB_DISABLE_OS_PROBER="true"
GRUB_CMDLINE_XEN=""
GRUB_CMDLINE_XEN_DEFAULT="xencons=off dom0_mem=1024M dom0_max_vcpus=1 dom0_vcpus_pin=true"
# ----------------------

Parce qu'on a 4 processeurs… donc on va en réserver 1 pour le Dom0 (ou plutot: garantir 1 proc au Dom0)

# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

A la fin des modifs autour de grub:

# 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
Found linux image: /boot/vmlinuz-2.6.32-5-xen-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-xen-amd64
Found linux image: /boot/vmlinuz-2.6.32-5-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-amd64
done

Un petit coup d'oeil dans /boot/grub/grub.cfg

et reboot !

Aprés reboot:

# xm vcpu-list
Name                                ID  VCPU   CPU State   Time(s) CPU Affinity
Domain-0                             0     0     0   r--       4.8 0

Voila.

Machines virtuelles

xen-tools

Il faut mieux configurer en modifiant le fichier /etc/xen-tools/xen-tools.conf

Parcourir ce fichier et l'adapter a vos choix. Par exemple:

# egrep -v "^($|#)" xen-tools.conf 
lvm = vg0
install-method = debootstrap
size   = 10Gb      # Disk image size.
memory = 512Mb    # Memory size
swap   = 512Mb    # Swap size
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = `xt-guess-suite-and-mirror --suite` # Default distribution to install.
image  = full     # Specify sparse vs. full disk images.
dhcp = 1
bridge = brlan
genpass = 0
hash_method = sha512
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
arch = amd64
mirror = `xt-guess-suite-and-mirror --mirror`
ext3_options     = noatime,nodiratime,errors=remount-ro
ext2_options     = noatime,nodiratime,errors=remount-ro
xfs_options      = defaults
reiserfs_options = defaults
btrfs_options    = defaults
serial_device = hvc0 #default
disk_device = xvda #default

Notes:

  • dhcp = 1 : on s'en fout, pour ma part, je change l'IP du DomU avant son premier demarrage
  • hash_method = sha512 : Hé! On est en 2011 ! MD5 est *obsolete*

DomU

Création d'une machine virtuelle (Dom0)

Par exemple: un petit DomU pour un serveur http.

# xen-create-image --hostname www --role udev --size 20G --memory 512M --swap 1G

(Y a un petit warning sur le bridge, mais on s'en fout!)

...
General Information
--------------------
Hostname       :  www
Distribution   :  squeeze
Mirror         :  http://ftp.fr.debian.org/debian/
Partitions     :  swap            1G    (swap)
                  /               20G   (ext3)
Image type     :  full
Memory size    :  512M
Kernel path    :  /boot/vmlinuz-2.6.32-5-xen-amd64
Initrd path    :  /boot/initrd.img-2.6.32-5-xen-amd64
...

A la fin, on a un petit fichier de conf dans /etc/xen/ portant le nom: www.cfg

Et on a 2 nouveaux volumes dans LVM.

On change la conf de www.cfg afin de commenter la ligne:

#dhcp        = 'dhcp'
:!: Il y a d'autres choses a faire pour certaines distrib, comme Etch ou Lenny: nous, on est sous Squeeze
# lvs
  LV       VG   Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  www-disk vg0  -wi-a- 20,00g                                      
  www-swap vg0  -wi-a-  1,00g                            

Ok.

Apporter quelques corrections sur la partition… on la monte:

# mkdir /mnt/domu
# mount /dev/vg0/www-disk /mnt/domu

On modifie le fichier /mnt/domu/etc/network/interfaces afin de donner une IP dans le pool de l'interface dummy0. Exemple:

...
auto eth0
iface eth0 inet static
      address 192.168.2.1
      netmask 255.255.255.0
      gateway 192.168.2.254
...

… sans oublier de commenter ce qui fait référence au “dhcp”.

NOTA: pas compris ça: post-up ethtool -K eth0 tx off donc je vire.

Virer le mot de passe de root , en virant le “*” (2ieme champ) de la ligne “root” dans le fichier:
/mnt/domu/etc/shadow

Grrrrrr…

On démonte le volume:

# umount /mnt/domu

Maintenant, tadada! on va démarrer le DomU en console !

Pourquoi ? Parce que root n'a pas de mot de passe ! LOL

C'est parti:

# cd /etc/xen
# xen create www.cfg -c

C'est le “-c” a la fin qui dit: “on passe en console aussitot le DomU créé”.

.........................
Debian GNU/Linux 6.0 www hvc0

www login: 

Taper: root

On se connecte sans mot de passe: on se précipite pour en coller un!

Ctrl + AltGr + ] pour quitter

Corriger quelques trucs:
/etc/resolv.conf

#nameserver 127.0.0.1
nameserver 88.191.254.60
nameserver 88.191.254.70

(Parce qu'il n'y a pas de DNS dans ce DomU !)

# adduser thierry
...
# adduser thierry adm
# adduser thierry staff

On devrait pouvoir ce connecter sur ssh, du Dom0 au DomU.

Du Dom0 vers le DomU www:

# ping 192.168.2.1 -c 1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_req=1 ttl=64 time=0.057 ms

Du DomU www:

# ping 192.168.2.254 -c 1
PING 192.168.2.254 (192.168.2.254) 56(84) bytes of data.
64 bytes from 192.168.2.254: icmp_req=1 ttl=64 time=0.070 ms

… mais il n'est pas encore possible d'atteindre le NET, pour le(s) DomU(s) !

On peut quitter le DomU.

On le voit qui tourne sur le Dom0… c'est beau… ;-)

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1020     1     r-----     88.3
www                                          2   512     1     -b----      1.8
# xm vcpu-list
Name                                ID  VCPU   CPU State   Time(s) CPU Affinity
Domain-0                             0     0     0   r--      88.5 0
www                                  2     0     3   -b-       1.8 any cpu

Reseaux

Maintenant, il faut que les DomU puissent atteindre Internet, et aussi l'inverse, ce pourrait être interessant (surtout pour un serveur http!)

On a besoin de configurer un “forward” de port , puis un “nat” pour permettre aux machines virtuelles de voir le reseau.

On va utiliser “ferm” pour configurer “iptables”.

ATTENTION

ferm et iptables sont de puissant outils !

Je décris rapidement la mise en place, mais il faut avoir conscience qu'une fois les règles Iptables en place, il y aura un “suivi des connexions” ( tracking ) qui peut:

  1. Charger le CPU (si vous avez des milliers de connexion a “suivre”)
  2. Empecher certains services de fonctionner: comme FTP, PPTP, RTP, etc…

On peut largement optimiser la configuration (par exemple, pour ne pas “suivre” les connexions locales).

Il existe des modules a charger pour que des services fonctionnent.

Ici, on ne verra que des cas simples de services simples.

pre-requis

Faire en sorte que Xen n'utilise pas iptables !!

Bah ouai: parce que par défaut, Xen ajoute des règles inutiles (si j'ai bien compris).

Donc:

  • Arreter tout les DomU ( xm shutdown xxx )
  • Editer le fichier /etc/xen/scripts/vif-bridge et commenter la ligne # handle_iptables

Voila.

ferm

ATTENTION : ca va couper toutes les connexions, sauf ssh. Ouf.

Dans la foulée, on va mettre une conf minimale plus cool.

D'abord, monté le module ip_tables (parce qu'il y a(vait) un bug dans ferm).

# modprobe ip_tables

Et puis on y va:

# aptitude install ferm

Repondre “Yes” pour demarrer Ferm immédiatement et/ou au boot.

Voila.

regle simple

On va trés simplement d'abord créé des règles de base pour protéger son serveur.

Dans /etc/ferm , sauvergarder la conf actuelle (qui vient de l'installation du package):

# mv {,dpkg-}ferm.conf

puis créer un nouveau fichier ferm.conf en mettant:

# ------------------------------------
# Regles iptables avec Ferm
# ------------------------------------

@def $WAN_IF = eth0;
@def $WAN_IP = <IP_SUR_L'INTERFACE_eth0>;   # Exemple: 88.181.12.34;

chain ( INPUT OUTPUT FORWARD ) policy DROP;

# ---------------------
# Local
# ---------------------
chain INPUT if lo ACCEPT;
chain OUTPUT of lo ACCEPT;

# ---------------------
# WAN 
# ---------------------

chain INPUT if $WAN_IF daddr $WAN_IP {
  mod state state NEW {
    proto tcp dport ssh ACCEPT;                                                 # SSH OK
    proto icmp icmp-type echo-request mod limit limit 10/s ACCEPT;              # PING OK
    proto tcp dport auth mod limit limit 10/s REJECT reject-with tcp-reset;     # reject auth
  }
  mod state state ( ESTABLISHED RELATED ) ACCEPT;
}

# Et a la fin
chain OUTPUT of $WAN_IF saddr $WAN_IP mod state state ( NEW ESTABLISHED RELATED ) ACCEPT;

# -----
# EOF
:!: mettre l'IP de votre interface réseau $WAN_IP

Ceci fait:

# ferm -i ferm.conf

Si vous pouvez taper “Yes”, alors ça marche. Votre serveur est protégé (un peu).

Il n'y a que SSH , le ping et le port “auth” qui sont disponible pour le reste du Monde.

:!: On n'a pas encore de règles pour le reseau local, donc: ca marche plus pour les machines virtuelles!

activer forward

Maintenant qu'on un firewall en place, on peut se permettre d'activer le “forward” entre interface.

Par exemple:

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/local.conf

Appliquer maintenant (a moins que vous préfériez rebooter!) :

# sysctl -p /etc/sysctl.d/local.conf

Voila.

Régle pour le LAN

On va autoriser le LAN a être visible du Dom0 et réciproquement.

Il suffit d'ajouter dans le fichier ferm.conf :

# ---------------------
# LAN
# ---------------------

@def $LAN_IF = brlan;
@def $LAN_IP = 192.168.2.254;
@def $LAN_NETWORK = 192.168.2.0/24;

chain INPUT if $LAN_IF mod state state ( NEW ESTABLISHED RELATED ) ACCEPT;
chain OUTPUT of $LAN_IF mod state state ( NEW ESTABLISHED RELATED ) ACCEPT;

Il n'y a de régles restrictives (sauf d'ignorer l'etat “INVALID”).

et d'appliquer cette nouvelle conf:

# ferm ferm.conf

Et ca marche dans les 2 sens.

Mais les machines virtuelles ne peuvent toujours pas atteindre Internet !

NAT simple

Pour que les machines virtuelles puissent atteindre l'Internet Mondial, ajouter cela:

# Declaration de classes locales

@def $PRIVATE_NETWORK = ( 
  10.0.0.0/8 
  192.168.0.0/16 
  172.16.0.0/12 
  169.254.0.0/16
);

# Le reseau local vers le WAN

chain FORWARD if $LAN_IF of $WAN_IF saddr $LAN_NETWORK {
  daddr $PRIVATE_NETWORK DROP;
  mod state state ( NEW ESTABLISHED RELATED ) ACCEPT;
}

# Autoriser les forward autorises (par le NAT)
chain FORWARD if $WAN_IF of $LAN_IF daddr $LAN_NETWORK mod state state ( ESTABLISHED RELATED ) ACCEPT; 

# ---------------------
# POSTROUTING LAN->WAN
# ---------------------
table nat chain POSTROUTING of $WAN_IF saddr $LAN_NETWORK SNAT to $WAN_IP;

On prend garde de ne pas polluer le reseau avec des classes appartenant aux “PRIVATE_NETWORK”.

On n'utilise pas “MASQUERADE” en optimisant, puisqu'on connait déjà notre adresse IP publique.

Tips

Dell Open Manage

Liens:

En gros:

# cd /etc/apt/sources.list.d/

Créer un fichier, par exemple dell-om.list avec dedans:

deb http://linux.dell.com/repo/community/deb/latest /

La 1er fois, installer la clé qui va bien pour que “apt” soit en confiance.

# gpg --keyserver pgpkeys.mit.edu --recv-key E74433E25E3D7775
# gpg -a --export E74433E25E3D7775 | apt-key add -
# aptitude update

Soyons fou:

# aptitude install srvadmin-all

La 1er fois, le service demarre a la main:

# service dataeng start

On a un etat de la bête:

/opt/dell/srvadmin/sbin/omreport system summary
System Summary

------------------
Software Profile
------------------
Systems Management
Name                       : Server Administrator
Version                    : 6.5.0
Description                : Systems Management Software

Operating System
Name                       : Linux
Version                    : Kernel 2.6.32-5-xen-amd64 (x86_64)
System Time                : Sun Nov 13 02:14:33 2011
System Bootup Time         : Sun Nov  6 19:37:15 2011

--------
System
--------
System
Host Name                  : warez-1
System Location            : Please set the value
Life Cycle Controller      : Enabled

....
Slot PCIE1
Adapter                    : PERC H200 Adapter
Type                       : PCI E Gen 2
Data Bus Width             : 16x or x16
Speed                      : [Not Obtained, see card documentation]
Slot Length                : Long
Voltage Supply             : 3.3 Volts

BIOS Information
Manufacturer               : Dell Inc.
Version                    : 1.5.2
Release Date               : 10/18/2010

Firmware Information
Name                       : iDRAC6
Version                    : 1.57

Radin sur le matos et paresseux dans les mises à jour :)

Démarrer l'interface web:

# service dsm_om_connsvc start

Et puis go:

# lynx https://localhost:1311/

;)

Rendre le démarrage du web pérenne:

# update-rc.d dsm_om_connsvc defaults

Mais comme ça marche pas bien, modifier l'entete du fichier /etc/init.d/dsm_om_connsvc en corrigeant pour avoir:

# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6

L'interface fonctionne, et LOL:

La version du micrologiciel est obsolète.
Version du micrologiciel	                07.01.33.00
Version de micrologiciel minimale requise	07.02.42.00
dedibox.1322160901.txt.gz · Dernière modification : 2011/11/24 18:55 de thierry