Debian logo [inetdoc.LINUX]

12. Communications réseau en mode commutation virtuelle

Dans ce contexte, l'objectif est de faire communiquer les machines virtuelles entre elles. Pour ce faire, on utilise un commutateur virtuel lui aussi : Virtual Distributed Ethernet. Ce commutateur est un processus utilisateur appelé vde_switch. Il est fourni par le paquet vde2. Voici un exemple de topologie réseau utilisant vde_switch.

[Note] Note

C'est cette topologie de base que j'utilise systématiquement pour les travaux pratiques de la série Administration système en réseau. En effet, on retrouve une machine virtuelle de type serveur et une autre de type client. Le système hôte joue le rôle de passerelle donnant accès à l'Internet (et|ou) à un système distant.

On trouve ci-dessous les attributions d'adresses IPv4 en fonction des types d'interfaces. Bien entendu, ces adresses ne sont que des exemples utiles à l'interprétation des étapes de mise en place de la topologie illustrée.

Tableau 2. Plan d'adressage IPv4 pour les communications point à point

Système Interface Adresse IPv4
hôte eth0 192.168.1.1/24
hôte tap0 192.200.0.1/24
machine virtuelle «serveur» eth0 192.200.0.2/24
machine virtuelle «client» eth0 192.200.0.3/24
distant eth0 192.168.1.7/24

12.1. Interface TAP

La configuration de l'interface TAP sur le système hôte reprend les éléments présentés précédemment Section 10.2, « Configuration d'une interface TAP ».

$ ./scripts/tap-up.sh tap0 192.200.0.1/24
$ /sbin/ifconfig tap0
tap0      Link encap:Ethernet  HWaddr 00:ff:8c:db:de:99
          inet adr:192.200.0.1  Bcast:192.200.0.255  Masque:255.255.255.0
          adr inet6: fe80::2ff:8cff:fedb:de99/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:47 overruns:0 carrier:0
          collisions:0 lg file transmission:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

12.2. Table de routage et traduction d'adresses (NAT)

L'objectif principal des opérations présentées ici est de «préserver» la table de routage du système hôte. En effet, ce système correspond le plus souvent à un ordinateur portable utilisé pour les enseignements. La connexion au réseau public de ce portable peut utiliser plusieurs types d'interfaces différentes : Ethernet filaire, Wifi (et|ou) VPN. Il faut donc que les instances de machines virtuelles puissent avoir accès aux réseaux réels externes via n'importe laquelle de ces différentes interfaces.

On commence donc par activer le routage des paquets IPv4 au niveau du noyau Linux.

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

Ensuite, on utilise les fonctions de traduction d'adresses IP sources (S-NAT) dynamiques du noyau Linux à l'aide de l'outil de configuration ipatbles.

# iptables -t nat -A POSTROUTING -s 192.200.0.0/24 -j MASQUERADE

La cible MASQUERADE permet l'utilisation dynamique de n'importe quelle interface de sortie du système hôte vers le réseau public. Ensuite, la traduction d'adresses se fait sur la base des adresses IP sources du réseau des instances de machines virtuelles desservi par le commutateur vde_switch. Ces adresses sources sont désignées à l'aide de l'option -s 192.200.0.0/24.

On valide le fonctionnement de la traduction d'adresses en consultant l'état des chaînes correspondantes.

# iptables -vL -t nat
Chain PREROUTING (policy ACCEPT 56 packets, 4650 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 220 packets, 20710 bytes)
 pkts bytes target     prot opt in     out     source               destination
   32  1966 MASQUERADE  all  --  any    any     192.200.0.0/24       anywhere

Chain OUTPUT (policy ACCEPT 220 packets, 20710 bytes)
 pkts bytes target     prot opt in     out     source               destination

Il est aussi possible, avec des outils comme iptsate, de visualiser en temps réel l'état des tables de suivi de communication du système de filtrage netfilter/iptables.

12.3. Commutateur virtuel

Le commutateur virtuel vde_switch doit être lancé avant les instances de machines virtuelles pour que le brassage des connexions puisse se faire. Voici un exemple de commande de lancement du commutateur suivi de la visualisation du socket et du processus correspondant.

$ vde_switch -d --tap tap01 -s /tmp/vde.ctl2 -M /tmp/vde.mgmt3

$ $ ll /tmp/vde*4
srw------- 1 phil phil  0 jun  1 17:29 /tmp/vde.mgmt

/tmp/vde.ctl:
total 0
srwx------ 1 phil phil 0 jun  1 17:29 ctl

$ pgrep -l -u phil vde5
11198 vde_switch

1

Avec l'option --tap, le commutateur virtuel est «connecté» au système hôte via une interface TAP comme dans le cas des communications point à point. Cette connexion correspond au lien vers le réseau externe «réel» : le réseau local du système hôte et l'Internet. Le réseau local auquel appartient cette interface TAP apparaît dans la table de routage du système hôte.

# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.200.0.0     0.0.0.0         255.255.255.0   U     0      0        0 tap0
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1

2

L'option -s désigne le socket de communication sur lequel les machines virtuelles vont se brancher. Ce socket sert au brassage des connexions de toutes les machines virtuelles.

3

L'option -M désigne le socket de gestion de la configuration du commutateur virtuel. Ces opérations se font via ce socket dédié. Le paquet vde2 fournit un programme utilisateur pour l'utiliser : unixterm.

4 5

On observe que l'utilisateur normal phil est propriétaire des sockets de communication et de gestion du commutateur. Comme les machines virtuelles sont elles même des processus utilisateur, il est nécessaire que ces processus aient la même identité (uid) que le socket.

Il est possible de combiner le script d'initialisation de l'interface TAP (voir Section 10.2, « Configuration d'une interface TAP ») et le lancement du commutateur virtuel à l'aide du script suivant :

#!/bin/bash

# $Id: vde-up.sh 1305 2008-06-08 20:59:09Z latu $
# Run this virtual ethernet switch setup script before KVM/QEMU launch
# These scripts should be located in ~/bin as they are run at normal user level

if [ -z $1 ] || [ -z $2 ]; then
	echo "Usage: vde-up.sh {tap interface} {IP address}"
	exit 1
fi

~/bin/tap-up.sh $1 $2
vde_switch -d --tap $1 -s /tmp/vde.ctl -M /tmp/vde.mgmt

Avec cette combinaison de scripts, la séquence d'initialisation de l'interface TAP et du commutateur virtuel associé devient :

$ vde-up.sh tap0 192.200.0.1/2

12.4. Instances de machines virtuelles

Le lancement des machines virtuelles sur le système hôte se fait en fonction du brassage à réaliser. Il faut désigner le socket de communication avec le commutateur virtuel et l'interface de réseau local utilisée par la machine virtuelle.

$ vdeq qemu -hda vm0-debian-i386.qcow \
-m 128 \
-net vde,sock=/tmp/vde.ctl1 \
-net nic,vlan=0,macaddr=52:54:00:12:34:622 &

$ vdeq qemu -hda vm1-debian-i386.qcow \
-m 128 \
-net vde,sock=/tmp/vde.ctl3 \
-net nic,vlan=0,macaddr=52:54:00:12:34:634 & 

1 3

Quelque soit l'instance de machine virtuelle initialisée, on utilise le socket unique de communication avec le commutateur virtuel. Dans cet exemple, le brassage des ports du commutateur virtuel se fait dynamiquement dans l'ordre des connexions libres. Les informations de brassage sont visualisées dans la Section 12.5, « Configuration du commutateur virtuel » et les deux instances lancées occupent les ports numérotés 002 et 003.

Ces informations se retrouvent aussi au niveau de l'arborescence des sockets utilisateur.

$ ll /tmp/vde*
srwx------ 1 phil phil  0 jun  1 17:53 /tmp/vde.ctl.19747-00000
srwx------ 1 phil phil  0 jun  1 18:03 /tmp/vde.ctl.21781-00000
srw------- 1 phil phil  0 jun  1 17:29 /tmp/vde.mgmt

/tmp/vde.ctl:
total 0
srwx------ 1 phil phil 0 jun  1 17:53 002
srwx------ 1 phil phil 0 jun  1 18:03 003
srwx------ 1 phil phil 0 jun  1 17:29 ctl

Dans l'exemple ci-dessus, les valeurs 19747 et 21781 correspondent aux numéros des deux processus de machine virtuelle sur le système hôte.

2 4

Si les interfaces Ethernet des machines virtuelles sont configurées au niveau du système d'exploitation invité, il est malgré tout nécessaire de préciser le paramétrage matériel de ces interfaces au lancement d'une instance. En effet, l'adresse physique MAC d'une machine virtuelle est toujours la même par défaut. C'est la raison pour laquelle chaque machine virtuelle est lancée avec une adresse MAC distincte. Il faut se rappeler que la commutation Ethernet réelle ou virtuelle est basée sur la constitution d'une table de correspondance entre adresses MAC et numéro de port. L'état de cette table de correspondance est disponible via l'interface de gestion du commutateur vde_switch. Voir Section 12.5, « Configuration du commutateur virtuel ».

De plus, il est possible d'utiliser des réseaux locaux virtuels (VLANs) en constituant des groupes logiques de ports de commutateur. Ici, les deux instances de machines virtuelles appartiennent au même groupe logique : le VLAN numéro 0.

12.5. Configuration du commutateur virtuel

La visualisation et la gestion de la configuration du commutateur virtuel sur le système hôte se fait à l'aide d'un socket dédié présenté lors du lancement du processus vde_switch (Section 12.3, « Commutateur virtuel »).

On accède à l'interface de gestion du commutateur virtuel via unixterm, un outil fourni avec le paquet vde2.

Le jeu des commandes disponibles sur la configuration du commutateur est disponible à partir de la commande help. Voici quelques exemples basiques de commandes de visualisation de l'état des connexions.

$ unixterm /tmp/vde.mgmt
VDE switch V.2.2.0-pre2
(C) Virtual Square Team (coord. R. Davoli) 2005,2006,2007 - GPLv2

vde$ showinfo1
0000 DATA END WITH '.'
VDE switch V.2.2.0-pre2
(C) Virtual Square Team (coord. R. Davoli) 2005,2006,2007 - GPLv2

pid 14433 MAC 00:ff:c6:46:c5:14 uptime 2079
mgmt /tmp/vde.mgmt perm 0600
unsent_pktq_len 0
.
1000 Success

vde$ port/allprint2
0000 DATA END WITH '.'
Port 0001 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
 IN:  pkts       2218          bytes              2966493
 OUT: pkts       1480          bytes               106042
  -- endpoint ID 0008 module tuntap      : tap0
Port 0002 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
 IN:  pkts       1518          bytes               109167
 OUT: pkts       2292          bytes              2972334
  -- endpoint ID 0009 module unix prog   : vdeqemu user=phil PID=19747\
  SOCK=/tmp/vde.ctl.19747-00000
Port 0003 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
 IN:  pkts         73          bytes                 5788
 OUT: pkts         48          bytes                 3893
  -- endpoint ID 0011 module unix prog   : vdeqemu user=phil PID=21781\
  SOCK=/tmp/vde.ctl.21781-00000
.
1000 Success

vde$ hash/print3
0000 DATA END WITH '.'
Hash: 0048 Addr: 52:54:00:12:34:63 VLAN 0000 to port: 003  age 1 secs
Hash: 0088 Addr: 52:54:00:12:34:62 VLAN 0000 to port: 002  age 1 secs
.
1000 Success

1

La commande showinfo donne les paramètres du socket de gestion dédié et l'adresse MAC interne du commutateur.

2

La commande port/allprint donne la liste des ports actifs du commutateur ainsi que les paramètres associés : numéro de port et de VLAN, interface ou socket associé au port, référence du processus utilisateur de machine virtuelle.

3

La commande hash/print affiche la table de correspondance entre les adresses MAC et les numéros de ports actifs. Tout comme dans une commutateur réel, cette table est rafraîchie dynamiquement en fonction du trafic qui transite sur un port.

On retrouve ici les deux adresses MAC données lors du lancement des instances de machines virtuelles Section 12.4, « Instances de machines virtuelles ».