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.