Ceci est une ancienne révision du document !
Table des matières
Dedibox et Xen
|
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
|
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
|
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'
|
# 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
$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.
|
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