L'invité et l'hôte ne peuvent pas se voir en utilisant linux-kvm et macvtap

9

Je migre une machine virtuelle kvm d'un ancien hôte (matériel et système d'exploitation) vers un nouveau.

Pour le réseautage, virt-manager m'a proposé une nouvelle option: macvtap . Cela semblait une bonne alternative à la mise en place d'un pont sur eth0.

Alors maintenant, l'invité démarre très bien, obtient une adresse IP de mon serveur DHCP de réseau local, peut accéder à Internet. L'invité voit également d'autres machines sur le réseau local, je peux les utiliser, etc.

Le problème est que l'hôte et l'invité ne se voient pas. Je ne peux pas atteindre l'invité à partir de l'hôte en utilisant l'IP invité, je ne peux pas non plus atteindre l'hôte depuis l'invité en utilisant l'IP hôte. Pas de ping, ssh, http, rien.

Voici la route -ncommande de l'hôte:

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(même sortie de l'invité).

Je pourrais probablement mettre en place une nouvelle interface tun / tap dédiée à la communication entre l'hôte et l'invité, mais cela semble un peu exagéré. Existe-t-il un moyen de faire communiquer l'hôte et l'invité?

ascobol
la source
Macvtap n'est pas un remplacement valide pour le pontage. Si vous voulez changer plutôt que de pont, regardez dans openvswitch.
user186658

Réponses:

7

J'ai posé cette question sur IRC et il semble que macvtap

injecte le trafic invité dans la pile réseau trop faible pour cela

La solution consiste alors à ajouter une interface réseau pour que l'invité et l'hôte communiquent, ou restent avec l'ancienne solution pontée ...

ascobol
la source
1
Voici des instructions étape par étape sur la façon de créer l'interface hôte / invité sans avoir à désactiver le gestionnaire de réseau: wiki.libvirt.org/page/…
HDave
1
Je n'ai pas réussi à faire fonctionner ces instructions ...
HDave
4

virt-manager dit explicitement que macvtap ne fonctionne pas pour les communications réseau hôte-invité lorsque vous le configurez. J'ai simplement ajouté une deuxième interface basée sur nat, je l'ai installée dans l'invité et je l'utilise pour communiquer avec mon hôte.

Compagnon Geek
la source
1

La solution consiste à configurer une interface macvlan sur l'hyperviseur, avec la même adresse IP que la véritable interface matérielle (très important), et à configurer le routage sur l'hôte pour l'utiliser. Dans Qemu / KVM, utilisez une interface macvtap sur l'interface matérielle comme d'habitude.

Pour ma config (réseau 192.168.1.0/24, interface matérielle p10p1 et passerelle 192.168.1.1), cela donne (sur l'hyperviseur):

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static
npen
la source
1

Comme cela a été mentionné dans les réponses précédentes, une solution à ce problème consiste à ajouter une carte réseau macvlan sur l'hôte. Cependant, je sentais que recâbler manuellement les routes vers l'adaptateur macvlan était un peu hacky, d'autant plus que je voulais la prise en charge d'IPv6 et que les routes définies manuellement peuvent devenir un problème lorsque le préfixe change. Voici donc ma configuration qui laisse le noyau sous contrôle de la table de routage:

(La configuration particulière ici est spécifique à Debian et Upstart, mais les étapes de base devraient fonctionner sur n'importe quel GNU / Linux.)

Création de l'adaptateur macvlan au démarrage

Tout d'abord, vous devez sélectionner une adresse MAC pour votre adaptateur. Vous pouvez peut-être simplement en utiliser un au hasard, mais je vous suggère de créer manuellement un adaptateur macvlan et d'utiliser son MAC. De cette façon, le MAC oblige à toutes les conventions qui pourraient exister.

La définition d'un MAC fixe est recommandée, car sinon il n'y a aucun moyen par exemple pour un serveur DHCP de reconnaître votre machine après un redémarrage et de lui attribuer la même adresse IP qu'auparavant.

Créez donc un adaptateur et recherchez le MAC:

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...

Le nombre hexadécimal en surbrillance est votre adresse MAC.

Vous créez maintenant un script d'initialisation - qui doit être exécuté avant que la mise en réseau ne soit initialisée - pour créer l'adaptateur macvlan à chaque démarrage. La commande pour ce faire est:

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

Un exemple de script init Upstart à cet effet serait:

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

Mettez-le par exemple /etc/init/macvlan.conf.

Mise en place de la configuration réseau

Dans /etc/network/interfaces, définissez votre carte réseau physique sur manuel (mais laissez-la automatique) et déplacez sa configuration précédente (généralement DHCP ou une adresse IP statique) vers votre carte macvlan. Par exemple:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Désactivation d'IPv6 pour l'adaptateur physique

Enfin, vous ne souhaitez pas que l' adaptateur physique obtienne une adresse IP. Pour IPv4, le réglage manuel de l'adaptateur l'empêche d'obtenir une adresse. Cependant, je n'ai pas trouvé de configuration qui empêche le noyau d'obtenir / d'attribuer une adresse IPv6 pour / à l'adaptateur. Dans ce cas, il leur ajoute également des itinéraires, ce qui peut entraîner des problèmes. La meilleure façon semble donc être de désactiver IPv6 pour l'adaptateur physique. Vous pouvez le faire en ajoutant la ligne

net.ipv6.conf.eth0.disable_ipv6=1

à /etc/sysctl.conf, en créant un fichier /etc/sysctl.d/avec cette ligne, ou en ajoutant

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

à votre script init.

Lorsque vous redémarrez maintenant votre ordinateur, la communication entre l'hôte et l'invité devrait fonctionner avec IPv4 et IPv6.


Sachez que si vous faites une erreur lors de la configuration, votre hôte peut devenir inaccessible via le réseau même après un redémarrage. Ne faites cela que si vous avez un accès physique à la machine ou si d'autres protections sont en place afin de résoudre les problèmes potentiels.

Lazzaro
la source
1

Vous voulez vous retrouver avec quelque chose comme ça:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

Notez que la dernière colonne contient "macvlan0" au lieu de "eth0".

Pour y parvenir, vous pouvez utiliser ces commandes, en supposant 192.168.0.42 comme adresse IP:

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

Généralement similaire à la solution de npen. Si vous voulez un script plus sophistiqué, consultez ma page Web sur ce sujet.

Evert Mouw
la source
N'oubliez pas de charger le macvlanmodule:modprobe macvlan
mdd
0

J'ai utilisé ce que Lazzaro a écrit sur Debian, mais je veux ajouter quelques notes.

Tout d'abord, l'interface invité doit être définie sur "Périphérique source" -> "Périphérique hôte eth0: macvtap"; "Mode source" -> " Pont ".

Deuxièmement, le script d'initialisation que vous avez n'a pas fonctionné pour moi ( il semble que l'interface macvlan0 ait été créée trop tard lors du démarrage ), j'ai donc utilisé ceci:

nano /etc/init.d/macvlan

Remplacez le mac par celui qui a été attribué lors de la première création de l'interface:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

Enregistrez et définissez le bit d'exécution:

chmod +x /etc/init.d/macvlan

et ajoutez tous les liens pour init:

update-rc.d macvlan defaults
Surnom
la source