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.