work on tuto2

This commit is contained in:
nemunaire 2019-03-12 13:02:39 +01:00
parent 2788600d4f
commit 58e541d6ad
4 changed files with 114 additions and 107 deletions

View file

@ -4,10 +4,10 @@ Mise en place
=============
Pour réaliser ce TP, vous allez avoir besoin de créer une machine virtuelle,
possédant les caractéristiques suivantes :
possédant les caractéristiques suivantes :
- 1 disque de quelques Gio ;
- 1 lecteur de CD-ROM ;
- 1 disque de quelques Gio ;
- 1 lecteur de CD-ROM ;
- 1 interface réseau `virtio`, sur laquelle il sera possible d'obtenir une IP
permettant d'aller sur Internet.
@ -16,8 +16,8 @@ appréciation. L'ISO est réputée supportée par *Hyper-V* (Windows), *qemu*/*K
(macOS, Linux, Windows) et VMware (macOS, Windows).
L'hyperviseur qui vous laissera le plus de liberté (et avec lequel vous pourrez
apprendre le plus de choses !) est sans doute *qemu*, sous Linux ; vous pouvez
le lancer avec la commande :
apprendre le plus de choses !) est sans doute *qemu*, sous Linux ; vous pouvez
le lancer avec la commande :
<div lang="en-US">
```bash
@ -36,7 +36,7 @@ Vous pouvez télécharger l'ISO du TP depuis
<https://adlin.nemunai.re/ressources/tuto2.iso>.
Cette image contient un système Debian minimaliste, en partie préinstallé afin
de vous permettre de commencer à travailler sans plus attendre !
de vous permettre de commencer à travailler sans plus attendre !
Gérer le réseau de son hyperviseur
@ -48,7 +48,7 @@ au moins à un réseau local, pour permettre d'y apporter les mises à jour).
La première chose qu'il va falloir faire avec notre hyperviseur, est donc de
lui indiquer comment notre machine virtuelle accédera au réseau.
**Note:** Nous ne présenterons ici que les méthodes qui permettent d'obtenir un
**Note :** Nous ne présenterons ici que les méthodes qui permettent d'obtenir un
réseau ayant toutes les caractéristiques d'utilisation et de contrôle que l'on
pourrait en attendre. Nous ne verrons donc pas le mode `user` de *qemu* par
exemple.
@ -71,12 +71,12 @@ nombre d'interfaces physiques existantes.
Concrètement, l'opération est assez fastidieuse à réaliser à la main, car cela
demande de détacher le périphérique (via
<span lang="en-US">`/sys/bus/pci/devices/0000:03:00.0/driver/unbind`</span>,
par exemple pour une carte `enp0s3`) ; avant de l'assigner à notre machine
virtuelle :
par exemple pour une carte `enp0s3`) ; avant de l'assigner à notre machine
virtuelle :
<div lang="en-US">
```bash
qemu-system-x86_64 -device pci-assign,host=03:00.0
qemu-system-x86_64 [...] -device pci-assign,host=03:00.0
```
</div>
@ -84,21 +84,21 @@ qemu-system-x86_64 -device pci-assign,host=03:00.0
### Interface virtuelle
On se rend compte que la solution d'avoir une interface physique par machine
virtuelle n'est pas bien idéale et devient vite très onéreuse.
virtuelle n'est pas bien pérenne et devient vite très onéreuse.
La solution qui s'offre à nous est donc de virtualiser la carte ethernet :
La solution qui s'offre à nous est donc de virtualiser la carte ethernet :
notre hyperviseur va alors **émuler** le comportement d'une carte (*qemu* émule
des cartes PCI `e1000`, `rtl8139` pour les plus connues) : côté machine
virtuelle, l'hyperviseur va communiquer sur le bus PCI, tandis que côté hôte,
il va créer une nouvelle interface virtuelle (de type `tap`), se comportant
comme un tunnel vers la machine virtuelle.
des cartes PCI `e1000` ou `rtl8139` pour les plus connues) : côté machine
virtuelle, l'hyperviseur va communiquer sur le bus PCI virtualisé, tandis que
côté hôte, il va créer une nouvelle interface virtuelle (de type `tap`), se
comportant comme un tunnel vers la machine virtuelle.
Pour attacher une carte réseau à notre machine virtuelle et créer l'interface
correspondante sur l'hôte, ce sera grâce à la commande :
correspondante sur l'hôte, ce sera grâce à la commande :
<div lang="en-US">
```bash
qemu-system-x86_64 -net nic,model=e1000 -net tap,ifname=tap0,script=no,downscript=no
qemu-system-x86_64 [...] -net nic,model=e1000 -net tap,ifname=tap0,script=no,downscript=no
```
</div>
@ -107,7 +107,7 @@ machines virtuelles, après avoir assigné des IP aux interfaces correspondantes
Il faut alors assigner une IP à l'interface de la machine hôte, et à la machine
virtuelle.
Par exemple : nous assignerons `172.23.69.1/31` à l'interface dans notre
Par exemple : nous assignerons `172.23.69.1/31` à l'interface dans notre
machine virtuelle et `172.23.69.0/31` à l'interface correspondante de
l'hôte. Ainsi, l'hôte pourra contacter cette machine virtuelle à
`172.23.69.1/31`, et inversement.
@ -117,11 +117,11 @@ l'hôte. Ainsi, l'hôte pourra contacter cette machine virtuelle à
Parmi les périphériques que peut émuler *qemu*, il y a le contrôleur un peu
particulier `virtio`. Ce pilote va, conjointement avec un support adapté côté
système d'exploitation invité, permettre de se passer de la couche
d'émulation : les paquets seront directement envoyés par le système hôte dans un
d'émulation : les paquets seront directement envoyés par le système hôte dans un
format compréhensible sans effort, par le système invité.
Ce principe a été introduit par la paravirtualisation (utilisé notamment par
Xen) : au moyen d'un noyau spécialement conçu (soit pour être hôte, soit pour
Xen) : au moyen d'un noyau spécialement conçu (soit pour être hôte, soit pour
être invité), l'hôte et l'invité peuvent communiquer entre-eux directement,
sans passer par une couche d'émulation du matériel.
@ -134,7 +134,7 @@ contrôleurs de disques.
Un pont réseau va nous permettre de faire communiquer entre-elles plusieurs
interfaces (qu'elles soient physiques ou virtuelles).
Pour créer un nouveau pont, on utilise la commande `ip` comme suit :
Pour créer un nouveau pont, on utilise la commande `ip` comme suit :
<div lang="en-US">
```bash
@ -145,7 +145,7 @@ ip link add name br0 type bridge
`br0` est le nom que l'on souhaite attribuer à l'interface.
Pour assigner à un pont une interface, on utilise la commande suivante :
Pour assigner à un pont une interface, on utilise la commande suivante :
<div lang="en-US">
```bash
@ -157,7 +157,7 @@ où `veth0` est le nom de l'interface que l'on souhaite inclure dans le pont
`br0`.
Pour consulter la liste des interfaces concentrées par le pont `br0` :
Pour consulter la liste des interfaces concentrées par le pont `br0` :
<div lang="en-US">
```bash
@ -174,16 +174,16 @@ machine hôte sur ce réseau virtuel.
Il est tout à fait possible d'ajouter une interface réseau physique à un pont,
et c'est sans doute la méthode la plus simple pour que les machines virtuelles
puissent accéder à internet : si le réseau local de la machine hôte fourni des
puissent accéder à internet : si le réseau local de la machine hôte fourni des
adresses IP par DHCP à toute machine rejoignant le réseau.
Lorsque le pont existe, `qemu` peut créer l'interface virtuelle et l'assigner à
un pont directement, avec la commande :
un pont directement, avec la commande :
<div lang="en-US">
```bash
qemu-system-x86_64 -net bridge,br=br0
qemu-system-x86_64 [...] -net bridge,br=br0
```
</div>
@ -191,7 +191,7 @@ qemu-system-x86_64 -net bridge,br=br0
### NAT
Dans certaines situations, il n'est pas aussi simple d'avoir une IP ou de
communiquer avec le réseau utilisé par la machine hôte : par exemple, si le
communiquer avec le réseau utilisé par la machine hôte : par exemple, si le
nombre d'IP disponibles n'est pas suffisant par rapport au nombre de machines
que l'on a besoin de créer, ou bien parce que le réseau nécessite d'être
authentifié (netsoul, portail captif, ...) et qu'il est difficile ou inadapté
@ -211,13 +211,22 @@ dnsmasq --interface=br0 --bind-interfaces --dhcp-range=172.20.0.2,172.20.255.254
Afin que les machines virtuelles puissent accéder à Internet, il est nécessaire
de faire du NAT.
<div lang="en-US">
```bash
sysctl -w net.ipv4.ip_forward=1
iptables -A POSTROUTING -o wlp3s0 -j MASQUERADE
```
</div>
`wlp3s0` correspond à l'interface de notre route par défaut.
Démarrer la machine virtuelle
-----------------------------
### Ajouter un disque vierge
Pour réaliser ce TP, nous aurons besoin d'un disque vierge :
Pour réaliser ce TP, nous aurons besoin d'un disque vierge :
<div lang="en-US">
```bash
@ -225,11 +234,11 @@ qemu-img create -f qcow2 /tmp/disk.qcow2 4G
```
</div>
Ce disque sera à attacher à notre machine virtuelle de cette manière :
Ce disque sera à attacher à notre machine virtuelle de cette manière :
<div lang="en-US">
```bash
qemu-system-x86_64 -drive file=/tmp/disk.qcow2
qemu-system-x86_64 [...] -drive file=/tmp/disk.qcow2
```
</div>
@ -237,11 +246,11 @@ qemu-system-x86_64 -drive file=/tmp/disk.qcow2
### Démarrer sur l'ISO
Tout comme le disque, nous utilisons ici le paramètre `-drive` pour donner un
ISO de CD :
ISO de CD :
<div lang="en-US">
```bash
qemu-system-x86_64 -boot d -drive format=raw,media=cdrom,readonly,file=tuto2.iso
qemu-system-x86_64 [...] -boot d -drive format=raw,media=cdrom,readonly,file=tuto2.iso
```
</div>
@ -267,7 +276,7 @@ mécanismes de découverte automatique permettent à la pile IPv6 de se configur
seule.
Pour dialoguer avec un serveur DHCP, il convient de lancer un client DHCP sur
la machine que l'on souhaite configurer : `udhcpc`, `dhcpcd`, `isc-dhcp-client`
la machine que l'on souhaite configurer : `udhcpc`, `dhcpcd`, `isc-dhcp-client`
(`dhclient`), etc. Généralement, ces clients prennent en argument l'interface
réseau à configurer.
@ -275,7 +284,7 @@ réseau à configurer.
### Vérification des paramètres IP
Parmi les configurations généralement effectuées automatiquement par le serveur
DHCP, on trouve les éléments suivants :
DHCP, on trouve les éléments suivants :
#### Lien
@ -286,11 +295,11 @@ pouvoir émettre un paquet sur le réseau.
```
42sh$ ip link
1: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
^^^^^^^^^^
^^^^^^^^^^
```
</div>
Manuellement, l'état d'un lien se change avec la commande :
Manuellement, l'état d'un lien se change avec la commande :
<div lang="en-US">
```bash
@ -302,7 +311,7 @@ ip link set enp3s0 up
#### Adresses
Après avoir reçu la validation (paquet `DHCPACK`) du serveur DHCP, l'IP est
définie sur l'interface, via une méthode similaire à la commande :
définie sur l'interface, via une méthode similaire à la commande :
<div lang="en-US">
```bash
@ -315,7 +324,7 @@ ip address add 192.168.0.42/24 dev enp3s0
Parmi toutes les informations embarquées dans un paquet DHCP, figure
généralement la route par défaut, permettant de localiser la passerelle du
réseau : le routeur conduisant généralement à Internet.
réseau : le routeur conduisant généralement à Internet.
<div lang="en-US">
```
@ -326,11 +335,11 @@ default via 192.168.0.254 dev enp3s0
</div>
Sur un réseau IPv6, les routes sont obtenues grâce au *Neighbor Discovery
Protocol* : chaque routeur émet à intervalle régulier ou sur sollicitation un
Protocol* : chaque routeur émet à intervalle régulier ou sur sollicitation un
paquet détaillant ses routes.
Manuellement, on ajoute une route par défaut avec la commande :
Manuellement, on ajoute une route par défaut avec la commande :
<div lang="en-US">
```bash
@ -348,7 +357,7 @@ La dernière chose que l'on a généralement besoin de configurer pour pouvoir
accéder pleinement à Internet, c'est un serveur de noms de domaine.
Les informations relatives à la résolution de noms sont inscrites dans le
fichier `/etc/resolv.conf` :
fichier `/etc/resolv.conf` :
<div lang="en-US">
```