Xen avec Bonding + Vlan Tagging
Contents
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 :
- Channel Bonding
- VLAN Tagging
- Bridging
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 :
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