Guest e host non possono vedersi usando linux-kvm e macvtap


9

Sto migrando una macchina virtuale kvm da un vecchio host (sia hardware che SO) a una nuova.

Per il networking, virt-manager mi ha proposto una nuova opzione: macvtap . Sembrava una buona alternativa alla creazione di un ponte su eth0.

Quindi ora l'ospite si avvia bene, ottiene un IP dal mio server DHCP di rete locale, può raggiungere Internet. L'ospite vede anche altre macchine sulla rete locale, le posso vedere, ecc.

Il problema è che l'host e l'ospite non si vedono. Non riesco a raggiungere l'ospite dall'host utilizzando l'IP ospite, né posso raggiungere l'host dall'ospite utilizzando l'IP host. Nessun ping, ssh, http, niente.

Ecco il route -ncomando dall'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

(stesso output dal guest).

Probabilmente avrei potuto impostare una nuova interfaccia tun / tap dedicata alla comunicazione tra host e guest, ma sembra un po 'eccessiva. C'è un modo per far comunicare host e guest?


Macvtap non è un sostituto valido per il bridging. Se vuoi cambiare invece di collegare, guarda in openvswitch.
user186658,

Risposte:


7

Ho fatto questa domanda su IRC e sembra che macvtap

inietta traffico guest nello stack di rete troppo basso per quello

La soluzione è quindi quella di aggiungere un'interfaccia di rete per la comunicazione tra il guest e l'host, oppure rimanere con la vecchia soluzione con bridge ...


1
Ecco le istruzioni dettagliate su come creare l'interfaccia host / guest senza dover disabilitare il gestore di rete: wiki.libvirt.org/page/…
HDave

1
Non sono riuscito a far funzionare quelle istruzioni ...
HDave

4

virt-manager dice esplicitamente che macvtap non funziona per le comunicazioni di rete da host a guest quando lo configuri. Ho semplicemente aggiunto una seconda interfaccia nat, l'ho impostata nel guest e l'ho usata per comunicare con il mio host.


1

La soluzione è configurare un'interfaccia macvlan sull'hypervisor, con lo stesso indirizzo IP dell'interfaccia hardware reale (molto importante) e configurare il routing sull'host per usarlo. In Qemu / KVM, utilizzare un'interfaccia macvtap sull'interfaccia hardware come al solito.

Per la mia configurazione (rete 192.168.1.0/24, interfaccia hardware p10p1 e gateway 192.168.1.1), fornisce (sull'hypervisor):

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

1

Come è stato menzionato nelle risposte precedenti, una soluzione a questo problema è quella di aggiungere una scheda di rete macvlan sull'host. Tuttavia, ho ritenuto che ricablare manualmente le route verso l'adattatore macvlan fosse un po 'confuso, soprattutto perché volevo il supporto IPv6 e impostare manualmente le route potrebbe diventare un problema quando il prefisso cambia. Quindi ecco la mia configurazione che lascia il kernel in controllo della tabella di routing:

(La configurazione particolare qui è specifica di Debian e Upstart, ma i passaggi di base dovrebbero funzionare su qualsiasi GNU / Linux.)

Creazione dell'adattatore macvlan all'avvio

Innanzitutto, è necessario selezionare un indirizzo MAC per la scheda. Potresti essere in grado di usarne solo uno casuale, ma ti suggerisco di creare manualmente un adattatore macvlan e utilizzare il suo MAC. In questo modo, il MAC si impegna a tutte le convenzioni che potrebbero essere lì.

È consigliabile impostare un MAC fisso, poiché altrimenti non è possibile, ad esempio, che un server DHCP riconosca la macchina dopo un riavvio e gli assegni lo stesso indirizzo IP di prima.

Quindi crea un adattatore e cerca il 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
...

Il numero esadecimale evidenziato è il tuo indirizzo MAC.

Ora crei uno script init - che deve essere eseguito prima che la rete venga inizializzata - per creare l'adattatore macvlan ad ogni avvio. Il comando per farlo è:

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

Un esempio di script di avvio Upstart per questo scopo sarebbe:

start on starting networking

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

Mettilo in es /etc/init/macvlan.conf.

Impostazione della configurazione di rete

In /etc/network/interfaces, imposta la tua scheda di rete fisica su manuale (ma lasciala automaticamente) e sposta la sua configurazione precedente (in genere DHCP o un indirizzo IP statico) sulla tua scheda macvlan. Per esempio:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Disabilitazione di IPv6 per l'adattatore fisico

Infine, non si desidera che l' adattatore fisico ottenga un indirizzo IP. Per IPv4 l'impostazione dell'adattatore su manuale impedisce di ottenere un indirizzo. Tuttavia, non ho trovato una configurazione che impedisce al kernel di ottenere / assegnare un indirizzo IPv6 per / all'adattatore. Quando lo fa, aggiunge anche percorsi per loro, che possono causare problemi. Quindi il modo migliore sembra essere disabilitare IPv6 per l'adattatore fisico. Puoi farlo aggiungendo la linea

net.ipv6.conf.eth0.disable_ipv6=1

a /etc/sysctl.conf, creando un file /etc/sysctl.d/con questa riga o aggiungendo

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

al tuo script init.

Al momento del riavvio del computer, la comunicazione dall'host al guest dovrebbe funzionare sia con IPv4 che con IPv6.


Tenere presente che se si commette un errore durante l'impostazione, l'host potrebbe diventare irraggiungibile tramite la rete anche dopo un riavvio. Fallo solo se hai accesso fisico alla macchina o se sono presenti altre misure di sicurezza in modo da poter risolvere potenziali problemi.


1

Vuoi finire con qualcosa del genere:

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

Nota che l'ultima colonna contiene "macvlan0" invece di "eth0".

A tale scopo, è possibile utilizzare questi comandi, assumendo 192.168.0.42 come indirizzo 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

Principalmente simile alla soluzione di npen. Se vuoi uno script più sofisticato, vedi la mia pagina web su questo argomento.


Non dimenticare di caricare il macvlanmodulo:modprobe macvlan
mdd

0

Ho usato quello che Lazzaro ha scritto su Debian, ma voglio aggiungere alcune note.

Prima di tutto, l'interfaccia guest deve essere impostata su "Dispositivo di origine" -> "Dispositivo host eth0: macvtap"; "Modalità sorgente" -> " Bridge ".

In secondo luogo, lo script di init che non hai funzionato per me ( sembra che l'interfaccia macvlan0 sia stata creata troppo tardi durante l'avvio ), quindi ho usato questo:

nano /etc/init.d/macvlan

Cambia il mac con quello assegnato alla prima creazione dell'interfaccia:

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

Salvare e impostare il bit di esecuzione:

chmod +x /etc/init.d/macvlan

e aggiungi tutti i link per init:

update-rc.d macvlan defaults
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.