Table des matières
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 … |
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
Ou plutôt , editer /etc/default/ssh
et faire en sorte d'ajouter “-4” au démarrage de sshd. Exemple:
SSHD_OPTS="-4"
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
Si vous voulez avoir plus d'interface “dummy”, alors mettre par exemple:
dummy numdummies=3
… pour en avoir 3.
Configurer “dummy0”… dans /etc/network/interfaces
, ajouter un truc du genre:
auto dummy0 iface dummy0 inet manual up ip link set $IFACE address 3a:11:9d:4d:d7:64 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.
je force la MAC parce que “dummy” va créer aléatoirement une nouvelle MAC a chaque redemarrage… et ce n'est pas ce que je veux. Equivalent de up ifconfig $IFACE hw ether 3a:11:9d:4d:d7:64 |
Choisir la MAC que vous voulez, ou laissez “dummy” faire tout seul… |
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 demarragehash_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 !
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:
- Charger le CPU (si vous avez des milliers de connexion a “suivre”)
- 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 :
La version du micrologiciel est obsolète. Version du micrologiciel 07.01.33.00 Version de micrologiciel minimale requise 07.02.42.00
snmp et Nagios
Pour que “check_openmanage” de “Nagios” fonctionne, entre autre, il faut apporter quelques modifs aux services snmpd
…
Modifier le fichier /etc/default/snmpd
pour avoir :
# snmpd options (use syslog, close stdin/out/err). # TJ ------------ #SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid' SNMPDOPTS='-LS5d -Lf /dev/null -u snmp -g snmp -p /var/run/snmpd.pid' # ---------------
Et dans /etc/snmp/snmpd.conf
:
# Snmpd ouvert a tous agentAddress udp:161 # Acces pour nagios rocommunity <MOT_DE_PASSE> <IP_DU_SERVEUR_NAGIOS>
FailOver
J'ai commandé une IP supplémentaire … pas gratuite… OOOOOoooh…
Ceci fait, via la console, on dirige la nouvelle IP vers son serveur.
(Il peut y avoir de longues minutes d'attente entre les differentes étapes…)
Sur le serveur Linux, on ajoute la nouvelle IP juste pour voir:
# ip addr add dev eth0 <IP>/32 label "eth0:1"
(Adapter les règles de FireWall au préalable)
Ok. Ça répond au ping
On nettoie ça en virant ce qu'on vient de tester:
# ip addr del dev eth0 <IP>/32
… et on refait une conf plus classique dans /etc/network/interfaces
.
auto eth0:fo1 iface eth0:fo1 inet static address <IP> netmask 255.255.255.255
“fo1” pour “Fail Over 1” …
Et voila. On a une 2ieme IP.
On peut l'utiliser comme IP public pour divers trucs…