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

9

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

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

Portanto, agora o convidado inicializa muito bem, obtém um IP do meu servidor DHCP da rede local e pode acessar a Internet. O convidado também vê outras máquinas na rede local, posso protegê-las, etc.

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

Aqui está o route -ncomando 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).

Provavelmente eu poderia configurar uma nova interface tun / tap dedicada à comunicação entre host e convidado, mas parece um pouco exagerado. Existe uma maneira de fazer o host e o convidado se comunicar?

ascobol
fonte
Macvtap não é um substituto válido para a ponte. Se você deseja alternar em vez de fazer uma ponte, consulte o openvswitch.
user186658

Respostas:

7

Eu fiz essa pergunta no IRC e parece que o macvtap

injeta o tráfego de convidados na pilha de rede muito baixa para esse

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

ascobol
fonte
1
Aqui é instruções passo a passo sobre como criar a interface host / convidado sem ter de gerente de rede desativar: wiki.libvirt.org/page/...
HDave
1
Eu não poderia obter essas instruções para o trabalho ...
HDave
4

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

Journeyman Geek
fonte
1

A solução é configurar uma interface macvlan no hipervisor, com o mesmo endereço IP que a interface de hardware real (muito importante) e configurar o roteamento no host para usá-la. 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 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
npen
fonte
1

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

(A configuração específica aqui é específica para Debian e Upstart, 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 sugiro que você crie manualmente um adaptador macvlan e use seu MAC. Dessa forma, o MAC obriga a quaisquer convenções que possam estar lá.

É recomendável definir um MAC fixo, pois, caso contrário, não há como, por exemplo, um servidor DHCP reconhecer sua máquina após uma reinicialização e atribuir o mesmo endereço IP que 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 destacado é o seu endereço MAC.

Agora você cria um script init - que deve ser executado antes da inicialização da rede - para criar o adaptador macvlan a 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 Upstart para esse fim seria:

start on starting networking

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

Basta colocar isso em, por exemplo /etc/init/macvlan.conf.

Definindo a configuração de rede

Em /etc/network/interfaces, defina seu adaptador de rede físico como manual (mas deixe-o automático) e mova sua configuração anterior (geralmente DHCP ou um endereço IP estático) para o 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 a configuração do IPv4, o adaptador como 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 / ao adaptador. Quando isso acontece, também adiciona rotas para eles, o que pode causar problemas. Portanto, a melhor maneira é desativar 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, através da criação de um arquivo em /etc/sysctl.d/com esta linha, ou adicionando

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

ao seu script init.

Quando você agora reinicia sua máquina, a comunicação entre host e convidado deve funcionar com IPv4 e IPv6.


Esteja ciente de que, se você cometer um erro ao configurar isso, seu host poderá ficar inacessível via rede, mesmo após uma reinicialização. Faça isso apenas se você tiver acesso físico à máquina ou se houver outras salvaguardas, para que você possa solucionar possíveis problemas.

Lazzaro
fonte
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

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

Para conseguir isso, você pode usar estes 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ê deseja um script mais sofisticado, consulte minha página da web sobre esse assunto.

Evert Mouw
fonte
Não se esqueça de carregar o macvlanmódulo:modprobe macvlan
mdd
0

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

Primeiro, a interface do convidado precisa ser definida como "Dispositivo de origem" -> "Dispositivo host eth0: macvtap"; "Modo fonte" -> " Ponte ".

Segundo, o script init que você não trabalhou para mim ( parece que a interface macvlan0 foi criada tarde demais durante a inicialização ), então usei isso:

nano /etc/init.d/macvlan

Mude o mac para o que foi atribuído quando a interface foi criada:

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

update-rc.d macvlan defaults
Apelido
fonte