info16natroute

Depuis pas mal de temps j'héberge mes différents serveur sur une plateforme de virtualisation Xen ( Gnu/Linux OpenSuse 11.3 )

Plateforme matérielle:


Dedibox QC
  • Serveur Dell® PowerEdge R210
  • CPU: 1x Intel® Xeon® X3450 4x 2.66GH
  • RAM: 8 Go DDR3 ECC
  • HDD: 2 x 1 To SATA2 Raid 0 / Raid 1 HARD
  • LAN: 1 Gbit/sec
Juqu'a maintenant j'utilisait la fonction NAT de Xen pour tout mes domU
Plateforme logicielle:
  • Dom0 Opensuse 11.3 X86_64 Xen 4
  • DomU(s) Ubuntu 10.04 X86_64 Paravirtualisé


Jusqu'a maintenant j'utilisait le nat/pat via des règles iptables pour faire communiquer mes DomU à l'extérieur: 

Ce schéma résume assez bien l'infra que j'ai mise en place:


En effet n'ayant qu'une adresse IP publique , 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

Je ne vais pas refaire l'arcticle que j'ai déjà fait mais en gros de base on modifie

(network-script network-nat)

(vif-script 'vif-bridge bridge=br0')

Cela va permettre au lancement de Xen de mettre en place les règle nat à savoir le masquerading .
Le script vif-script quant à lui va permettre de rattacher l'interface de chaque DomU au bridge br0 à chaque lancement d'un DomU

Il faut bien sur aussi activer le routage sur le Dom0 afin qu'il puisse faire le routage entre les réseau 192.168.1.0 et l'extérieur.


Un exemple d'un fichier de DomU Linux:

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/lv2,xvda,w', 'phy:/dev/vg0/lv3,xvdb,w', ]

vif=[ 'type=netfront,mac=00:16:3a:11:11:00', ]

boot="c"

Tout ceci fonctionne en sortie sans problème, par contre il faut bien sur gérer les entrée avec iptables, en fonction des ports en écoute sur les différents DomU
Par exemple rediriger tous les flux à destination du port 25 vers l'ip locale 192.168.1.2/24

Voiçi un exemple des règles iptables que j'utilise:

$iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 25 -j DNAT --to 192.168.1.2:25
$iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 2222 -j DNAT --to 192.168.1.2:22
$iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 443 -j DNAT --to 192.168.1.2:443
$iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 7071 -j DNAT --to 192.168.1.2:7071
$iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 993 -j DNAT --to 192.168.1.2:993
$iptables -A PREROUTING -t nat -p udp -i eth0 --dport 993 -j DNAT --to 192.168.1.2:993
$iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 7025 -j DNAT --to 192.168.1.2:7025
$iptables -A PREROUTING -t nat -p udp -i eth0 --dport 7025 -j DNAT --to 192.168.1.2:7025

Cela fonctionne fort bien, si on cherche à joindre mon serveur de mail de l'extérieur, les paquets sont redirigés vers l'ip 192.168.1.2
Si mon serveur de mail veut causer à l'exterieur, il envoit à sa passerelle par défaut qui n'est autre que br0, le tout est routé et masqueradé pour aller à l'extérieur.



Tout cela fonctionnait à merveille, mais un amis m'a demandé, si je pouvais lui héberger son site Web/photo a grande audience sur ma plateforme.
Ce dernier en avait franchement marre du support et des performances de son hebergement mutualisé.

Certes je n'ai pas dit non puisque j'aime les défis.

Comme tout site Web, son site doit écouter sur le port 80, manque de pot j'ai déjà un site Web sur mon DomU wwwinfo16 qui écoute sur ce même port....

Plusieurs alternatives s'offre à moi:

  1. héberger son site sur mon serveur wwwinfo16 , avec la magie des vhosts, cela n'est pas compliqué
  2. Monter un serveur de reverse proxy type nginx et diriger soit tu mon serveur soit sur l'autre en fonction de la demande
  3. Activer une ip failover sur le serveur dedibox et l'attribuer à un DomU particulier qui sera en mode routed avec sa probre adresse IP publique
Comme j'aime les nouvelles expériences j'ai tenté l'option 3...

J'ai décidé de monter un nouveau serveur virtuel dédié au site de mon ami que nous appelerons siteclient qui aura sa propre adresse ip publique et qui utilisera le mode routed de Xen...
Ainsi de l'extérieur ce serveur sera totalement disponible sur cette ip publique ( tous les ports qu'on aura décider d'ouvrir)

On veut en fait faire cela:

routed


Tout cela est bien joli mais par quoi commencer ?

J'ai commencé par louer une adresse ip supplémentaire sur la dédibox afin d'avoir une autre ip publique.
Chez dédibox les routeur cisco sont configurés de telle sorte que chaque IP correspond à une adresse Mac bien particulière.

Autrement dit il faut absolument que mon ip publique failover  soit relié à une adresse mac Virtuelle Xen qui sera l'adresse mac du domU siteclient

La console dedibox est bien faite sur ce point, on choisi son ip publiqe failover et il nous fournisse une adresse mac virtuelle en fonction de notre plateforme de virtualisation.

dedi

On se retrouve avec notre ip et notre mac...

Le problème est que toute ma config est basée sur le nat et vif-bridge...

Il faut donc commencer par modfier le fichier /etc/xen/xend-config.sxp
On commente le network-script car on ne veut plus que les règles nat s'applique au lancement de xen

#(network-script network-nat)

(vif-script 'vif-bridge bridge=br0')

Par contre je laise le vif-script en bridge car je veux tout de même que par défaut mes vm soit attaché au bridge ( en effet la plupart des vm que je crées son en nat)

Dans ce cas comment xen va savoir si il faut faire du nat ou du routed pour les domU ??
Et bien c'est dans le fichier de conf de la vm qu'on va lui indiquer pour le mode routed.

Voici le fichier de conf  de siteclient:

######VM PARAM####

name="siteclient"

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"

#####PVM-SUSE#####

#builder="linux"

#bootloader = '/usr/lib/xen/boot/domUloader.py'

#bootargs = '--entry=hda1:vmlinuz-xen,initrd-xen'

#root="/dev/hda3"

######DEV#########

vfb=[ 'type=vnc,vncunused=1', ]

vif = ['type=netfront,mac=00:16:3e:00:00:28,script=vif-route,ip=88.190.x.x/32']

disk=[ 'phy:/dev/vg0/lv11,xvda,w','phy:/dev/vg0/lv12,xvdb,w', ]

boot="c"

Grace à cela xen va savoir précisément que la mac de la vm sera 00:16:3e:00:00:28 et qu'il devra router l'ip 88.190.x.x/32

Après avoir préparé votre DomU comme d'habitude avec un template de Ubuntu 10.04, il reste une derniere chose importante à faire, configurer la conf réseau au sein même du domU
Notemment l'ip et la passerelle...

Voici un extrait du fichier /etc/network/interfaces de la vm site client.

auto eth0

iface eth0 inet static

    address 88.190.x.x # votre ip failover

    netmask 255.255.255.0

    network 88.190.224.0

    broadcast 88.190.224.255


    post-up route add -host 88.190.14.1/32 dev eth0

    post-up route add default gw 88.190.14.1



Attention c'est la que ca se complique, la passerelle de votre domU est en fait la même que votre Dom0 d'ou les post-up pour créer des routes statiques.

Pour finir, il ne faut pas oublier que l'on à commenté le network-nat de Xen par conséquent il va falloir creer des règles iptables afin que nos domU nats fonctionnent toujours:

notemment:

echo 1 > /proc/sys/net/ipv4/ip_forward

$iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j  MASQUERADE

Oui en effet on ne veut plus tout masqueradé.. seulement les paquet en provenance de 192.168.1.0


De même si vous vous souvenez les paquets qui arrivent de l'extérieur à destination de votre ip publique vers le port 80 (failover ou pas d'ailleurs) sont redirigés vers 192.168.1.1

Mais cela n'est plus souhaitable, puisque des paquets à destination de siteclient vont aussi arriver sur le port 80

Iptables doit dont distinguer les 2, c'est pour cela qu'il faut etre plus préçis dans nos règles nat et distinguer a qui sont destiner les paquets, l'ip publique ou l'ip failover:

$iptables -t nat -A PREROUTING -i eth0 -p tcp -d 88.190.14.x --dport 80 -j DNAT --to-destination 192.168.1.1:80 #ip publique

ainsi seul les paquets à destination de mon ip publique de base seront natés vers mon domU web :)