Comment utiliser la mise en réseau pontée avec libvirt et KVM
Libvirt est un logiciel gratuit et open source qui fournit une API pour gérer divers aspects des machines virtuelles. Sur Linux, il est couramment utilisé en conjonction avec KVM et Qemu. Entre autres choses, libvirt est utilisé pour créer et gérer des réseaux virtuels. Le réseau par défaut créé lors de l’utilisation de libvirt est appelé « par défaut » et utilise la traduction d’adresses réseau (NAT) et la redirection de paquets pour connecter les systèmes émulés au monde « extérieur » (à la fois le système hôte et Internet). Dans ce tutoriel, nous allons voir comment créer une configuration différente à l’aide du réseau ponté.
Dans ce tutoriel, vous allez apprendre :
- Comment créer un pont virtuel
- Comment ajouter une interface physique à un pont
- Comment rendre la configuration du pont persistante
- Comment modifier les règles du micrologiciel pour autoriser le trafic vers la machine virtuelle
- Comment créer un réseau virtuel et l’utiliser dans une machine virtuelle
Comment utiliser la mise en réseau pontée avec libvirt et KVM
Configuration logicielle requise et conventions utilisées
Le réseau « par défaut »
Lorsque libvirt est utilisé et que le démon libvirtd est en cours d’exécution, un réseau par défaut est créé. Nous pouvons vérifier que ce réseau existe en utilisant l’utilitaire virsh, qui sur la majorité des distributions Linux est généralement livré avec le paquet libvirt-client. Pour appeler l’utilitaire afin qu’il affiche tous les réseaux virtuels disponibles, nous devons inclure la sous-commande net-list :
sudo virsh net-list --all
Dans l’exemple ci-dessus, nous avons utilisé l’option --all pour nous assurer que les réseaux inactifs sont également inclus dans le résultat, qui devrait normalement correspondre à celui affiché ci-dessous :
Name State Autostart Persistent
--------------------------------------------
default active yes yes
Pour obtenir des informations détaillées sur le réseau, et éventuellement le modifier, nous pouvons appeler virsh avec la sous-commande edit à la place, en fournissant le nom du réseau comme argument :
sudo virsh net-edit default
Un fichier temporaire contenant la définition du réseau xml sera ouvert dans notre éditeur de texte préféré. Dans ce cas, le résultat est le suivant :
<network>
<name>default</name>
<uuid>168f6909-715c-4333-a34b-f74584d26328</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:48:3f:0c'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
Comme nous pouvons le voir, le réseau par défaut est basé sur l’utilisation du pont virtuel virbr0 et utilise la connectivité basée sur NAT pour connecter les machines virtuelles qui font partie du réseau au monde extérieur. Nous pouvons vérifier que le pont existe à l’aide de la commande ip :
ip link show type bridge
Dans notre cas, la commande ci-dessus renvoie le résultat suivant :
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
Pour montrer les interfaces qui font partie du pont, nous pouvons utiliser la commande ip et interroger uniquement les interfaces qui ont le pont virbr0 comme maître :
ip link show master virbr0
Le résultat de l’exécution de la commande est le suivant :
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
Comme nous pouvons le voir, il n’y a actuellement qu’une seule interface attachée au pont, virbr0-nic. L’interface virbr0-nic est une interface ethernet virtuelle : elle est créée et ajoutée au pont automatiquement, et son but est simplement de fournir une adresse MAC stable (52:54:00:48:3f :0c dans ce cas) pour le pont.
D’autres interfaces virtuelles seront ajoutées au pont lorsque nous créerons et lancerons des machines virtuelles. Pour les besoins de ce tutoriel, j’ai créé et lancé une machine virtuelle Debian (Buster) ; Si nous relançons la commande que nous avons utilisée ci-dessus pour afficher les interfaces esclaves du pont, nous pouvons voir qu’une nouvelle a été ajoutée, vnet0 :
ip link show master virbr0
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
7: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master virbr0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:54:00:e2:fe:7b brd ff:ff:ff:ff:ff:ff
Aucune interface physique ne doit jamais être ajoutée au pont virbr0, car il utilise NAT pour fournir la connectivité.
Utiliser la mise en réseau pontée pour les machines virtuelles
Le réseau par défaut offre un moyen très simple d’obtenir une connectivité lors de la création de machines virtuelles : tout est « prêt » et fonctionne dès la sortie de la boîte. Parfois, cependant, nous voulons obtenir une connexion de pontage complète, où les appareils invités sont connectés au LAN hôte, sans utiliser NAT, nous devons créer un nouveau pont et partager l’une des interfaces Ethernet physiques de l’hôte. Voyons comment procéder étape par étape.
Création d’un nouveau pont
Pour créer un nouveau pont, nous pouvons toujours utiliser la commande ip. Disons que nous voulons nommer ce pont br0 ; Nous exécuterions la commande suivante :
sudo ip link add br0 type bridge
Pour vérifier que le pont est créé, nous faisons comme précédemment :
sudo ip link show type bridge
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:48:3f:0c brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 26:d2:80:7c:55:dd brd ff:ff:ff:ff:ff:ff
Comme prévu, le nouveau pont, br0 a été créé et est maintenant inclus dans la sortie de la commande ci-dessus. Maintenant que le nouveau pont est créé, nous pouvons continuer et y ajouter l’interface physique.
Ajout d’une interface Ethernet physique au pont
Dans cette étape, nous allons ajouter une interface physique hôte au pont. Notez que vous ne pouvez pas utiliser votre interface Ethernet principale dans ce cas, car dès qu’elle est ajoutée au pont, vous perdrez la connectivité, car elle perdra son adresse IP. Dans ce cas nous allons utiliser une interface supplémentaire, enp0s29u1u1 : il s’agit d’une interface fournie par un adaptateur ethernet vers usb attaché à ma machine.
Tout d’abord, nous nous assurons que l’état de l’interface est UP :
sudo ip link set enp0s29u1u1 up
Pour ajouter l’interface au pont, la commande à exécuter est la suivante :
sudo ip link set enp0s29u1u1 master br0
Pour vérifier que l’interface a été ajoutée au pont, procédez comme suit :
sudo ip link show master br0
3: enp0s29u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
link/ether 18:a6:f7:0e:06:64 brd ff:ff:ff:ff:ff:ff
Attribution d’une adresse IP statique au pont
À ce stade, nous pouvons attribuer une adresse IP statique au pont. Supposons que nous voulions utiliser 192.168.0.90/24 ; Nous courrions :
sudo ip address add dev br0 192.168.0.90/24
Pour que l’adresse ait été ajoutée à l’interface, nous lançons :
ip addr show br0
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 26:d2:80:7c:55:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.0.90/24 scope global br0
valid_lft forever preferred_lft forever
[...]
Rendre la configuration persistante
La configuration de notre pont est prête, cependant, telle qu’elle est, elle ne survivra pas à un redémarrage de la machine. Pour rendre notre configuration persistante, nous devons modifier certains fichiers de configuration, en fonction de la distribution que nous utilisons.
Debian et dérivés
Sur la famille de distributions Debian, nous devons être sûrs que le paquet bridge-utils est installé :
sudo apt-get install bridge-utils
Une fois le paquet installé, nous devons modifier le contenu du fichier /etc/network/interfaces :
This file describes the network interfaces available on your system
and how to activate them. For more information, see interfaces(5).
The loopback network interface
auto lo
iface lo inet loopback
Specify that the physical interface that should be connected to the bridge
should be configured manually, to avoid conflicts with NetworkManager
iface enp0s29u1u1 inet manual
The br0 bridge settings
auto br0
iface br0 inet static
bridge_ports enp0s29u1u1
address 192.168.0.90
broadcast 192.168.0.255
netmask 255.255.255.0
gateway 192.168.0.1
Famille de distributions Red Hat
Sur la famille de distributions Red Hat, y compris Fedora, nous devons manipuler les scripts réseau à l’intérieur du répertoire /etc/sysconfig/network-scripts. Si nous voulons que le pont ne soit pas géré par NetworkManager, ou si nous utilisons une distribution plus ancienne avec une ancienne version de NetworkManager qui n’est pas capable de gérer les commutateurs réseau, nous devons installer le paquet network-scripts :
sudo dnf install network-scripts
Une fois le paquet installé, nous devons créer le fichier qui configurera le pont br0 : /etc/sysconfig/network-scripts/ifcfg-br0. À l’intérieur du fichier, nous plaçons le contenu suivant :
DEVICE=br0
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.90
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
DELAY=0
NM_CONTROLLED=0
Ensuite, nous modifions ou créons le fichier utilisé pour configurer l’interface physique que nous connecterons au pont, dans ce cas /etc/sysconfig/network-scripts/ifcfg-enp0s29u1u1 :
TYPE=ethernet
BOOTPROTO=none
NAME=enp0s29u1u1
DEVICE=enp0s29u1u1
ONBOOT=yes
BRIDGE=br0
DELAY=0
NM_CONTROLLED=0
Avec nos configurations prêtes, nous pouvons démarrer le service réseau, et l’activer au démarrage :
sudo systemctl enable --now network
Désactivation du netfilter pour le pont
Pour permettre à tout le trafic d’être redirigé vers le pont, et donc vers les machines virtuelles qui y sont connectées, nous devons désactiver netfilter. Ceci est nécessaire, par exemple, pour que la résolution DNS fonctionne dans les machines invitées attachées au pont. Pour ce faire, nous pouvons créer un fichier avec l’extension .conf à l’intérieur du répertoire /etc/sysctl.d, appelons-le 99-netfilter-bridge.conf. À l’intérieur, nous écrivons le contenu suivant :
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
Pour charger les paramètres écrits dans le fichier, nous nous assurons d’abord que le module br_netfilter est chargé :
sudo modprobe br_netfilter
Pour charger le module automatiquement au démarrage, créons le fichier /etc/modules-load.d/br_netfilter.conf : il ne doit contenir que le nom du module lui-même :
br_netfilter
Une fois le module chargé, pour charger les paramètres que nous avons stockés dans le fichier 99-netfilter-bridge.conf, nous pouvons exécuter :
sudo sysctl -p /etc/sysctl.d/99-netfilter-bridge.conf
Création d’un réseau virtuel
À ce stade, nous devrions définir un nouveau « réseau » à utiliser par nos machines virtuelles. Nous ouvrons un fichier avec notre éditeur préféré et collons le contenu suivant à l’intérieur, puis l’enregistrons sous bridged-network.xml :
<network>
<name>bridged-network</name>
<forward mode="bridge" />
<bridge name="br0" />
</network>
Une fois que le fichier est prêt, nous passons sa position en argument à la sous-commande net-define virsh :
sudo virsh net-define bridged-network.xml
Pour activer le nouveau réseau et faire en sorte qu’il soit démarré automatiquement, nous devons exécuter :
sudo virsh net-start bridged-network
sudo virsh net-autostart bridged-network
Nous pouvons vérifier que le réseau a été activé en exécutant la commande virsh net-list
, à nouveau :
sudo virsh net-list
Name State Autostart Persistent
----------------------------------------------------
bridged-network active yes yes
default active yes yes
Nous pouvons maintenant sélectionner le réseau par son nom en utilisant l’option --network :
sudo virt-install \
--vcpus=1 \
--memory=1024 \
--cdrom=debian-10.8.0-amd64-DVD-1.iso \
--disk size=7 \
--os-variant=debian10 \
--network network=bridged-network
Si vous utilisez l’interface graphique de virt-manager, nous pourrons sélectionner le réseau lors de la création de la nouvelle machine virtuelle :
Conclusions
Dans ce tutoriel, nous avons vu comment créer un pont virtuel sous linux et y connecter une interface ethernet physique afin de créer un nouveau « réseau » à utiliser dans les machines virtuelles gérées avec libvirt. Lors de l’utilisation de ce dernier, un réseau par défaut est fourni pour plus de commodité : il fournit la connectivité en utilisant NAT. Lorsque nous utilisons un réseau ponté comme celui que nous configurons dans ce tutoriel, nous allons améliorer les performances et faire en sorte que les machines virtuelles fassent partie du même sous-réseau de l’hôte.

