Info16.fr

Le blog de B@rtounet

Gnu/Linux

#Gnu/Linux

Migration de mon serveur dédié Dedibox vers un serveur Xen

Je disposais depuis un bon moment d'un serveur Dédibox V2. Ce serveur était vieillissant et très chargé. Il hebergeait mon blog, mon site perso, un serveur de messagerie, un serveur DNS, un serveur Teamspeak, Jabber et j'en oublie surement. J'ai donc décidé de migrer sur un serveur plus puissant et de virtualiser l'ensemble. je me suis tourné vers un serveur Kimsuffi 750G ( 4 Q6600 4x 2.40+ GHz 4 Go et 750Go hdd). Un serveur largement dimensionné pour remplacer ma dédibox mais qui me permettra de faire pas mal de tests et de provisionner plusieurs serveurs virtuels. J'ai donc décidé d'installer un serveur Xen ( Dom0 Opensuse 11.1) et d'éclater mon serveur dédibox en 4 Machines virtuelles paravirtualisées sous Ubuntu Server 9.10 64 bits. J'ai faits ce choix, car j'ai quelques compétences sous Xen et Suse LInux Enterprise mais par contre je préfère administrer des serveurs Ubuntu. Voiçi un court résumé de mon infra Excusez moi pour le schéma j'ai pas trop l'habitude de Dia infraxen Commençons par le début: Sachant que kimsufi ne propose pas par défaut une installation d'OS qui me convenait, j'ai décidé d'installer moi même une Opensuse11.1. Premier problème ovh a fait le choix d'utiliser encore LILO comme gestionnaire d'armocage.. j'ai donc dut très vite réinstaller un grub afin de pouvoir me lancer dans la net install d'opensuse. je ne vais pas réécrire ce que j'ai déjà mis dans ce blog. je vous invite à me relire ici. http://blog.info16.fr/?p=10 Une fois grub installé on peut se lancer dans une net install d'openSuse. Même chose, j'ai déjà écris un article sur la question. http://blog.info16.fr/?p=31 Durant l'installation pas de problème particulier. J'ai opté pour le partitionnement suivant: /boot --> 128 Mo (ext3) / --> 16Go (xfs) swap -->2Go LVM2 pour le reste ( lvm servira a faire des periphériques blocs pour les DomU) (680Go) J'ai installé Xen directement, lors du choix des softwares durant l'install. Je ne m'étend pas trop sur l'installation d'openSuse qui reste sommes toutes assez simple. Une fois l'installation terminée, n'oubliez pas de paramétrer votre grub pour qu'il boot par défaut sous Xen.
# Modified by YaST2. Last modification on Mon Nov 23 09:55:28 CET 2009 default 0 timeout 8 ##YaST - generic_mbr gfxmenu (hd0,0)/message ##YaST - activate ###Don't change this comment - YaST2 identifier: Original name: xen### title Xen -- openSUSE 11.1 - 2.6.27.37-0.1 root (hd0,0) kernel /xen.gz module /vmlinuz-2.6.27.37-0.1-xen root=/dev/disk/by-id/ata-ST3750640AS_5QD16XRN-part2 resume=/dev/disk/by-id/ata-ST3750640AS_5QD16XRN-part3 splash=silent showopts module /initrd-2.6.27.37-0.1-xen ###Don't change this comment - YaST2 identifier: Original name: linux### title openSUSE 11.1 - 2.6.27.37-0.1 root (hd0,0) kernel /vmlinuz-2.6.27.37-0.1-default root=/dev/disk/by-id/ata-ST3750640AS_5QD16XRN-part2 resume=/dev/disk/by-id/ata-ST3750640AS_5QD16XRN-part3 splash=silent showopts initrd /initrd-2.6.27.37-0.1-default ###Don't change this comment - YaST2 identifier: Original name: failsafe### title Failsafe -- openSUSE 11.1 - 2.6.27.37-0.1 root (hd0,0) kernel /vmlinuz-2.6.27.37-0.1-default root=/dev/disk/by-id/ata-ST3750640AS_5QD16XRN-part2 showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe initrd /initrd-2.6.27.37-0.1-default
Une fois rebooté sous Xen il faut commencer par quelques petites modifications. Tous d'abord je souhaite faire du NAT. En effet n'ayant qu'une adresse IP publique sur ma kimsufi, je dois configurer mes domU avec des ip locale et faire du nat pour qu'elles accèdent à l'exterieur. Pour commencer, paramétrons Xen pour faire du Nat. Tout se passe dans le fichier /etc/xen/xend-config.sxp Pour se faire, changeons les éléments suivants.
(network-script network-nat) # If you are using only one bridge, the vif-bridge script will discover that, # so there is no need to specify it explicitly. # (vif-script 'vif-bridge bridge=br0') # enable-dom0-ballooning below) and for xm mem-set when applied to dom0. (dom0-min-mem 512) # Whether to enable auto-ballooning of dom0 to allow domUs to be created. # If enable-dom0-ballooning = no, dom0 will never balloon out. (enable-dom0-ballooning yes) # In SMP system, dom0 will use dom0-cpus # of CPUS # If dom0-cpus = 0, dom0 will take all cpus available (dom0-cpus 0) # set this to 0.0.0.0 (vnc-listen '0.0.0.0') # The default password for VNC console on HVM domain. # Empty string is no authentication. (vncpasswd '')
On peut remarquer que j'utilise le script: {network-script network-nat} Mais par contre j'utilise (vif-script 'vif-bridge bridge=br0') Il faut bien distinguer 2 choses: - network-script est un script lancé par Xen au démarrage du daemon Xen. Donc en mettant network-nat, il va mettre en place les règles nat (ip-forwarding, masquerade etc..) necessaires. -vif-script est le script qui va etre lancé au demarrage des domU. et qui va décider comment va être relié les interfaces réseaux des domU et du Dom0. Pour ma part j'ai décidé de creer un bridge ( switch virtuel) nommé br0 avec une ip en 192.168.1.254/24 et grace vif-bridge, toutes les interface de mes DomU vont s'attacher à ce bridge. Pour creer ce fameux bridge on peut utiliser les fichiers directement dans /etc/sysconfig/network, mais le plus simple reste de passer par yast. yastbr0 On redemarre Xen , on peut vérifier nos deux interfaces réseaux.
linux:~ # ifconfig br0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::3c8b:16ff:fe67:b2b7/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:425920 errors:0 dropped:0 overruns:0 frame:0 TX packets:476880 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:143058546 (136.4 Mb) TX bytes:233932702 (223.0 Mb) eth0 Link encap:Ethernet HWaddr 00:1C:C0:FD:69:A3 inet addr:94.x.x.21 Bcast:94.23.236.255 Mask:255.255.255.0 inet6 addr: fe80::21c:c0ff:fefd:69a3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5211844 errors:0 dropped:0 overruns:0 frame:0 TX packets:9516144 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:568921568 (542.5 Mb) TX bytes:13470776595 (12846.7 Mb) Interrupt:252 Base address:0xc000
Le plus dur reste à faire. préparer notre template de DomU qui nous servira d'image pour toutes nos machines virtuelles. Tout d'abord la première chose à faire est de récupérer les images iso des distributions que nous allons installer. Pour ma part j'ai opté pour Ubuntu server 9.10 x64 et Opensuse11.1 x64 Les isos sont très vite téléchargées puisque nous avons 100Mbits de bande passante entre le serveur et le net. Petit rappel il y a deux types de DomU: Les HVM: Le système va etre totalement émulé et n'est pas conscient d'etre sur un systeme de virtualisation. C'est le plus simple à mettre en place mais le moins performant. La paravirtualisation: La paravirtualisation permet aux moniteurs de machines virtuelles (MMV) d'être plus simples et aux machines virtuelles fonctionnant dessus d'atteindre un niveau de performance proche du matériel réel. Cependant, les systèmes d'exploitations doivent explicitement être portés afin de fonctionner sur des MMV paravirtualisées. (cf wikipedia) autrement dit les domU paravirtualisés sont conscients d'etre virtualisés et sont modifiés pour cela. ( Kernel compilé avec les extensions Xen, et drivers block et réseau ). Ce mode est le plus performant. Pour commencer il faut installer le DomU en HVM. Je commence par creer le périphérique block qui va héberger la VM. J'utilise pour cela la souplesse de lvm2. Mon premier domU sera sur /dev/vg0/lv0 de 16Go
lvcreate -L16G -nlv0 vg0
Je crée un fichier de domU dans /etc/xen/vm
######VM PARAM#### name="wwwinfo16" ostype="linux" memory=512 vcpus=2 cpu_weight=256 cpu_cap=0 hap=1 apic=1 acpi=1 pae=1 stdvga=0 usb=1 usbdevice="tablet" serial="pty" timer_mode=1 localtime=1 extid=0 on_crash="restart" on_reboot="restart" on_poweroff="destroy" ######HVM######### builder="hvm" device_model="/usr/lib64/xen/bin/qemu-dm" kernel="/usr/lib/xen/boot/hvmloader" ######PVM######### #builder="linux" #bootloader = '/usr/lib/xen/boot/domUloader.py' #bootargs = '--entry=hda1:/vmlinuz-xen,/initrd-xen' #extra="root=/dev/hda2 vga=0x31a console=tty0" ######DEV######### vfb=[ 'type=vnc,vncunused=1', ] disk=[ 'phy:/dev/vg0/lv0,hda,w', 'file:/sotck/ubuntu-9.10.iso,hdc:cdrom,r', ] vif=[ 'type=ioemu,mac=00:16:3a:11:11:00', ] boot="c
J'utilise ce fichier très pratique qui me permet de basculer de hvm en para très facilement en commentant la section HVM ou PVM On peut regler aussi facilement le nombre de Vcpus, Memoire, disk etc... On lance alors le domU avec
xm create domU
Si tout se passe bien vous pouvez acceder à l'installation de votre domU directement par vnc. Le premier domU s'attache au port 5900 le deuxieme au 5901 etc... Pour le premier domU je peux y acceder par ippublique:5900 Je ne vais pas détailler l'installation d'un DomU qui est une installation basique. Une fois installé vous pouvez rebooter votre DomU et profiter de votre serveur en HVM. J'ai commencé à paramétrer le réseau de mon domU en lui mettant comme ip 192.168.1.1/24 et la passerelle 192.168.1.254 (br0) et comme DNS, le dns de la kimsuffi.
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.254 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 213.186.33.99
Cette installation en HVM est valable aussi bien pour un DomU OpenSuse que pour Ubuntu. C'est sympa de jouer avec les hvm, mais très vite on se rend compte que les performances ne sont pas au rendez vous. en effet les accès disques et réseau consomment énormément de ressources. Il faut vite passer à la paravirtualisation. Je suis obligé de scinder ce chapitre en 2 parties: DomU paravirtualisés sous OpenSuse DomU paravirtualisés sous Ubuntu/Debian DomU para OpenSuse11.1 Pour que opensuse puisse etre utilisé en tant que DomU para, il faut installer simplement le kernel-xen, kernel-xen-base, kernel-xen-extra. Modifier votre grub pour booter sur le kernel Xen et surtout modifier votre fichier de configuration de la vm kernelxen
######VM PARAM#### name="wwwinfo16" ostype="linux" memory=512 vcpus=2 cpu_weight=256 cpu_cap=0 hap=1 apic=1 acpi=1 pae=1 stdvga=0 usb=1 usbdevice="tablet" serial="pty" timer_mode=1 localtime=1 extid=0 on_crash="restart" on_reboot="restart" on_poweroff="destroy" ######HVM######### #builder="hvm" #device_model="/usr/lib64/xen/bin/qemu-dm" #kernel="/usr/lib/xen/boot/hvmloader" ######PVM######### builder="linux" bootloader = '/usr/lib/xen/boot/domUloader.py' bootargs = '--entry=hda1:/vmlinuz-xen,/initrd-xen' extra="root=/dev/hda2 vga=0x31a console=tty0" ######DEV######### vfb=[ 'type=vnc,vncunused=1', ] disk=[ 'phy:/dev/vg0/lv0,hda,w', ] vif=[ 'type=netfront,mac=00:16:3a:11:11:00', ] boot="c"
On remarque que j'ai commenté cette fois ci les parametre HVM et décommenté PVM. j'ai aussi ajouté netfront comme type de care réseau. Ces lignes sont aussi très importantes: bootargs = '--entry=hda1:/vmlinuz-xen,/initrd-xen' = partition du DomU sur laquelle se trouve votre kernel (/boot) pour moi hda1 extra="root=/dev/hda2 vga=0x31a console=tty0" = partition du DomU sur laquelle se trouve votre / pour moi hda2 Faire bien attention que dans /boot dans le domU les liens symbolique vmlinuz-xen et initrd-xen soit bien créer et pointent bien vers le kernel xen
opensuse11-1:/boot # ls -al total 25820 drwxr-xr-x 3 root root 4096 2009-11-23 13:52 . drwxr-xr-x 20 root root 4096 2009-11-28 00:28 .. -rw------- 1 root root 512 2009-01-06 16:44 backup_mbr lrwxrwxrwx 1 root root 1 2009-01-06 16:14 boot -> . -rw-r--r-- 1 root root 1236 2009-01-08 02:03 boot.readme -rw-r--r-- 1 root root 90278 2009-10-16 18:29 config-2.6.27.37-0.1-default -rw-r--r-- 1 root root 88176 2009-10-16 17:36 config-2.6.27.37-0.1-xen drwxr-xr-x 2 root root 4096 2009-11-23 13:53 grub lrwxrwxrwx 1 root root 28 2009-11-23 13:52 initrd -> initrd-2.6.27.37-0.1-default -rw-r--r-- 1 root root 5626357 2009-11-23 13:52 initrd-2.6.27.37-0.1-default -rw-r--r-- 1 root root 5584838 2009-11-23 13:53 initrd-2.6.27.37-0.1-xen lrwxrwxrwx 1 root root 24 2009-11-23 13:52 initrd-xen -> initrd-2.6.27.37-0.1-xen -rw-r--r-- 1 root root 442880 2009-01-14 15:33 message -rw-r--r-- 1 root root 157239 2009-10-16 18:45 symsets-2.6.27.37-0.1-default.tar.gz -rw-r--r-- 1 root root 162088 2009-10-16 17:38 symsets-2.6.27.37-0.1-xen.tar.gz -rw-r--r-- 1 root root 406110 2009-10-16 18:43 symtypes-2.6.27.37-0.1-default.gz -rw-r--r-- 1 root root 402218 2009-10-16 17:37 symtypes-2.6.27.37-0.1-xen.gz -rw-r--r-- 1 root root 119804 2009-10-16 18:32 symvers-2.6.27.37-0.1-default.gz -rw-r--r-- 1 root root 119842 2009-10-16 17:37 symvers-2.6.27.37-0.1-xen.gz -rw-r--r-- 1 root root 1423318 2009-10-16 18:05 System.map-2.6.27.37-0.1-default -rw-r--r-- 1 root root 1287397 2009-10-16 17:31 System.map-2.6.27.37-0.1-xen -rw-r--r-- 1 root root 3009484 2009-10-16 18:29 vmlinux-2.6.27.37-0.1-default.gz -rw-r--r-- 1 root root 2681140 2009-10-16 17:36 vmlinux-2.6.27.37-0.1-xen.gz lrwxrwxrwx 1 root root 29 2009-11-23 13:52 vmlinuz -> vmlinuz-2.6.27.37-0.1-default -rw-r--r-- 1 root root 2541344 2009-10-16 18:05 vmlinuz-2.6.27.37-0.1-default -rw-r--r-- 1 root root 2235478 2009-10-16 17:31 vmlinuz-2.6.27.37-0.1-xen lrwxrwxrwx 1 root root 25 2009-11-23 13:52 vmlinuz-xen -> vmlinuz-2.6.27.37-0.1-xen
On lance le domU: domuopensusepara L'installation d'un domU Opensuse11-1 para sur un DomU Opensuse11-1 est assez simple. DomU para Ubuntu Server 9.10 Après de longues heures de recherche, j'ai enfin réussi à faire booter un serveur Ubuntu en paravirtualisé. Le kernel ubuntu depuis le 2.6.28 etant très peu modifié du kernel Vanilla, il possède en natif les options Xen directement déjà compilé dans le kernel. De plus on remarque que les pilotes block et réseau de Xen sont aussi présents dans les modules de ubuntu 9.10.
root@bartounet:/# grep -r xen /lib/modules/2.6.31-14-generic/kernel/ | grep front Binary file /lib/modules/2.6.31-14-generic/kernel/drivers/block/xen-blkfront.ko matches Binary file /lib/modules/2.6.31-14-generic/kernel/drivers/net/xen-netfront.ko matches
On a donc en natif tout pour faire un DomU paravirtualisé. les options de kernel et les modules. Commencer par installer votre ubuntu en hvm comme vu plus haut. une fois le DomU booté en HVM aller tout de suite dans le fstab et modifier les noms de vos disques par /dev/xvd* Voiçi le fstab modifié:
# /etc/fstab: static file system information. # # Use 'blkid -o value -s UUID' to print the universally unique identifier # for a device; this may be used with UUID= as a more robust way to name # devices that works even if disks are added and removed. See fstab(5). # # proc /proc proc defaults 0 0 # / was on /dev/sda2 during installation /dev/xvda2 / ext4 defaults 0 1 # /boot was on /dev/sda1 during installation /dev/xvda1 /boot ext3 defaults 0 2 # swap was on /dev/sda3 during installation /dev/xvda3 none swap sw 0 0 /dev/xvdb1 /home xfs defaults 0 0 /dev/xvdb /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
j'ai remplacé les occurences de hd en xvd ( /dev/hda1 = /dev/xvda1) etc... important, n'oubliez pas de creer des liens symbolique pointant vers le kernel en rapport avec votre fichier de conf de domu ( vmlinuz-xen et initrd-xen) mais rien de vous empeche aussi d'indiquer directement le nom complet du kernel dans le fichier de domU
root@wwwinfo16:~# ls -al /boot/ | grep xen lrwxrwxrwx 1 root root 27 2009-11-25 12:33 initrd-xen -> initrd.img-2.6.31-14-server lrwxrwxrwx 1 root root 24 2009-11-25 12:33 vmlinuz-xen -> vmlinuz-2.6.31-14-server
Quelques modifications sont à apporter à notre fichier de conf du domU:
linux:~ # vi /etc/xen/vm/wwwinfo16 ######VM PARAM#### name="wwwinfo16" ostype="linux" memory=512 vcpus=2 cpu_weight=256 cpu_cap=0 hap=1 apic=1 acpi=1 pae=1 stdvga=0 usb=1 usbdevice="tablet" serial="pty" timer_mode=1 localtime=1 extid=0 on_crash="restart" on_reboot="restart" on_poweroff="destroy" ######HVM######### #builder="hvm" #device_model="/usr/lib64/xen/bin/qemu-dm" #kernel="/usr/lib/xen/boot/hvmloader" ######PVM######### builder="linux" bootloader = '/usr/lib/xen/boot/domUloader.py' bootargs = '--entry=xvda1:/vmlinuz-xen,/initrd-xen' extra="root=/dev/xvda2 vga=0x31a console=tty0" ######DEV######### vfb=[ 'type=vnc,vncunused=1', ] disk=[ 'phy:/dev/vg0/lv0,xvda,w', ] vif=[ 'type=netfront,mac=00:16:3a:11:11:00', ] boot="c"
Dans le fichiers de conf on modifie aussi les /dev/hda en /dev/xvda Dans les options de kernel, mais aussi dans les options de disk. Si vous définissez un lecteur CD-Rom n'oubliez pas non plus de le declarer en xvdc, sinon ça ne bootera pas. si tout se passe bien relancer votre DomU Ubuntu et il devrait booter. un petit lspci ne retourne rien, vous êtes bien en paravirtualisé. Regardez les modules chargés au démarrage sur le domU.
root@wwwinfo16:~# lsmod | grep xen xen_fbfront 10112 1 fb_sys_fops 2304 1 xen_fbfront sysimgblt 3168 1 xen_fbfront sysfillrect 4576 1 xen_fbfront xen_kbdfront 6176 0 syscopyarea 4224 1 xen_fbfront xen_netfront 21696 0 xen_blkfront 14340 6
netfront et blkfront sont bien chargés... nous sommes en para. Un petit test de débit réseau entre le domU et le dom0 finirons ne vous en convaincre..
root@wwwinfo16:/home/ftpuser/anonymous# iperf -w512k -c192.168.1.254 -P2 ------------------------------------------------------------ Client connecting to 192.168.1.254, TCP port 5001 TCP window size: 256 KByte (WARNING: requested 512 KByte) ------------------------------------------------------------ [ 4] local 192.168.1.1 port 34407 connected with 192.168.1.254 port 5001 [ 3] local 192.168.1.1 port 34406 connected with 192.168.1.254 port 5001 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 4.95 GBytes 4.25 Gbits/sec [ 3] 0.0-10.0 sec 2.31 GBytes 1.99 Gbits/sec [SUM] 0.0-10.0 sec 7.26 GBytes 6.24 Gbits/sec
Plus de 6 Gbits/s c'est pas mal. Essayons entre 2 DomU Ubuntu-9.10-x86_64 paravirtualisés
root@wwwinfo16:/home/ftpuser/anonymous# iperf -w512k -c192.168.1.2 -P2 ------------------------------------------------------------ Client connecting to 192.168.1.2, TCP port 5001 TCP window size: 256 KByte (WARNING: requested 512 KByte) ------------------------------------------------------------ [ 4] local 192.168.1.1 port 49034 connected with 192.168.1.2 port 5001 [ 3] local 192.168.1.1 port 49033 connected with 192.168.1.2 port 5001 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 3.31 GBytes 2.84 Gbits/sec [ 3] 0.0-10.0 sec 3.30 GBytes 2.83 Gbits/sec [SUM] 0.0-10.0 sec 6.61 GBytes 5.67 Gbits/sec
Nos serveurs virtuels on un débit de plus de 5Gbits/s entre eux. Ca laisse de la marge. Je voulais finir sur le réseau. C'est souvent ce qu'on a du mal à mettre en place quand on commence sous Xen. Souvenez vous j'ai utilisez netwok-nat, qui configure le nat au lancement de xen et permet de faire du masquerade. et vif-bridge bridge=br0 qui permet d'attacher les interfaces virtuelles des domU à notre bridge qui lui utilisera les parametres du kernel pour router. Il faut savoir que quand on lance un DomU une interface réseau virtuelle est créee automatiquement. Lorsque c'est une HVM c'est une interface tap Lorsque c'est un para c'est une interface vif Sur mon serveur voiçi l'exemple concret. On peut voir sur le dom0 que j'ai 5 DomU démarrés
linux:~ # xm li Name ID Mem VCPUs State Time(s) Domain-0 0 2603 4 r----- 6787.6 chatinfo16 15 128 1 -b---- 28.3 mailinfo16 12 512 2 -b---- 826.7 nsinfo16 14 128 1 -b---- 19.1 susepara 17 128 1 -b---- 83.6 wwwinfo16 7 512 2 -b---- 496.8
en théorie si je dit vrai on devrait donc avoir 5 interfaces vif de créees puisque je n'utilise que des domU paravirtualisés. Vérifions le:
linux:~ # ifconfig br0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::3c8b:16ff:fe67:b2b7/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1205797 errors:0 dropped:0 overruns:0 frame:0 TX packets:1268662 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:12752893921 (12162.1 Mb) TX bytes:326758032 (311.6 Mb) eth0 Link encap:Ethernet HWaddr 00:1C:C0:FD:69:A3 inet addr:94.x.x.21 Bcast:94.23.236.255 Mask:255.255.255.0 inet6 addr: fe80::21c:c0ff:fefd:69a3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5321651 errors:0 dropped:0 overruns:0 frame:0 TX packets:9613762 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:621290841 (592.5 Mb) TX bytes:13509616638 (12883.7 Mb) Interrupt:252 Base address:0xc000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:586 (586.0 b) TX bytes:586 (586.0 b) vif7.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:1102247 errors:0 dropped:0 overruns:0 frame:0 TX packets:1068448 errors:0 dropped:7 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:26806418112 (25564.5 Mb) TX bytes:79329581 (75.6 Mb) vif12.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:668903 errors:0 dropped:0 overruns:0 frame:0 TX packets:763612 errors:0 dropped:3 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:66913413 (63.8 Mb) TX bytes:14387030405 (13720.5 Mb) vif14.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:4815 errors:0 dropped:0 overruns:0 frame:0 TX packets:6801 errors:0 dropped:5 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:563633 (550.4 Kb) TX bytes:1296285 (1.2 Mb) vif15.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:11409 errors:0 dropped:0 overruns:0 frame:0 TX packets:13668 errors:0 dropped:25 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:2077063 (1.9 Mb) TX bytes:2730964 (2.6 Mb) vif17.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:1896 errors:0 dropped:0 overruns:0 frame:0 TX packets:3768 errors:0 dropped:81 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:376026 (367.2 Kb) TX bytes:4379048 (4.1 Mb)
Pour qu'elles communiquent sur le réseau, il faut qu'elle soient reliées à mon bridge br0: Vérifions le:
linux:~ # brctl show bridge name bridge id STP enabled interfaces br0 8000.feffffffffff no vif12.0 vif14.0 vif15.0 vif17.0 vif7.0
Les vifs sont bien reliées à br0. à partir de là elle peuvent communiquer avec le reste de mon réseau. J'oubliais de parler des règles nat. Pour l'instant, les domU communiquent avec l'extérieur, par l'intermédiaire de leur passerelle par défaut 192.168.1.254 et du nat sur eth0. Mais pour l'instant toutes les tentatives de connexions extérieures ( http, ftp, dns, smtp etc...) arrivent sur le dom0, il faudra donc mettre en place des règles iptables pour rediriger les ports vers les bons serveurs (domU) Par exemple wwwinfo16 est le serveur web, il faudra donc une règle iptable du style:
##Redirection de ports pour les differents services #######wwwinfo16 $iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 80 -j DNAT --to 192.168.1.1:80
Et ceci pour tous les ports que vous voulez rediriger. C'est un peu fastidieux, mais une fois votre script de règles iptables mis en place cela fonctionne très bien. Il reste pas mal de chose a faire, comme paramétrer des sauvegardes que je ferais en mode bloc par du simple dd et de la compression lzop. Le tout externalisé sur un ftp. Faire un template propre pour provisioner autant de domU que je le souhaite grace à une image identique ( dd est mon amis) Mais le projet est bien avancé, puisque vous lisez à ce jour, cet article sur mon blog qui est hebergé sur wwwinfo16, vous m'envoyez des mails par l'intermédiaire de mailinfo16, le SOA du domaine info16.fr est nsinfo16.
27 juillet 2011 Aucun commentaire

#Gnu/Linux

Installation de CAS 3.3.2 avec Active Directory

Voilà des jours que j'essaye de faire fonctionner CAS pour une athentification ldap avec active directory, dans un domaine Windows. Je me fait un petit billet pour ne pas oublier. Dejà CAS c'est quoi, c'est un outil permettant de faire du SSO. Il s’agit d’une technique permettant à un utilisateur de ne procéder qu’à une seule authentification pour accéder à plusieurs applications informatiques sécurisées (généralement des sites Web). Souvent dans une entreprise, les utilisateurs sont amenés à s’identifier dans différentes applications (intranet, courrier électronique, forums, agendas, …). Sans solution de SSO, il est nécessaire de s’identifier dans chacune de ces applications avec souvent des identifiants différents. Il se présente par une interface Web des plus simpliste. Mais derriere il y a quoi ? Il s'agit dabord d'installer Tomcat. Pour mon exemple j'ai installer Tomcat sur une Opensuse11.1 à grand coup de Yast. Yast Tomcat L'installation de Tomcat est assez simple avec le gestionaire de paquets, n'oublier pas d'installer le manager et les webapps. Tomcat se base sur Java, vérifiez bien votre version de java. si tout c'est bien déroulé, vous devriez avoir accès à tomcat sur http://votre_server:8080 tomcat Afin de pouvoir acceder au manager, il faut creer un compte admin dans le fichier tomcat-users.xml Sur OpenSuse 11.1 l'installation de Tomcat6 se trouve dans /usr/share/tomcat6 On a donc dans /usr/share/tomcat6/conf/ tomcat-users.xml
<tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> <user username="admin" password="pass" roles="admin,manager"/> </tomcat-users>
La dernière ligne est celle que j'ai ajoutée pour acceder au manager de tomcat. Passons maintenant à l'installation de CAS. Le plus important est d'utiliser CAS Toolbox, j'ai galéré des semaines avec cas-server sans succès alors que j'ai enfin abouti avec cas-toolbox. Autrement dit c'est un cas packagé qui simplifie la configuration. On télécharge l'archive sur le site de l'esup https://sourcesup.cru.fr/frs/?group_id=401&release_id=1461 Pour ma part j'ai testé la 3.3.2-1 On decompresse l'archive et on commence à modifer les fichiers. TOut d'abord les fichier qu'on va modifier sont build.properties et config.properties
# cp build.sample.properties build.properties # cp config.sample.properties config.properties
Afin de tester j'ai rapidement monter un controleur de domaine Windows 2003 enterprise sur une machine virtuelle. Le domaine sera maison.priv Il est aussi necessaire de creer dans l'Active directory un user qui aura les droit d'interroger l'AD. Mon user sera ldapview avec le mot de pass motdepasse Passons à la configuration des ficher CAS Voiçi le fichiers build.properties
#deploy dir deploy.path=/usr/share/tomcat6/webapps/cas #configuration file to use config.file=${basedir}/config.properties #config.file=${basedir}/resources/quickstart/quickstart.properties #use maven dependency offline #must run on time inline maven.offline=false #SVN part to get other update svnant.update.url=http://subversion.cru.fr/cas-toolbox/tags/3.3.2-1/update.esup/ svnant.repository.user= svnant.repository.passwd= svnant.update.path=${basedir}/update.esup svnant.update.version=HEAD # do not change after this line #package configuration package.name=cas-toolbox package.version=1 package.build.path=${build.path}/package #quickstart configruation #config.file=${basedir}/resources/quickstart/quickstart.properties quickstart.name=cas-quickstart quickstart.version=1 quickstart.build.path=${build.path}/quickstart quickstart.ressource.path=${resources.path}/quickstart #maven properties maven.ant.task.version=2.0.9 maven.local.dir=maven-repository maven.local.repository=${basedir}/build/${maven.local.dir} maven.package.name=cas-maven-repository maven.proxy.host= maven.proxy.port=8080 maven.proxy.username= maven.proxy.password= update.path=${basedir}/update #${basedir}/update.esup #${basedir}/update.stats #${basedir}/update.memcache custom.path=${basedir}/custom build.path=${basedir}/build resources.path=${basedir}/resources cas.build.path=${build.path}/cas cas.update.webpage.path=${update.path}/webpages cas.custom.webpage.path=${custom.path}/webpages cas.update.source.path=${update.path}/source cas.custom.source.path=${custom.path}/source quickstart.build.path=${build.path}/quickstart quickstart.ressource.path=${resources.path}/quickstart simpleTestHandler.name= simpleTestHandler.conf=simpletest-auth.xml ldapHandler.name=cas-server-support-ldap ldapHandler.conf=ldap-auth.xml
Le config.properties
# Ldap properties ldap.host.1=ldap://10.0.0.153 ldap.basedn=sAMAccountName=%u,CN=Users,dc=maison,dc=priv # file authenticate layer passfile.encode-algo=MD5 passfile.location=classpath:/../usersFile log.dir=${catalina.home}/logs #cas host cas.host=localhost # cas uri (empty if /) cas.uri= # cas port empty (if standard) cas.port=:8080 #User allow to use services manager (services/manage.html) security.useradmin=admin # graphic theme theme=default views=default # auth layer to use # see build.properties to view all cas.authHandlers=ldapHandler
Modifier bien sur selon votre configuration. Enfin on fini par creer une arborescence dans cas-toolbox-3.3.2-1 tell que cas-toolbox-3.3.2-1/custom/webpages/WEB-INF/auth-configuration/ et on va creer un fichier ldap-auth.xml vi custom/webpages/WEB-INF/auth-configuration/ldap-auth.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- | deployerConfigContext.xml centralizes into one file some of the declarative configuration that | all CAS deployers will need to modify. | | This file declares some of the Spring-managed JavaBeans that make up a CAS deployment. | The beans declared in this file are instantiated at context initialization time by the Spring | ContextLoaderListener declared in web.xml. It finds this file because this | file is among those declared in the context parameter "contextConfigLocation". | | By far the most common change you will need to make in this file is to change the last bean | declaration to replace the default SimpleTestUsernamePasswordAuthenticationHandler with | one implementing your approach for authenticating usernames and passwords. +--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- | LDAP authentication. +--> <bean id="ldapHandler" class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler"> <property name="filter" value="sAMAccountName=%u" /> <property name="searchBase" value="DC=maison,DC=priv" /> <property name="contextSource" ref="contextSource" /> <property name="ignorePartialResultException" value="yes" /> </bean> <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> <property name="anonymousReadOnly" value="false" /> <property name="password" value="motdepasse" /> <property name="pooled" value="true" /> <property name="urls"> <list> <value>ldap://10.0.0.153:389</value> </list> </property> <property name="userDn" value="ldapview" /> <property name="baseEnvironmentProperties"> <map> <!-- <entry> <key><value>java.naming.security.protocol</value></key> <value>ssl</value> </entry> --> <entry> <key><value>java.naming.security.authentication</value></key> <value>simple</value> </entry> </map> </property> </bean> </beans>
On fini enfin en utilisant la commande ant ant init qui va builder cas selon votre config ant deploy qui va aller copier les fichier cas dans le chemin que vous lui avez definit dans build.properties. Si tout se passe bien vous devriez voir apparaitre un webbaps cas dans le manager de tomcat. Il devrait démarrer.. CAS Acceuil et une fois authentifier avec un compte du domaine Active directory CAS Succes
27 juillet 2011 Aucun commentaire

#Gnu/Linux

Montée en charge d'un serveur Apache et DOS,DDOS

Comme chacun sait il existe en général deux types d'attaque par deni de service. les DOS et les DDOS Comme le dit bien Wikipedia: Un déni de service est une situation où un serveur informatique est incapable de répondre aux requêtes de ses clients. Un serveur informatique (par exemple un serveur Web) doit traiter plusieurs requêtes dans un court laps de temps. Lorsque le serveur est incapable de traiter toutes les requêtes qu'il reçoit, il y a déni de service. (DOS) Une attaque par déni de service distribuée (en anglais, Distributed Denial of Service attack ou DDoS attack) est une attaque par déni de service dans laquelle le serveur cible est attaqué par plusieurs ordinateurs simultanément. Pour ma part je ne m'étais jamais trop interessé à la monté en charge de mon serveur apache, pensant que mon site peu visité ne pouvait pas faire l'objet d'attaque. Mais c'est en voulant tester un outil de montée en charge tels que siege, que je me suis rendu compte qu'il était très simple de mettre à genoux un serveur peu sécurisé... Pour commencer tester la tenue en charge de notre serveur Apache avec siège. 1. Installation Après avoir récupéré le code source sur le site officiel, entrez les commandes suivante :
tar zxvf siege-latest.tar.gz cd siege ./configure make make install
2. Utilisation La première étape consiste à créer le fichier de configuration. Pour cela, il suffit de lancer la commande siege.config, dans son terminal. Ensuite, on pourra tester son serveur web avec quelque chose comme çà :
siege -d1 -r300 -c100 http://ip_du_serveur_a_tester/
Ici les options signifie : -c : nombre d'utilisateurs -r : nombre de connexion par chaque utilisateur -d : délai en seconde de sleep Ainsi, en lançant siege avec de tels paramètres, je simule la connexion de 100 utilisateurs, exécutant chacun 300 requêtes, espacé de une seconde. Ce qui fait à peu près 30 000 requêtes. Et là c'est le drame...
root@sd-15226:~# siege -d1 -r300 -c100 http://forum.info16.fr ** SIEGE 2.69 ** Preparing 100 concurrent users for battle. The server is now under siege... HTTP/1.1 200 2.79 secs: 6295 bytes ==> / HTTP/1.1 200 2.88 secs: 6296 bytes ==> / HTTP/1.1 200 2.89 secs: 6296 bytes ==> / HTTP/1.1 200 2.89 secs: 6296 bytes ==> / HTTP/1.1 200 2.90 secs: 6296 bytes ==> / HTTP/1.1 200 2.92 secs: 6296 bytes ==> / HTTP/1.1 200 2.93 secs: 6296 bytes ==> / HTTP/1.1 200 2.94 secs: 6296 bytes ==> / HTTP/1.1 200 2.95 secs: 6296 bytes ==> / HTTP/1.1 200 2.96 secs: 6296 bytes ==> / HTTP/1.1 200 3.57 secs: 6296 bytes ==> / HTTP/1.1 200 5.78 secs: 6296 bytes ==> / HTTP/1.1 200 6.59 secs: 6296 bytes ==> / HTTP/1.1 200 9.24 secs: 6296 bytes ==> / HTTP/1.1 200 9.31 secs: 6296 bytes ==> / HTTP/1.1 200 9.42 secs: 6296 bytes ==> / HTTP/1.1 200 9.46 secs: 6296 bytes ==> / HTTP/1.1 200 9.61 secs: 6296 bytes ==> / HTTP/1.1 200 9.61 secs: 6296 bytes ==> / HTTP/1.1 200 9.67 secs: 6296 bytes ==> / HTTP/1.1 200 9.73 secs: 6296 bytes ==> / HTTP/1.1 200 9.73 secs: 6296 bytes ==> / HTTP/1.1 200 9.93 secs: 6296 bytes ==> / HTTP/1.1 200 9.99 secs: 6295 bytes ==> / HTTP/1.1 200 10.17 secs: 6296 bytes ==> / HTTP/1.1 200 10.37 secs: 6295 bytes ==> / HTTP/1.1 200 10.68 secs: 6296 bytes ==> / HTTP/1.1 200 11.94 secs: 6296 bytes ==> / HTTP/1.1 200 12.88 secs: 6296 bytes ==> / HTTP/1.1 200 14.44 secs: 6296 bytes ==> / HTTP/1.1 200 14.82 secs: 6295 bytes ==> / HTTP/1.1 200 14.86 secs: 6296 bytes ==> / HTTP/1.1 200 15.05 secs: 6297 bytes ==> / HTTP/1.1 200 15.49 secs: 6297 bytes ==> / HTTP/1.1 200 15.88 secs: 6297 bytes ==> / HTTP/1.1 200 16.09 secs: 6297 bytes ==> / HTTP/1.1 200 18.04 secs: 6297 bytes ==> / HTTP/1.1 200 18.67 secs: 6297 bytes ==> / HTTP/1.1 200 19.87 secs: 6297 bytes ==> / HTTP/1.1 200 20.20 secs: 6297 bytes ==> / HTTP/1.1 200 20.92 secs: 6297 bytes ==> / HTTP/1.1 200 21.39 secs: 6297 bytes ==> / HTTP/1.1 200 21.42 secs: 6297 bytes ==> / HTTP/1.1 200 21.42 secs: 6297 bytes ==> / HTTP/1.1 200 22.94 secs: 6297 bytes ==> / HTTP/1.1 200 23.00 secs: 6297 bytes ==> / HTTP/1.1 200 23.35 secs: 6297 bytes ==> / HTTP/1.1 200 22.79 secs: 6297 bytes ==> / HTTP/1.1 200 23.74 secs: 6297 bytes ==> / HTTP/1.1 200 23.82 secs: 6297 bytes ==> / HTTP/1.1 200 23.88 secs: 6296 bytes ==> / HTTP/1.1 200 24.14 secs: 6297 bytes ==> / HTTP/1.1 200 24.72 secs: 6297 bytes ==> / HTTP/1.1 200 24.87 secs: 6296 bytes ==> / HTTP/1.1 200 24.92 secs: 6297 bytes ==> / HTTP/1.1 200 25.38 secs: 6297 bytes ==> / HTTP/1.1 200 25.43 secs: 6297 bytes ==> / HTTP/1.1 200 25.44 secs: 6297 bytes ==> / HTTP/1.1 200 25.45 secs: 6297 bytes ==> / HTTP/1.1 200 25.55 secs: 6297 bytes ==> / HTTP/1.1 200 25.79 secs: 6297 bytes ==> / HTTP/1.1 200 25.80 secs: 6297 bytes ==> / HTTP/1.1 200 25.91 secs: 6297 bytes ==> / HTTP/1.1 200 26.13 secs: 6297 bytes ==> / HTTP/1.1 200 26.30 secs: 6296 bytes ==> / HTTP/1.1 200 26.57 secs: 6296 bytes ==> / HTTP/1.1 200 27.67 secs: 6297 bytes ==> / HTTP/1.1 200 27.68 secs: 6297 bytes ==> / HTTP/1.1 200 28.52 secs: 6296 bytes ==> / HTTP/1.1 200 28.50 secs: 6297 bytes ==> / HTTP/1.1 200 28.55 secs: 6297 bytes ==> / HTTP/1.1 200 28.89 secs: 6297 bytes ==> / warning: socket: 1831987536 select timed out: Connection timed out warning: socket: 1748060496 select timed out: Connection timed out warning: socket: 1664133456 select timed out: Connection timed out warning: socket: 1605384528 select timed out: Connection timed out warning: socket: 1471101264 select timed out: Connection timed out warning: socket: 1303247184 select timed out: Connection timed out warning: socket: 1538242896 select timed out: Connection timed out warning: socket: 1236105552 select timed out: Connection timed out warning: socket: 1437530448 select timed out: Connection timed out warning: socket: 1403959632 select timed out: Connection timed out warning: socket: 1454315856 select timed out: Connection timed out warning: socket: 1840380240 select timed out: Connection timed out warning: socket: 1706096976 select timed out: Connection timed out warning: socket: 1185749328 select timed out: Connection timed out
En quelques secondes, mon serveur était down... impossible d'acceder au site, impossible aussi de se connecter en ssh... seul la réponse au ping était encore fonctionnelle. et là ca commence à faire peur.. en fait n'importe quel serveur peut etre saturé, par le moindre petit malin... Cette situation n'est pas tolérable, on ne peut pas laisser un serveur ainsi... après avoir longuement cherché et réfléchi sur un moyen de contrer ce probleme... je suis tombé sur un module d'apache des plus interessant: le mod_evasive :permet de détecter les floods et les tentatives de déni de service (DOS). Ce module renvoie des erreurs HTTP 403 lorsque le seuil de sollicitation du serveur apache par IP a été dépassé. c'est la solution. Le bandit à force de connexion répétée aura un joli placard erreur 403 et sera blacklisté un moment. 1- Télécharger le mod_evasive sur le site officiel http://www.zdziarski.com/projects/mod_evasive/ 2- Installation Nous allons utiliser l'outil apxs d'apache (apxs is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP) server) En effet c'est un outil qui permet d'installer proprement un module dans apache De base je n'avais pas la commande apxs
apt-get install apache2-threaded-dev
tar xvfz mod_evasive_1.10.1.tar.gz cd mod_evasive /usr/bin/apxs2 -i -a -c mod_evasive20.c #Module pour apache2
il faut à présent paramétrer le fichier apache2.conf. ( apxs est censé le faire, mais je pense qu'il cherche un httpd.conf qui n'est pas présent sur une distribution Ubuntu) voiçi les ligne à rajouter dans le fichier de conf d'apache.
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 10 DOSWhitelist 127.0.0.* DOSEmailNotify admin@votredomaine.fr DOSSystemCommand "/bin/echo %s >> /var/log/apache2/evasive/evasive.log && /bin/date >> /var/log/apache2/evasive/evasive.log" DOSLogDir "/var/log/evasive"
Explications : DOSSiteCount : Le nombre maximal de requêtes qu'une adresse IP source peut réaliser sur le même enfant pendant une unité de temps sans être ajoutée à la liste noire. DOSSiteInterval : L'unité de temps (en secondes) évoquée dans la directive DOSSiteCount. La valeur par défaut est d'une seconde. DOSPageCount : Le nombre maximal de requêtes qu'une adresse IP source peut réaliser sur la même ressource (même URL) pendant une unité de temps sans être ajoutée à la liste noire. DOSPageInterval : L'unité de temps évoquée dans la directive DOSPageCount. DOSBlockingPeriod : Désigne la durée pendant laquelle tous les accès des adresses IP en liste noire seront refusés et recevront une erreur 403. Par défaut, cette durée est de 10 secondes. DOSEmailNotify : Précise une adresse email à laquelle envoyer un courriel lorsqu'une adresse IP est ajoutée en liste noire. (Attention de bien positionner MAILER dans les sources du module pour utiliser cette directive). DOSSystemCommand : Une commande à appeler pour, par exemple, ajouter l'adresse en liste noire sur un routeur. DOSWhiteList : Spécifie une adresse IP à ne jamais positionner en liste noire. Il est courant de positionner cette option à 127.0.0.* pour éviter de bloquer nos éventuels propres accès récursifs ou autres robots de référencement. En production, cette option ne devrait jamais être utilisée pour désigner un réseau d'utilisateurs humains légitimes : les mécanismes internes du module garantissent que le trafic légitime ne sera pas bloqué. Cette directive peut être positionnée plusieurs fois avec divers arguments, ceux-ci seront cumulés dans la configuration. (cf system-linux.eu) redemarrer apache
/etc/init.d.apache2 restart
Vous pouvez verifier tout de meme dans votre server-info que le module est bien chargé. Dernier petit test sur un de mes forums...
root@sd-15226:~# siege -d1 -r300 -c100 http://forum.info16.fr ** SIEGE 2.69 ** Preparing 100 concurrent users for battle. The server is now under siege... HTTP/1.1 200 0.16 secs: 5178 bytes ==> / HTTP/1.1 200 0.19 secs: 5178 bytes ==> / HTTP/1.1 200 0.19 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.21 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.20 secs: 5178 bytes ==> / HTTP/1.1 200 0.29 secs: 5178 bytes ==> / HTTP/1.1 200 0.31 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.36 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 200 0.38 secs: 5178 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 200 0.37 secs: 5178 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.36 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.35 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.34 secs: 351 bytes ==> / HTTP/1.1 403 0.23 secs: 351 bytes ==> /
on remarque bien qu départ la réponse 200 de apache qui stipule que tout va bien, mais quand le nombres de connexions dépasse le taux définit par le module evasive on obtient une erreur 403. l'ip est balclistée durant un temps défini.
27 juillet 2011 Aucun commentaire

#Gnu/Linux

Mise en place d'un forum en cluster ( equilibrage de charge, LVM2 + DRBD + OCFS2)

Il y avait un moment que j'avais pas écris un petit billet. J'en profiste pour faire un petit mémo sur la mise en place d'un forum en cluster sur 2 serveurs dédiés type Dédibox. je dresse rapidement le tableau. Etant beta-testeur Dedibox, j'ai la chance de disposer de pas mal de serveurs dédiés de tests. Je me suis donc amusé à installé un Forum PunBB sur un cluster Actif/Actif répliqué par DRBD, et permettant les écritures concurentes grace au systeme de fichier cluster OCFS2. Un schéma vaut mieux qu'un grand discours.

Comme vous pouvez le constater, je suis parti sur le principe que pour redonder un forum, tel que punbb il faut redonder /var/www et /var/lib/mysql. Il y a pas mal de moyen pour redonder un block device, j'ai otper pour DRBD DRBD (Distributed Replicated Block Device) est un outil qui permet de synchroniser (par réplication) des périphériques de stockage (disque dur, partition, volume logique, etc.) entre deux ordinateurs via le réseau. Cette synchronisation se fait : en temps réel : elle se fait à la volée, pendant que les données sont modifiées de manière transparente : les applications, qui enregistrent leurs données sur le périphérique de stockage répliqué, le font sans même savoir qu'il s'agit d'une unité de stockage spéciale. de manière synchrone ou asynchrone : en fonctionnement synchrone, l'écriture est déclarée terminée lorsque les données sont écrites localement ET que la synchronisation est terminée. En fonctionnement asynchrone, l'écriture est déclarée terminée lorsque les données sont écrites localement (sur le serveur primaire et pas sur le serveur de réplique) uniquement. (cf ubuntu.fr) Plantons le tableau. Je suis parti de deux dédibox XL (raid0 pour le stockage) Mon partitionement:

Node1= Disk /dev/md0: 131 MB, 131530752 bytes (/boot) Disk /dev/md1: 42.9 GB, 42935779328 bytes (/)(raid0) Disk /dev/md2: 952.6 GB, 952684642304 bytes (vg0) (raid0) Node2= Disk /dev/md0: 131 MB, 131530752 bytes (/boot) Disk /dev/md1: 42.9 GB, 42935779328 bytes (/)(raid0) Disk /dev/md2: 952.6 GB, 952684642304 bytes (vg0) (raid0) /// On peut déjà apprécier l'éfficacité de Raid logiciel sous linux sur /dev/md2 /// Disk /dev/md2: 952.6 GB, 952684642304 bytes root@node1:~# dd if=/dev/md2 of=/dev/zero bs=1M iflag=direct 1111+0 records in 1110+0 records out 1163919360 bytes (1,2 GB) copied, 6,55167 s, 178 MB/s

Ca peut aller. Je suis parti d'une distribution Ubuntu 8.04 LTS 64bit kernel 2.6.24-24-server sur les 2 noeuds. - Création des LVM.

root@node1:~# apt-get install lvm2

verifier bien que le module dm_mod est chargé, sinon chargez le

dm_mod 78200 7 dm_mirror,dm_snapshot
root@node1:~# pvcreate /dev/md2
root@node1:~# lvcreate -L2G -nlv0 vg0 Logical volume "lv0" created
root@node1:~# lvcreate -L2G -nlv1 vg0 Logical volume "lv1" created

nos deux Logcial volume sont crées. destinés à contenir respectivement drbd0 et drbd1 soit /var/www et /var/lib/mysql Creer la même arborescence lv sur les 2 noeuds.

  • Installation de DRBD

Afin que l'installation de DRBD se passe bien, il faut vérifier quelques petits prérequis. Tout d'abord avoir les outils de compilation.

root@node1:~# apt-get install build-essential

Vérifier aussi d'avoir les sources de votre kernel ou du moins les header.

root@node1:~#apt-get install kernel-headers-$(uname -r) root@node1:~#apt-get install flex

Télécharger les sources de drbd sur le site http://oss.linbit.com/drbd

root@node1:/usr/src# tar xvfz drbd-8.3.1.tar.gz
root@node1:/usr/src# cd drbd-8.3.1 root@node1:/usr/src/drbd-8.3.1# make clean all

Véirifier que tout se compile bien. Installer maintenant DRBD

root@node1:/usr/src#make install -j4 root@node1:/usr/src#make install-tools -j4

attaquons nous au fichier de configuration de drbd situé dans /etc/drbd.conf

common { protocol C; startup { #become-primary-on both; wfc-timeout 30; degr-wfc-timeout 30; } disk { on-io-error detach; no-disk-flushes; no-md-flushes; no-disk-barrier; no-disk-drain; } net { max-buffers 16384; max-epoch-size 16384; unplug-watermark 128; sndbuf-size 8M; ko-count 6; allow-two-primaries; after-sb-0pri discard-zero-changes; after-sb-1pri violently-as0p; after-sb-2pri violently-as0p; rr-conflict violently; } syncer { rate 100M; al-extents 1801; verify-alg crc32c; } } resource r0 { on node1 { device /dev/drbd0; disk /dev/vg0/lv0; address 88.191.84.35:7789; meta-disk internal; } on node2 { device /dev/drbd0; disk /dev/vg0/lv0; address 88.191.84.36:7789; meta-disk internal; } } resource r1 { on node1 { device /dev/drbd1; disk /dev/vg0/lv1; address 88.191.84.35:7790; meta-disk internal; } on node2 { device /dev/drbd1; disk /dev/vg0/lv1; address 88.191.84.36:7790; meta-disk internal; } }

Pareil sur le node2

root@node2#drbdadm create-md r0 r1
root@node2#drbdadm up r0 r1

Puis nous synchronisons les ressources. Sur le node 1 nous lançons

root@node1#drbdadm -- --overwrite-data-of-peer primary r0 r1

On peut alors voir les ressources en cours de synchronisation.

Every 1,0s: cat /proc/drbd version: 8.3.1 (api:88/proto:86-89) GIT-hash: fd40f4a8f9104941537d1afc8521e584a6d3003c build by root@sd-15181, 2009-06-21 20:22:50 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---- ns:3157114 nr:98131 dw:1082377 dr:2373543 al:226 bm:133 lo:0 pe:1464 ua:998 ap:1 ep:1 wo:n oos:2027040 [>....................] sync'ed: 3.6% (2027040/2097052)K finish: 0:05:07 speed: 6,452 (5,832) K/sec 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---- ns:2640518 nr:125231 dw:593569 dr:5326403 al:92 bm:133 lo:0 pe:1472 ua:1006 ap:1 ep:1 wo:n oos:2027760 [>....................] sync'ed: 3.4% (2027760/2097052)K finish: 0:05:07 speed: 6,448 (5,772) K/sec

On peut remarquer qu'entre les 2 dedibox la synchronisation se fait 11Mo/s on sature le lien 100Mb/s ( rien ne nous empeche de limiter ce débit dans le drbd.conf)

  • Passons maintenant à OCFS2.

Si on montait directement nos bases de données et nos sites sur les drbd après les avoir formatés avec un file sytem non clusterisé cela ne fonctionnerait pas. Car le but est que le forum puisque ecrire dans la base des deux cotés que les deux serveurs soient actifs en même temps et aient un accès concurrents au stockage. Pour cela il nous faut un systeme de fichier qui gere les accès concurrents sur un même espace de stockage (es 2 plus connus sont OCFS2 et GFS) installons OCFS2

root@node1#apt-get install ocfs2-tools

On créer le répertoire /etc/ocfs2

root@node1#mkdir /etc/ocfs2

On édite un fichier cluster.conf (identique sur les deux noeuds)

node: ip_port = 7777 ip_address = 88.191.84.35 number = 0 name = node1 cluster = ocfs2 node: ip_port = 7777 ip_address = 88.191.84.36 number = 1 name = node2 cluster = ocfs2 cluster: node_count = 2 name = ocfs2

Changer la valeur “O2CB_ENABLED=false” en “O2CB_ENABLED=true” dans /etc/default/o2cb

On demmarre alors le cluster OCFS2

on peut alors formater nos devices drbd en ocfs2

root@node1#mkfs -t ocfs2 /dev/drbd0
root@node1#mkfs -t ocfs2 /dev/drbd1

Le faire sur un seul noeud suffit puisque drbd à dejà repliqué ce file system de l'autre coté.

Voilà le cluster est prêt à recevoir les données.

Pour ma part j'avais installé lamp avant et j'ai transferé les données sur les nouveaux montages.

root@node1#mount /dev/drbd0 /var/www root@node1#mount /dev/drbd1 /var/lib/mysql

Par contre il est important de désactiver tous les system de cache dans mysql. Car si ocfs2 est capable de gerer la cohérence sur son systeme disk, evidemment il ne peut pas gerer la cohérence entre les caches des deux serveurs Mysql qui tournent en même temps. En tatonnant un peu, j'ai réussi à faire demmarer les deux serveur mysql avec ce fichier de conf.

# # The MySQL database server configuration file. # # You can copy this to one of: # - "/etc/mysql/my.cnf" to set global options, # - "~/.my.cnf" to set user-specific options. # # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # This will be passed to all mysql clients # It has been reported that passwords should be enclosed with ticks/quotes # escpecially if they contain "#" chars... # Remember to edit /etc/mysql/debian.cnf when changing the socket location. [client] port = 3306 socket = /var/run/mysqld/mysqld.sock # Here is entries for some specific programs # The following values assume you have at least 32M ram # This was formally known as [safe_mysqld]. Both versions are currently parsed. [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] # # * Basic Settings # #innodb_data_home_dir = # ## Le fichier de donné doivent contenir vos donné et index. #innodb_data_file_path = /ibdata/ibdata1:2000M; ## ## Utilisez un buffer de taille 50 à 0 % de votre méire serveur ## mais assurez vous sous Linux que l'utilisation totale est inféeure à Go #set-variable = innodb_buffer_pool_size=1G #set-variable = innodb_additional_mem_pool_size=20M #innodb_log_group_home_dir = /dr3/iblogs ## ## innodb_log_arch_dir doit êe le mê que innodb_log_group_home_dir ## (starting from 4.0.6, you can omit it) #innodb_log_arch_dir = /dr3/iblogs #set-variable = innodb_log_files_in_group=2 ## ## Utilisez un fichier de log de taille 15 % du buffer méire #set-variable = innodb_log_file_size=250M #set-variable = innodb_log_buffer_size=8M ## #innodb_flush_log_at_trx_commit=1 #set-variable = innodb_lock_wait_timeout=50 ## ## Démmentez les prochaines lignes, si vous voulez les utiliser ##innodb_flush_method=fdatasync ##set-variable = innodb_thread_concurrency=5 # # # * IMPORTANT # If you make changes to these settings and your system uses apparmor, you may # also need to also adjust /etc/apparmor.d/usr.sbin.mysqld. # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp language = /usr/share/mysql/english skip-external-locking = 0 # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 127.0.0.1 # # * Fine Tuning # key_buffer = 0 key_buffer_size = 0 max_allowed_packet = 16M thread_stack = 128K thread_cache_size = 0 #max_connections = 100 #table_cache = 64 #thread_concurrency = 10 # # * Query Cache Configuration # query_cache_type = 0 query_cache_limit = 0 query_cache_size = 0 # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. log = /var/log/mysql/mysql.log # # Error logging goes to syslog. This is a Debian improvement :) # # Here you can see queries with especially long duration #log_slow_queries = /var/log/mysql/mysql-slow.log #long_query_time = 2 #log-queries-not-using-indexes # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M #binlog_do_db = include_database_name #binlog_ignore_db = include_database_name # # * BerkeleyDB # # Using BerkeleyDB is now discouraged as its support will cease in 5.1.12. skip-bdb # # * InnoDB # # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. # Read the manual for more InnoDB related options. There are many! # You might want to disable InnoDB to shrink the mysqld process by circa 100MB. #skip-innodb # # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". # # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] #no-auto-rehash # faster start of mysql but no tab completition [isamchk] key_buffer = 0 # # * NDB Cluster # # See /usr/share/doc/mysql-server-*/README.Debian for more information. # # The following configuration is read by the NDB Data Nodes (ndbd processes) # not from the NDB Management Nodes (ndb_mgmd processes). # # [MYSQL_CLUSTER] # ndb-connectstring=127.0.0.1 # # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/

J'ai alors installé le forum PunBB sur un noeud, qui s'est bien sur instantanément répliqué sur l'autre.

Quand j'ai parlé d'équilibrage de charge dans le titre, je l'obtient en utilisant simplement un round robin au niveau DNS. C'est à dire 2 enregistrement A avec le meme nom qui pointent sur les 2 ip de mon cluster.

forum.info16.fr. IN A 88.191.84.35 forum.info16.fr. IN A 88.191.84.36

Ainsi aléatoirement un utilisateur cherchant à se connecter au forum forum.info16.fr sera diriger vers 88.191.84.35 ou 88.191.84.36 Attention on ne gere pas du tout le failover. Si un serveur plante l'utilisateur aura une chance sur 2 d'etre dirigé vers le site innaccessible.

Et même si on essait de gerer le DNS afin qu'il detecte si un serveur est innaccessible et modifie ces enregistrements en conséquence, on ne pourra jamais gérer le cache DNS des clients qui se connectent... Ils auront une ip innaccessible jusqu'au TTL. d'ou l'importance de mettre des TTL bas pour les round robin.

27 juillet 2011 1 commentaire

#Gnu/Linux

Installation de OpenSuse sur une dédibox

Ce billet me sert de petit aide mémoire pour installer une OpenSure sur un serveur dédié type dédibox... Vous vous demandez peut être ou est la difficulté? Et bien le problème est que Suse ne fait pas partie des distributions installable dans la console de gestion de dédibox. Donc problème, comment installer une distribution quand elle ne fait pas partie du package de l'herbergeur?

Heureusement Novell à penser à tout la Netinstall

Ce dont vous avez besoin pour réaliser une installation par le réseau est de démarrer le noyau d'installation ainsi que le programme d'installation initrd sur la machine distante. Vous avez aussi besoin de connaître l'adresse IP que l'ordinateur aura. Supposons que c'est une adresse IP fixe. Si vous utilisez DHCP, vous pouvez omettre la configuration du réseau. Tout d'abord, copier l'image du noyau et le programme d'installation dans votre répertoire /boot :

Tout d'abord installer une distribution proposée par dédibox par exemple une Debian. Booter sur le systeme installé.

On peut commencer:

Exemple pour la dernière version de développement:

cd /tmp wget http://mirrors.kernel.org/opensuse/distribution/SL-OSS-factory/inst-source/boot/i386/loader/linux wget http://mirrors.kernel.org/opensuse/distribution/SL-OSS-factory/inst-source/boot/i386/loader/initrd cp linux /boot/vmlinuz.install cp initrd /boot/initrd.install

Vous avez maintenant le kernel et l'initrd qui permette de booter sur un systeme minimum et lancer l'installation par le réseau.

Afin de lancer l'install par le réseau il faut modifier le grub afin de lancer SSH et d'indiquer le chemin réseau de l'install

vim /boot/grub/menu.lst

On rajoute alors les lignes du type:

title Boot -- SUSE LINUX DEVEL INSTALL root (hd0,0) kernel /boot/vmlinuz.install usessh=1 sshpassword="pass" install=http://204.152.191.7/opensuse/distribution/SL-OSS-factory/inst-source hostip=192.168.1.1 netmask=255.255.255.0 gateway=192.168.1.254 nameserver=192.168.1.254 initrd /boot/initrd.install

bien sur ceci si votre grub est installé sur la première partition du premier disque (hd0,0) = (sda1) et si votre ip est 192.168.1.1/24 votre passerelle 192.168.1.254 et votre dns 192.168.1.254

Mettre cette entrée en premier afin que le boot se fasse avec ces options. Si tout se passe bien vous devriez bientot pinger a nouveau votre serveur: Il est en train de booter sur le kernel minimal d'installation.

Après quelques minutes vous pourrez vous connecter en SSH sur le serveur

ssh -X 192.168.1.1

-X pour exporter aussi la session graphique. une fois connecté vous pouvez lancer yast.

L'installation peut commencer comme d'habitude

27 juillet 2011 Aucun commentaire