====== 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) | | | | | 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 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 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: -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 = ; # 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: *http://linux.dell.com/repo/community/deb/ 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 === 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 ==== FailOver ==== Lien: http://howto.landure.fr/gnu-linux/debian-4-0-etch/mettre-en-oeuvre-la-solution-ip-failover-proposee-par-la-societe-ovh 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 /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 /32 ... et on refait une conf plus classique dans **''/etc/network/interfaces''** . auto eth0:fo1 iface eth0:fo1 inet static address 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...