El invitado y el host no pueden verse usando linux-kvm y macvtap

9

Estoy migrando una máquina virtual kvm de un host antiguo (tanto hardware como sistema operativo) a uno nuevo.

Para las redes, virt-manager me propuso una nueva opción: macvtap . Esto parecía una buena alternativa para establecer un puente en eth0.

Así que ahora el invitado arranca bien, obtiene una IP del servidor DHCP de mi red local, puede llegar a Internet. El invitado también ve otras máquinas en la red local, puedo enviarlas, etc.

El problema es que el anfitrión y el invitado no se ven. No puedo contactar al invitado desde el host usando la IP del invitado, ni puedo contactar al host desde el invitado usando la IP del host. Sin ping, ssh, http, nada.

Aquí está el route -ncomando del host:

$ /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

(mismo resultado del invitado).

Probablemente podría configurar una nueva interfaz tun / tap dedicada a la comunicación entre el host y el invitado, pero parece un poco exagerado. ¿Hay alguna manera de hacer que el anfitrión y el invitado se comuniquen?

ascobol
fuente
Macvtap no es un reemplazo válido para el puente. Si desea cambiar en lugar de puentear, busque en openvswitch.
user186658

Respuestas:

7

Hice esta pregunta en IRC y parece que macvtap

inyecta tráfico de invitado en la pila de red demasiado bajo para eso

La solución es agregar una interfaz de red para que el invitado y el host se comuniquen o permanezcan con la antigua solución puenteada ...

ascobol
fuente
1
Aquí hay instrucciones paso a paso sobre cómo crear la interfaz de host / invitado sin tener que deshabilitar el administrador de red: wiki.libvirt.org/page/…
HDave
1
No pude conseguir que esas instrucciones funcionen ...
HDave
4

virt-manager dice explícitamente que macvtap no funciona para las comunicaciones de red de host a invitado cuando lo configura. Simplemente agregué una segunda interfaz basada en nat, la configuré en el invitado y la utilicé para comunicarme con mi host.

Journeyman Geek
fuente
1

La solución es configurar una interfaz macvlan en el hipervisor, con la misma dirección IP que la interfaz de hardware real (muy importante), y configurar el enrutamiento en el host para usarla. En Qemu / KVM, use una interfaz macvtap en la interfaz de hardware como de costumbre.

Para mi configuración (red 192.168.1.0/24, interfaz de hardware p10p1 y puerta de enlace 192.168.1.1), proporciona (en el hipervisor):

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
fuente
1

Como se mencionó en respuestas anteriores, una solución a este problema es agregar un adaptador de red macvlan en el host. Sin embargo, sentí que volver a cablear manualmente las rutas al adaptador macvlan era un poco complicado, especialmente porque quería soporte para IPv6 y establecer rutas manualmente puede convertirse en un problema cuando cambia el prefijo. Así que aquí está mi configuración que deja el kernel en control de la tabla de enrutamiento:

(La configuración particular aquí es específica de Debian y Upstart, pero los pasos básicos deberían funcionar en cualquier GNU / Linux).

Crear el adaptador macvlan en el arranque

Primero, debe seleccionar una dirección MAC para su adaptador. Es posible que pueda usar uno aleatorio, pero le sugiero que cree manualmente un adaptador macvlan y use su MAC. De esta manera, el MAC obliga a las convenciones que puedan existir.

Es aconsejable configurar un MAC fijo, ya que de lo contrario no hay forma de, por ejemplo, que un servidor DHCP reconozca su máquina después de un reinicio y le asigne la misma dirección IP que antes.

Así que cree un adaptador y busque el 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
...

El número hexadecimal resaltado es su dirección MAC.

Ahora crea un script de inicio, que debe ejecutarse antes de que se inicie la red, para crear el adaptador macvlan en cada inicio. El comando para hacer esto es:

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

Un ejemplo de script de inicio Upstart para este propósito sería:

start on starting networking

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

Solo pon esto en eg /etc/init/macvlan.conf.

Configurar la configuración de red

En /etc/network/interfaces, configure su adaptador de red físico en manual (pero déjelo en automático) y mueva su configuración anterior (generalmente DHCP o una dirección IP estática) a su adaptador macvlan. P.ej:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Deshabilitar IPv6 para el adaptador físico

Por último, no desea que el adaptador físico obtenga una dirección IP. Para IPv4, configurar el adaptador en manual evita que obtenga una dirección. Sin embargo, no he encontrado una configuración que impida que el núcleo obtenga / asigne una dirección IPv6 para / al adaptador. Cuando lo hace, también agrega rutas para ellos, lo que puede causar problemas. Entonces, la mejor manera parece ser deshabilitar IPv6 para el adaptador físico. Puedes hacer esto agregando la línea

net.ipv6.conf.eth0.disable_ipv6=1

a /etc/sysctl.conf, creando un archivo en/etc/sysctl.d/ con esta línea o al agregar

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

a su guión de inicio.

Cuando reinicie su máquina, la comunicación de host a invitado debería funcionar tanto con IPv4 como con IPv6.


Tenga en cuenta que si comete un error al configurar esto, es posible que no pueda acceder a su host a través de la red incluso después de un reinicio. Solo haga esto si tiene acceso físico a la máquina o si existen otras medidas de seguridad para poder solucionar posibles problemas.

Lázaro
fuente
1

Desea terminar con algo como esto:

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

Tenga en cuenta que la última columna contiene "macvlan0" en lugar de "eth0".

Para lograr eso, puede usar estos comandos, suponiendo 192.168.0.42 como su dirección 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

Mayormente similar a la solución de npen. Si desea un script más sofisticado, consulte mi página web sobre este tema.

Evert Mouw
fuente
No olvide cargar el macvlanmódulo:modprobe macvlan
mdd
0

Usé lo que Lazzaro escribió en Debian, pero quiero agregar algunas notas.

En primer lugar, la interfaz de invitado debe establecerse en "Dispositivo de origen" -> "Dispositivo host eth0: macvtap"; "Modo fuente" -> " Puente ".

En segundo lugar, el script de inicio que no ha funcionado para mí ( parece que la interfaz macvlan0 se creó demasiado tarde durante el inicio ), así que utilicé esto:

nano /etc/init.d/macvlan

Cambie el mac al que se asignó cuando se creó la interfaz por primera vez:

#!/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

Guarde y establezca el bit de ejecución:

chmod +x /etc/init.d/macvlan

y agregue todos los enlaces para init:

update-rc.d macvlan defaults
Nick Name
fuente