work on tuto2
This commit is contained in:
parent
2788600d4f
commit
58e541d6ad
4 changed files with 114 additions and 107 deletions
|
@ -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
|
|||
où `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>
|
||||
|
||||
où `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">
|
||||
```
|
||||
|
|
Reference in a new issue