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 -n
comando 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?
fonte
Respostas:
Eu fiz essa pergunta no IRC e parece que o macvtap
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 ...
fonte
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.
fonte
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):
fonte
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:
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 é:
Um exemplo de script de inicialização Upstart para esse fim seria:
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: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
para
/etc/sysctl.conf
, através da criação de um arquivo em/etc/sysctl.d/
com esta linha, ou adicionandoao 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.
fonte
Você quer acabar com algo assim:
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:
Principalmente semelhante à solução de npen. Se você deseja um script mais sofisticado, consulte minha página da web sobre esse assunto.
fonte
macvlan
módulo:modprobe macvlan
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:
Mude o mac para o que foi atribuído quando a interface foi criada:
Salve e defina o bit de execução:
e adicione todos os links para init:
fonte