10. Communications réseau avec un commutateur virtuel

Sur les systèmes GNU/Linux, il existe une grande variété de solutions d'interconnexion réseau entre système hôte et systèmes virtuels. Il se trouve justement que l'interconnexion réseau est la préoccupation principale du site inetdoc. Il est donc essentiel de choisir les outils qui offrent le maximum de fonctionnalités. Le commutateur virtuel occupe une place essentielle dans une solution de virtualisation moderne.

Cette section présente la configuration du commutateur virtuel Open vSwitch. Ce commutateur comprend une partie noyau ainsi que des processus dans l'espace utilisateur. La partie noyau exploite la partie commutation de circuit de celui-ci. Dans le jargon, cette partie est connue sous le nom de Forwarding plane ou encore Forwarding Information Base (FIB). Côté espace utilisateur, on trouve les outils de configuration tels que ovs-vsctl et plusieurs démons de gestion des ports et des VLANs. Il faut ajouter que cet outil exploite les fonctions de routage (commutation de paquets) déjà présentes dans le noyau Linux.

Open vSwitch est une pièce maîtresse des architectures d'interconnexion de systèmes virtualisés. Il est présent dans la plupart des solutions intégrées de la famille du Software-defined networking. L'intégration sort du champ couvert par ce guide. On se contente ici de présenter le fonctionnement du commutateur virtuel à l'échelle unitaire. La topologie minimaliste présentée dans la suite correspond à la vue ci-dessous.

Tableau 1. Plan d'adressage de la topologie étudiée

Système Interface Adresse IPv4 Rôle
Machine virtuelle eth0 203.0.113.130/26 Interface réseau de la machine virtuelle
Système hôte sw0-vlan2 203.0.113.129/26 Passerelle par défaut de la machine virtuelle
Système hôte eth0 203.0.113.2/26 Interface réseau du système hôte
Routeur indéfinie 203.0.113.1/26 Passerelle par défaut du système hôte

Installation du commutateur

L'installation du paquet openvswitch-switch comprend la configuration système des outils et des démons de gestion de la configuration du commutateur. Voici quelques éléments relevés après l'installation du paquet.

  • Paquets installés

    $ aptitude search ~iopenvswitch
    i A openvswitch-common      - Open vSwitch common components
    i   openvswitch-switch      - Open vSwitch switch implementations
  • Partie noyau

    $ lsmod | grep openvswitch
    openvswitch            63837  0 
    vxlan                  30915  1 openvswitch
    gre                    12957  1 openvswitch
    libcrc32c              12426  1 openvswitch
  • Démons de l'espace utilisateur

    $ pstree
    init─┬─acpid
         ├─atd
         ├─cron
         ├─dbus-daemon
         ├─exim4
         ├─6*[getty]
         ├─ovs-vswitchd───ovs-vswitchd───ovs-vswitchd
         ├─ovsdb-server───ovsdb-server
         ├─rsyslogd───3*[{rsyslogd}]
         └─udevd
  • État de la configuration

    $ sudo ovs-vsctl show
    cd95ab0d-643d-4a23-bae3-2e6c900a367f
        ovs_version: "1.9.3"

Configuration du commutateur

Pour configurer l'interconnexion présentée en début de section, on doit passer par les étapes suivantes.

  • Création du commutateur sw0

    $ sudo ovs-vsctl add-br sw0
  • Création de l'interface réseau pour le VLAN numéro 2

    $ sudo ovs-vsctl add-port sw0 sw0-vlan2 tag=2 -- set Interface sw0-vlan2 type=internal
  • Création du «cordon de brassage» tap2

    $ sudo ip tuntap add mode tap dev tap2 group kvm
  • Raccordement du «cordon de brassage» tap2 au commutateur et affectation du port correspondant au VLAN numéro 2

    $ sudo ovs-vsctl add-port sw0 tap2 tag=2
  • Visualisation de la configuration

    $ sudo ovs-vsctl show
    cd95ab0d-643d-4a23-bae3-2e6c900a367f
        Bridge "sw0"
            Port "sw0-vlan2"
                tag: 2
                Interface "sw0-vlan2"
                    type: internal
            Port "tap2"
                tag: 2
                Interface "tap2"
            Port "sw0"
                Interface "sw0"
                    type: internal
        ovs_version: "1.9.3"
[Note] Modes accès ou trunk ?

Sur un commutateur Open vSwitch un port est par défaut en mode trunk ; c'est à dire qu'il reçoit le trafic de tous les VLANs «présents sur les autres ports». Dans l'exemple présenté ici, on restreint l'utilisation des ports liés aux interfaces sw0-vlan2 et tap2 au seul VLAN numéro 2. On peut donc considérer que ces deux ports sont en mode accès puisqu'ils ne «voient» que le trafic d'un VLAN unique.

Activation des interfaces réseau et du routage

Pour que la configuration du commutateur soit effective, il faut que toutes les nouvelles interfaces réseau soient actives. De plus, on doit s'assurer que la fonction de routage est activée sur le système hôte.

  • Activation des interfaces

    $ for intf in sw0 sw0-vlan2 tap2; do sudo ip link set dev $intf up; done
  • État des interfaces sur le système hôte

    $ ip link ls
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN \
                                     mode DEFAULT group default 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP \
                                     mode DEFAULT group default qlen 1000
        link/ether ba:ad:00:ca:fe:00 brd ff:ff:ff:ff:ff:ff
    4: sw0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN \
                                     mode DEFAULT group default 
        link/ether 16:8f:91:2c:e0:41 brd ff:ff:ff:ff:ff:ff
    5: sw0-vlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN \
                                     mode DEFAULT group default 
        link/ether 8e:2a:a2:ff:d9:fb brd ff:ff:ff:ff:ff:ff
    6: tap2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master sw0 state UP \
                                     mode DEFAULT group default qlen 500
        link/ether 46:12:48:6b:be:d4 brd ff:ff:ff:ff:ff:ff

La fonction de routage fournie par le noyau Linux peut être activée via le fichier /etc/sysctl.conf. Il suffit de décommenter les entrées correspondantes. Pour appliquer les paramètres définis dans le fichier on utilise l'instruction $ sudo sysctl -p. On peut vérifier les paramètres en n'affichant que les lignes actives de ce même fichier.

$ egrep -e '(^$|^#)' -v /etc/sysctl.conf 
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.log_martians = 1

Lancement du système virtuel

Comme dans le cas de la Section 8, « Communications réseau en mode utilisateur », on utilise une script qui rassemble toutes les options de configuration utiles : ovs-startup.sh. Le code de ce script est donné en Section A.2, « Communication réseau avec commutateur virtuel Open vSwitch ». La copie d'écran ci-dessous correspond à la topologie minimale décrite plus haut.

:~/vm$ ./scripts/ovs-startup.sh vm0-debian-testing-amd64-base.raw 1024 2

~> Machine virtuelle : vm0-debian-testing-amd64-base.raw
~> Port SPICE        : 5902
~> Mémoire RAM       : 1024
~> Adresse MAC       : ba:ad:00:ca:fe:02

Les options de ce script relatives aux fonctions réseau sont les suivantes :

-device virtio-net1,netdev=net02,mac="$macaddress"3 \
-netdev tap,ifname=tap$tapnum4,id=net0,script=no \

1

Le pilote d'interface réseau choisi utilise les fonctions présentées à la Section 4, « KVM et VIRTIO ».

2

L'identifiant de l'interface utilisé pour le script est net0.

3

L'adresse MAC de l'interface réseau est déterminée à partir du préfixe hexadécimal bad cafe et du numéro de l'interface TAP.

macaddress="ba:ad:00:ca:fe:`printf "%02x" $tapnum`"

4

Le raccordement de l'interface réseau identifiée par l'étiquette net0 se fait via le cordon de brassage (ou l'interface TAP) numéroté aussi avec la variable $tapnum du script.

Validation des communications entre système hôte et système virtuel

Pour conclure cette section, on peut valider le lien direct entre les système hôte et virtuel avec une connexion SSH. On commence par identifier l'adresse MAC au format EUI64 du système virtuel puis on l'utilise pour la connexion.

$ ip nei ls
fe80::b8ad:ff:feca:fe02 dev sw0-vlan2 lladdr ba:ad:00:ca:fe:02 STALE
fe80::503c:b3ff:febe:b94b dev eth0 lladdr 52:3c:b3:be:b9:4b router REACHABLE

$ ssh etu@fe80::b8ad:ff:feca:fe02%sw0-vlan2
etu@fe80::b8ad:ff:feca:fe02%sw0-vlan2's password: 
Linux nested-vm0 3.12-1-amd64 #1 SMP Debian 3.12.6-2 (2013-12-29) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
No mail.
Last login: Thu Jan 23 20:10:50 2014 from fe80::8c2a:a2ff:feff:d9fb%eth0
etu@vm0:~$

Vue du système virtuel avec la configuration IP complète, on obtient les informations suivantes.

$ ip nei ls
fe80::8c2a:a2ff:feff:d9fb dev eth0 lladdr 8e:2a:a2:ff:d9:fb router DELAY
203.0.113.129 dev eth0 lladdr 8e:2a:a2:ff:d9:fb STALE

$ ip addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP \
                                              group default qlen 1000
    link/ether ba:ad:00:ca:fe:02 brd ff:ff:ff:ff:ff:ff
    inet 203.0.113.130/26 brd 203.0.113.191 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::b8ad:ff:feca:fe02/64 scope link 
       valid_lft forever preferred_lft forever

$ ip ro ls
default via 203.0.113.129 dev eth0
203.0.113.128/26 dev eth0  proto kernel  scope link  src 203.0.113.130