O convidado e o host não podem se ver usando o linux-kvm e o macvtap

8

Estou migrando uma máquina virtual kvm de um host antigo (hardware e sistema operacional) para um novo.

Para redes, o virt-manager me propôs uma nova opção: macvtap . Isso parecia uma boa alternativa para configurar uma ponte na eth0.

Então, agora, o convidado inicializa bem, obtém um IP do meu servidor DHCP da rede local, pode acessar a Internet. O convidado também vê outras máquinas na rede local, eu posso ssh, etc.

O problema é que o host e o convidado não se vêem. Não consigo alcançar o convidado do host usando o IP de convidado, nem posso alcançar o host do convidado usando o IP do host. Sem ping, ssh, http, nada.

Aqui está o comando route -n do 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

(mesma saída do convidado).

Eu provavelmente poderia configurar uma nova interface tun / tap dedicada à comunicação entre host e guest, mas parece um pouco exagerada. Existe uma maneira de fazer o host e o convidado se comunicarem?

    
por ascobol 22.10.2011 / 00:43

6 respostas

4

Eu fiz esta pergunta no IRC e parece que o macvtap

injects guest traffic into the network stack too low for that

A solução é então adicionar uma interface de rede para que o convidado e o host se comuniquem ou permaneçam com a antiga solução em ponte ...

    
por 22.10.2011 / 09:42
4

O virt-manager diz explicitamente que o macvtap não funciona para o host para as comunicações de rede guest quando você o configura. Eu simplesmente adicionei uma segunda interface baseada em nat, configurei-a no guest e usei isso para me comunicar com meu host.

    
por 06.10.2014 / 03:20
1

A solução é configurar uma interface macvlan no hipervisor, com o mesmo endereço IP do que a interface de hardware real (muito importante) e configurar o roteamento no host para usá-lo. No Qemu / KVM, use uma interface macvtap na interface de hardware como de costume.

Para minha configuração (rede 192.168.1.0/24, interface de hardware p10p1 e gateway 192.168.1.1), ela fornece (no 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
    
por 14.12.2011 / 19:44
1

Como foi mencionado nas respostas anteriores, uma solução para esse problema é adicionar um adaptador de rede macvlan no host. No entanto, senti que a reconfiguração manual das rotas para o adaptador macvlan era meio que hacky, especialmente porque eu queria que o suporte ao IPv6 e as rotas definidas manualmente pudessem se tornar um problema quando o prefixo fosse alterado. Então aqui está minha configuração que deixa o kernel no controle da tabela de roteamento:

(A configuração particular aqui é Debian e Upstart específica, mas as etapas básicas devem funcionar em qualquer GNU / Linux.)

Criando o adaptador macvlan na inicialização

Primeiro, você precisa selecionar um endereço MAC para o seu adaptador. Você pode usar apenas um aleatório, mas eu sugiro que você crie manualmente um adaptador macvlan e use seu MAC. Desta forma, o MAC obriga a quaisquer convenções que possam estar lá.

A definição de um MAC fixo é aconselhável, pois, caso contrário, não há como, por exemplo, um servidor DHCP para reconhecer sua máquina após uma reinicialização e atribuir a ela o mesmo endereço IP de antes.

Portanto, crie um adaptador e procure o 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
...

O número hexadecimal realçado é o seu endereço MAC.

Agora você cria um script de inicialização - que deve ser executado antes de a rede ser iniciada - para criar o adaptador macvlan em cada inicialização. O comando para fazer isso é:

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

Um exemplo de script de inicialização do Upstart para esse propósito seria:

start on starting networking

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

Basta colocar isso em, e. /etc/init/macvlan.conf .

Configurando a configuração de rede

Em /etc/network/interfaces , defina seu adaptador de rede física como manual (mas deixe-o automático) e mova sua configuração anterior (geralmente DHCP ou um endereço IP estático) para seu adaptador macvlan. Por exemplo:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Desativando o IPv6 para o adaptador físico

Por fim, você não deseja que o adaptador físico obtenha um endereço IP. Para o IPv4, a configuração do adaptador para manual impede que ele obtenha um endereço. No entanto, não encontrei uma configuração que impeça o kernel de obter / atribuir um endereço IPv6 para / para o adaptador. Quando isso acontece, também adiciona rotas para eles, o que pode causar problemas. Portanto, a melhor maneira parece ser desabilitar o IPv6 para o adaptador físico. Você pode fazer isso adicionando a linha

net.ipv6.conf.eth0.disable_ipv6=1

para /etc/sysctl.conf , criando um arquivo em /etc/sysctl.d/ com essa linha ou adicionando

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

ao seu script de inicialização.

Quando você reinicializa sua máquina, a comunicação entre o host e o convidado deve funcionar tanto no IPv4 quanto no IPv6.

Esteja ciente de que, se você cometer um erro ao configurá-lo, seu host poderá ficar inacessível pela rede mesmo depois de uma reinicialização. Somente faça isso se você tiver acesso físico à máquina ou se outras proteções estiverem em vigor para poder corrigir possíveis problemas.

    
por 26.09.2016 / 20:57
1

Você quer acabar com algo assim:

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

Note que a última coluna contém "macvlan0" em vez de "eth0".

Para conseguir isso, você pode usar esses comandos, assumindo 192.168.0.42 como seu endereço 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 semelhante à solução de npen. Se você quer um script mais sofisticado, veja meu página da Web sobre este assunto.

    
por 04.08.2013 / 23:40
0

Eu usei o que o Lazzaro escreveu no Debian, mas eu quero adicionar algumas notas.

Em primeiro lugar, a interface de convidado precisa ser definida como "Dispositivo de origem" - > "Dispositivo host eth0: macvtap"; "Modo de origem" - > " Ponte ".

Segundo, o script de inicialização que você criou não funcionou para mim ( parece que a interface do macvlan0 foi criada muito tarde durante a inicialização ), então usei isto:

nano /etc/init.d/macvlan

Altere o mac para aquele que foi atribuído quando a interface foi criada pela primeira 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

Salve e defina o bit de execução:

chmod +x /etc/init.d/macvlan

e adicione todos os links para o init:

update-rc.d macvlan defaults
    
por 13.12.2016 / 03:01