Debian logo [inetdoc.LINUX]

10. Communications réseau en mode point-à-point

Relativement au contexte précédent, ce mode permet de faire «apparaître» une interface réseau de machine virtuelle sur le système hôte. Cette configuration nécessite donc l'utilisation de droits super-utilisateur pour administrer les interfaces. Ces droits peuvent être délégués «à l'acte» via sudo ou utilisés directement à la console.

10.1. Fonction TUN/TAP du noyau Linux

La solution retenue pour les communications réseau entre système hôte et machine virtuelle utilisent la fonction TUN/TAP du noyau Linux.

TUN/TAP est une fonction de réception et de transmission de paquets vers les programmes de l'espace utilisateur. Cette fonction peut être vue comme une simple interface point à point ou Ethernet qui, au lieu de recevoir les paquets d'un média physique, les reçoit du programme de l'espace utilisateur. Cette même interface, au lieu d'envoyer les paquets vers un média physique, les transmet au programme de l'espace utilisateur.

Dans le contexte de ce document, le programme de l'espace mémoire utilisateur est l'instance virtuelle de système d'exploitation. L'interface réseau TUN/TAP devient un canal de communication réseau entre le système hôte et un système émulé via KVM (et|ou) QEMU.

10.2. Configuration d'une interface TAP

La création d'une interface TAP doit se faire par l'intermédiaire d'un programme de l'espace mémoire utilisateur. J'ai relevé deux méthodes de création d'interface à partir des outils de deux paquets de la distribution Debian GNU/Linux.

User-Mode Linux, uml-utilities

Ce paquet contient les programmes utilitaires liés à la solution User-Mode Linux qui permet «d'imbriquer» l'exécution de plusieurs noyaux Linux. L'utilitaire de manipulation des interfaces TUN/TAP est baptisé tunctl. Voici un exemple de séquence de configuration d'une interface TAP.

# tunctl -d tap0
Set 'tap0' nonpersistent
# tunctl -u etu -t tap0
Set 'tap0' persistent and owned by uid 1000
# ifconfig tap0
tap0      Link encap:Ethernet  HWaddr 00:ff:3b:71:37:bb
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Comme la solution User-Mode Linux n'est pas utilisée dans le contexte de ce document, cet outil ne sera pas utilisé par la suite.

OpenVPN, openvpn

OpenVPN est une solution très populaire de mise en œuvre de réseaux privés virtuels (VPN) ou tunnels IP utilisant les fonctions de chiffrement, de certification et d'authentification de la bibliothèque OpenSSL.

La commande # openvpn --mktun --dev tap0 suffit à la création de l'interface TAP.

Comme OpenVPN est utilisé par ailleurs dans l'infrastructure des travaux pratiques de la filière STRI, c'est cette solution qui est retenue pour la création des interfaces TAP. Les informations de la version utilisée pour les manipulations sont les suivantes :

# dpkg -l openvpn |grep ^ii
ii  openvpn          2.1~rc7-1                virtual private network daemon

# openvpn --mktun --dev tap0
Wed May 14 21:22:52 2008 TUN/TAP device tap0 opened
Wed May 14 21:22:52 2008 Persist state set to: ON
# ifconfig tap0
tap0      Link encap:Ethernet  HWaddr 00:ff:11:82:55:fe
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Si on retient l'utilisation d'openvpn pour créer l'interface tap0, il est préférable d'utiliser un script qui permet aussi de configurer cette interface sur le système hôte.

#!/bin/bash

# $Id: tap-up.sh 1305 2008-06-08 20:59:09Z latu $
# Run this tap interface setup script before KVM/QEMU launch
# Sudo should be configured with the two following tools allowed from user level
# user    ALL = NOPASSWD: /sbin/ifconfig, /usr/sbin/openvpn
# These scripts should be located in ~/bin as they are run at normal user level

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

TAP=`/sbin/ifconfig 2>/dev/null|grep $1|cut -d " " -f 1`

if [ "$TAP" != "$1" ];
then
	sudo /usr/sbin/openvpn --mktun --dev $1 >/dev/null 2>&1
fi
sudo /sbin/ifconfig $1 $2

J'ai choisi de rendre l'exécution de ce script indépendante du lancement de l'instance de machine virtuelle. Même si ce n'est pas déterminant dans le mode de communication point à point, la configuration séparée de l'interface TAP correspond au cas le plus général.

Comme ce script est utilisé au niveau utilisateur normal, on suppose qu'il est stocké dans le répertoire ~/bin/. C'est dans ce répertoire que l'on retrouve l'ensemble des (programmes|scripts) exécutables propres au compte utilisateur.

10.3. Exemple d'utilisation des communications réseau en mode point à point

Voici la topologie type des communications réseau entre une machine virtuelle, un système hôte et un hôte 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 1. 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
virtuel eth0 192.200.0.2/24
distant eth0 192.168.1.7/24

Pour la suite, on considère que la configuration et le fonctionnement du réseau local de communication entre le système hôte et le système distant sont déjà validés.

  1. Configuration de l'interface TAP sur le système hôte.

    $ ./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)
    
  2. Lancement de l'instance de machine virtuelle sur le système hôte.

    $ kvm \
    -hda vm0-debian-x86_64-X11.qcow \
    -m 1024 \
    -net nic,vlan=0 1 -net tap,vlan=0,ifname=tap02,script=no 3
    

    1

    L'option -net nic indique que la machine virtuelle doit disposer d'une interface réseau (nic : network interface card) émulée. Le paramètre vlan=0 désigne le réseau local virtuel (vlan : virtual local area network) auquel cette interface est raccordée.

    2

    L'option -net tap,vlan=0,ifname=tap0 indique que l'interface TAP du système hôte doit être raccordée au même réseau local virtuel (vlan) que l'interface réseau émulée.

    3

    L'option no indique que l'on ne fait appel à aucun script d'initialisation et de configuration d'interface TAP du système hôte lors du lancement de la machine virtuelle.

  3. Mise en place des entrées statiques de la table de routage du système distant pour pouvoir joindre la machine virtuelle via le système hôte.

    # route add -net 192.200.0.0 netmask 255.255.255.0 dev eth1
    # route add -host 192.200.0.2 gw 192.200.0.1
    # ping -c 2 192.200.0.2
    PING 192.200.0.2 (192.200.0.2) 56(84) bytes of data.
    64 bytes from 192.200.0.2: icmp_seq=1 ttl=63 time=3.81 ms
    64 bytes from 192.200.0.2: icmp_seq=2 ttl=63 time=1.78 ms
    
    --- 192.200.0.2 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1007ms
    rtt min/avg/max/mdev = 1.782/2.797/3.812/1.015 ms
    

    Test de connexion à la machine virtuelle.

    :~$ ssh etu@192.200.0.2
    etu@192.200.0.2's password:
    Linux vm0 2.6.24-1-amd64 #1 SMP Fri Apr 18 23:08:22 UTC 2008 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.
    Last login: Wed May 14 22:12:46 2008 from topaze.linux.home
    etu@vm0:~$