Xen avec Bonding + Vlan Tagging

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Aussi puissante et flexible qu'elle puisse être, la configuration réseau de Xen s'apparente souvent à un parcours du combattant dés qu'on sort un tant soit peu des sentiers battus.

Pour ma part, j'ai eu récemment à mettre en place une solution à base de Xen dans une topologie réseau un peu particulière. En effet, chacun des serveurs où Xen est déployé disposait de 2 adaptateurs ethernet, chacun disposant de 2 interfaces ethernet gigabits. L'objectif était d'exploiter au maximum les différentes interfaces ethernet en offrant à la fois tolérance de panne et répartition de charge. Pour ajouter encore un peu de piment le réseau était segmenté en VLAN, chaque VLAN segmentant le réseau par fonction (DMZ, LAN, ADMIN, ...).

Les différents points qui nous intéressent ici au niveau administration système sont :

Après quelques recherches sur le Net, on se rend rapidement compte qu'il sera nécessaire de créer soit même un fichier network-script pour Xen. Honte sur moi, je ne m'en suis vraiment pas senti capable (trop compliqué/je ne connais pas python/c'est encore trop obscure pour moi tout ça). J'ai donc décidé de déporter le problème de Xen au système d'exploitation hôte, la plus grande partie de la configuration intervenant au niveau de ce dernier (ici une debian Etch), Xen venant juste utilisé ce qui existe déjà.

L'objectif final est le suivant :

Xenvlanbond.png

Faîtes pas gaffe à bond0, seul bond1, eth1 et eth2 nous intéressent ici.

2 Configuration du channel bonding

Il faut d'abord configurer et charger le module bonding. Pour cela, sous debian, rendez vous dans /etc/modprobe.d/arch/i386 (même si vous êtes sur une archi x86_64) :

# Channel bonding configuration
#
# mode=802.3ad
#        Use 802.3ad for link aggregation (require LACP compatible switch and
#        additionnal switch configurations)
# miimon= 100
#       MII monitoring frequency in ms
# use_carrier=0
#       Use an alternative and deprecated method (ethtool ioctls) to monitor
#       link status. Works better with this mode (maybe network drivers issues)
# lacp_rate=fast
#       Transmit LACPDU packet each second instead of each 30 seconds
# max_bonds=2
#       Indicate that there's 2 bonding device (bond0 and bond1) even if
#       only bond0 is explicitely configured. With max_bonds options there's
#       no way to configure separately each bond device.
#       NOTE : -o bond# (better) seems not to be supported
alias bond0 bonding
options bond0 mode=802.3ad miimon=100 use_carrier=0 lacp_rate=fast max_bonds=2

Oui je sais je précise ici uniquement la configuration de bond0. Cependant, en jouant avec la valeur de max_bonds on configure le nombre d'interface voulu. Malgré ce qui est précisé dans le fichier bonding.txt.gz de la documentation linux (aptitude install linux-doc) je n'ai pas réussi à avoir une configuration par interface. Le kernel est celui fournit par défaut sous debian Etch.

2.1 Configuration de l'interface bond1

Il faut ensuite éditer le fichier /etc/network/interfaces comme suit :

iface bond1 inet manual
       pre-up /sbin/ifconfig eth0 up
       pre-up /sbin/ifconfig eth3 up
       pre-up /sbin/ifconfig bond1 up
       pre-up /sbin/ifenslave bond1 eth0
       pre-up /sbin/ifenslave bond1 eth3
       post-down /sbin/ifenslave -d bond1 eth3
       post-down /sbin/ifenslave -d bond1 eth0
       post-down /sbin/ifconfig eth0 down
       post-down /sbin/ifconfig eth3 down
       post-down /sbin/ifconfig bond1 down

Rien de bien compliqué ici. Remarquez quand même plusieurs choses :

  • Il est nécessaire d'installer le packet ifenslave-2.6.
  • J'utilise la directive pre-up à la place de up qu'on retrouve plus souvent. J'ai en effet eu des comportements bizarres (du type interface non montée) avec cette dernière.
  • Aucune configuration IP n'est précisé. On reste au niveau de la couche 2 du modèle OSI.

À partir de ce moment, on peut s'amuser à monter et à démonter notre interface bond1 :

ifup bond1
ifdown bond1

3 VLAN

Au dessus de cette interface bond1 on va maintenant mettre en place une interface par vlan. Il faudra d'abord installer le packet vlan :

# vlan 3 = LAN
iface vlan3 inet manual
        vlan-raw-device bond1
        pre-up /sbin/ifup bond1
        pre-up /sbin/ifconfig bond1 up
        pre-up /sbin/modprobe 8021q
 
# vlan 2 = DMZ
iface vlan2 inet manual
        vlan-raw-device bond1
        pre-up /sbin/ifup bond1
        pre-up /sbin/ifconfig bond1 up
        pre-up /sbin/modprobe 8021q

Remarquez encore l'utilisation de la directive pre-up (c'est vraiment la seule qui m'a donné satisfaction) et le chargement du module s'occupant du VLAN (norme 8021.Q).

4 Création des bridges pour les DomU

Il faut d'abord comprendre qu'un bridge logiciel sous Linux fonctionne exactement de la même manière qu'un switch physique. Dans la vie courante (d'un informaticien quoi), ce que nous allons faire ici s'apparente juste à :

  • Prendre un switch
  • Brancher des câbles réseaux dessus
  • Evidemment, chaque câble est relié à un ordinateur

Dans mon cas particulier, j'ai 2 bridges à créer : 1 au dessus du VLAN DM2, l'autre au dessus du VLAN LAN

# xen bridge for hosts which needs LAN network
auto xenbrlan
iface xenbrlan inet dhcp
        pre-up /sbin/ifup vlan3
        pre-up /sbin/ifconfig vlan3 up
        pre-up /usr/sbin/brctl addbr xenbrlan
        pre-up /usr/sbin/brctl addif xenbrlan vlan3
        pre-up /usr/sbin/brctl setfd xenbrlan 0
        post-down /usr/sbin/brctl delif xenbrlan vlan3
        post-down /usr/sbin/brctl delbr xenbrlan
        post-down /sbin/ifdown vlan3
 
# xen bridge for hosts which needs DMZ network
auto xenbrdmz
iface xenbrdmz inet manual
        pre-up /sbin/ifup vlan2
        pre-up /sbin/ifconfig vlan2 up
        pre-up /usr/sbin/brctl addbr xenbrdmz
        pre-up /usr/sbin/brctl addif xenbrdmz vlan2
        pre-up /usr/sbin/brctl setfd xenbrdmz 0
        post-down /usr/sbin/brctl delif xenbrdmz vlan2
        post-down /usr/sbin/brctl delbr xenbrdmz
        post-down /sbin/ifdown vlan2

Notez que comme tous switch qui se respecte, nos bridges xenbrlan et xenbrdmz n'ont pas besoin d'adresse IP (c'est un dispositif de couche 2) pour fonctionner. À partir de ce moment on peut s'amuser à monter et démonter nos bridges à la volée

ifup xenbrlan xenbrdmz
ifdown xenbrlan xenbrdmz

5 Configuration de Xen

La seule petite difficulté ici et de créer une petit script qui va permettre l'utilisation de 2 bridges différents. Pour cela, on va créer un fichier /etc/xen/script/my-network-bridge comme suit :

#!/bin/sh
dir=$(dirname "$0")
 
"$dir/network-bridge" "$@" vifnum=0 bridge=xenbrlan
"$dir/network-bridge" "$@" vifnum=1 bridge=xenbrdmz

Il faudra également préciser à Xen d'utiliser notre script en lieu et place de celui par défaut. Pour cela, rendez-vous dans le fichier xend-config.sxp et remplacez (network-script network-bridge) par (network-script 'my-network-bridge').

Il ne reste plus qu'à préciser dans la configuration de chacun des DomU le bridge que l'on veut utiliser :

vif     = ['mac=02:00:00:00:00:01, bridge=xenbrdmz'] 

Vous pouvez maintenant démarrer vos VM :-)

6 Ressources

http://anothergeekwebsite.com/fr/2007/06/xen-vlan-et-bonding-oui-oui-tout-ca