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.
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.
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.
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 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
suffit à la création de l'interface TAP.# openvpn --mktun --dev tap0
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.
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.
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)
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-net tap,vlan=0,ifname=tap0
,script=no
![]()
|
L'option |
|
|
L'option |
|
|
L'option |
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:~$
Vous êtes ici :