Xen, vlan et bonding! ... oui oui tout ça!

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 :

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

1ère étape : 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ème étape : 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ème étape : 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ème étape : 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
  • évidemment, 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

#address 10.0.0.1 #netmask 255.255.255.0 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ème étape : 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']

Voilà! Bon j'essaierai de faire des modifications pour être plus clair, promis.

Comments

Avant tout, je vous remercie

Avant tout, je vous remercie beaucoup pour vos réponses.

Concernant mon installation, je ne suis pas tout a fait dans la même configuration que vous.

- J'ai une machine avec 2 interfaces réseaux ( eth0 et et eth1 )
- eth0 et eth1 sont branchés sur des ports "tagged" d'un commutateur HP Procurve ( LACP active ) ( Il y a aura bientôt 2 commutateurs pour sécuriser les liens )
- J'ai comme vous trois VLans (admin, Lan, dmz )

- Pour sécuriser mon installation, je souhaite faire un "trunk" entre eth0 et eth1 de manière à se soustraire de toute panne de réseau ( bond0 )

- l'OS ( noyau Xen-Pae : dom0 ) est censé être accessible via une adresse IP du Vlan Admin ( seuls les admin auront accès au dom0 )

- Les domU suivant leurs types seront dans le vlan ( lan ) ou le vlan ( dmz )

Mon problème de compréhension concerne la configuration du fichier interfaces pour pourvoir accéder au dom0 via une IP statique ( en fait ça n'a aucun lien avec la présence ou non de Xen sur la machine ).

- Je comprend bien la logique de constituer un trunk ( bonding ) entre les 2 ports réseaux eth ( niveau trame : couche 2 OSI )

- Je comprend bien la logique d'associer des Bridges au Vlans sur le trunk et d'associer les IP des domU uniquement dans leur config

- Mais pour le dom0 ... dans votre config, vous y accéder probablement via eth0 /eth3 ( bond0 chez vous qui héberge probablement votre dom0 ??? ). Vos domU étant accessible via vos ports eth1/eth2 (bond1)

Donc je me dis ... a quel niveau j'associe une adresse IP pour accéder à ma machine dom0 ( sur bridge xenbr0 , dans la conf des vlanb en déclarant le vlan admin dans le fichier interfaces ?)

Ci-dessous mon fichier "/etc/network/interfaces" qui ne fonctionne pas !

# 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

##################################################
# Network interfaces
##################################################
allow-hotplug eth0
allow-hotplug eth1

###################################################
# Bonding Configuration
# requirement : ifenslave-2.6 package
###################################################

iface bond0 inet manual
pre-up /sbin/ifconfig eth0 up
pre-up /sbin/ifconfig eth1 up
pre-up /sbin/ifconfig bond0 up
pre-up /sbin/ifenslave bond0 eth0
pre-up /sbin/ifenslave bond0 eth1

post-down /sbin/ifenslave -d bond0 eth1
post-down /sbin/ifenslave -d bond0 eth0
post-down /sbin/ifconfig eth1 down
post-down /sbin/ifconfig eth0 down
post-down /sbin/ifconfig bond0 down

####################################################
# VLAN configuration
# requirement : vlan package
####################################################

#
# VLAN58 : vlan Admin
#

iface vlan58 inet manual
vlan-raw-device bond0
pre-up /sbin/ifup bond0
pre-up /sbin/ifconfig bond0 up
pre-up /sbin/modprobe 8021q

#
# VLAN52 : vlan DSI
#
iface vlan52 inet manual
vlan-raw-device bond0
pre-up /sbin/ifup bond0
pre-up /sbin/ifconfig bond0 up
pre-up /sbin/modprobe 8021q

###################################################
# Bridges configuration for Xen/DomU
###################################################

#
# Bridge for Vlan58
#
auto xenbradm
iface xenbradm inet manual

address 192.168.58.22
netmask 255.255.255.0
network 192.168.58.0
broadcast 192.168.58.255
gateway 192.168.58.1

pre-up /sbin/ifup vlan58
pre-up /sbin/ifconfig vlan58 up
pre-up /usr/sbin/brctl addbr xenbradm
pre-up /usr/sbin/brctl addif xenbradm vlan58
pre-up /usr/sbin/brctl setfd xenbradm 0

post-down /usr/sbin/brctl delif xenbradm vlan58
post-down /usr/sbin/brctl delbr xenbradm
post-down /sbin/ifdown vlan58

#
# Bridge for Vlan52 - Vlan DSI
#
auto xenbrdsi
iface xenbrdsi inet manual
pre-up /sbin/ifup vlan52
pre-up /sbin/ifconfig vlan52 up
pre-up /usr/sbin/brctl addbr xenbrdsi
pre-up /usr/sbin/brctl addif xenbrdsi vlan52
pre-up /usr/sbin/brctl setfd xenbrdsi 0

post-down /usr/sbin/brctl delif xenbrdsi vlan52
post-down /usr/sbin/brctl delbr xenbrdsi
post-down /sbin/ifdown vlan52

pariviere's picture

J'ai 2 autres cartes

J'ai 2 autres cartes réseaux qui me servent pour la connexion directe au dom0 + le traffic iSCSI.

De ce que je comprends de ton cas il est inutile de bridger le vlan ADMIN car aucun domU n'y aura accès. Donc juste la configuration du vlan (attribution IP toussa en standard).

cat /etc/network/interfaces

Bonjour,

Merci pour réponse,

Finalement, je me suis lancé ce matin et je suis un peu perdu dans la configuration du fichier interface ( entre le bonding, les vlans, les bridges, )

Dans quel paragraphe on configure les adresses IP ? ...

Sans vouloir être indiscret.. vous serait-il possible de m'envoyer par email ou peut-être d'afficher le résultat final de votre fichier "interfaces" sur votre site.

Merci d'avance pour votre aide.

pariviere's picture

La concaténation des 4

La concaténation des 4 parties donne le fichier final (sauf lo)

La configuration IP se fait au niveau des lignes iface

iface xenbrlan inet dhcp

pour une configuration en dhcp. C'est la seule configuration IP que j'ai dans mes fichiers de configuration dom0. Le reste des interfaces restent en manual et c'est les machines virtuelles qui vont s'attribuer des IP.

Dom0 dans le vlan Admin ?

Bravo pour cet article.

Très clair et met en oeuvre plusieurs concepts avancés.

Etant en train de déployer une configuration similaire, j'aurai une question :
Vous évoquez au début de votre article 3 vlans (DMZ,LAN,ADMIN).

Dans votre tuto, vous mettez l'accent sur la distribution des DomU dans les 2 Vlans ( LAN et DMZ )

Vous ne traitez pas du tout du Dom0 qui à mon avis devrait être dans le vlan ADMIN (xenbr0? )

Comment de votre côté avez vous traité cet aspect ?

Merci par avance si vous pouvez me répondre

pariviere's picture

J'ai en fait 4 cartes

J'ai en fait 4 cartes réseaux : 2 sont agrégées en bond1 pour ensuite servir de support au vlan DMZ et au vlan LAN. Les 2 autres cartes sont elles agrégées en bond0 et sont utilisées pour le vlan ADMIN. A ce niveau pas du tout de Xen, c'est utilisé uniquement pour l'administration et la mise à disposition de mes volumes iSCSI.

Post new comment

The content of this field is kept private and will not be shown publicly.