É possível conectar contêineres do Docker dentro do Ubuntu Virtualbox à rede física via macvlan?

1

Crossposting aqui, já que essa questão foi marcada como fora do tópico no SO.

Eu vi algumas perguntas sobre como anexar contêineres do Docker a uma rede física usando o macvlan , mas ainda para encontrar uma resposta para o meu cenário atual.

O que estou tentando realizar:

  • Execute contêineres do Docker dentro de uma VM do VirtualBox executando o Ubuntu.
  • Usando o macvlan, conecte os contêineres à mesma rede de estivadores e atribua a cada um deles um endereço IP na sub-rede da minha rede física.
  • Acesse cada contêiner por meio desse endereço IP atribuído do host ou de qualquer outro dispositivo conectado à rede.

Até agora, fiz o seguinte:

  • Criei minha VM usando o Vagrant.
  • Adicionada minha interface Wi-Fi como um adaptador em ponte para a VM.
  • Defina o gateway padrão associado para a VM conforme descrito aqui ao IP do meu roteador (192.168.1.1).
  • Crie a rede do Docker com o seguinte comando: docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ip-range=192.168.1.160/27 -o parent=eth1 test_net
  • Executar meus contêineres, anexando-os à rede descrita acima.

Eu posso verificar se os dois contêineres estão ativos e são designados como 192.168.1.160 e 192.168.1.161. Obviamente, devido à maneira como o macvlan funciona, esses endereços não podem ser acessados na VM.

Mas, quando tento fazer o ping de um desses endereços da minha máquina host, a solicitação expira. No entanto, depois de tentar executar ping nesses endereços, quando executo um arp -a no host, posso ver entradas para ambos os contêineres:

? (192.168.1.160) at 2:42:c0:a8:1:a0 on en0 ifscope [ethernet] ? (192.168.1.161) at 2:42:c0:a8:1:a1 on en0 ifscope [ethernet]

Verifiquei se o firewall do meu roteador estava desativado, os endereços IP acima não estão em conflito com nenhum outro dispositivo da minha rede, que posso executar ping da minha VM no meu host e que o gateway padrão da minha VM está correto definido para 192.168.1.1 na interface eth1. Além disso, verifiquei se a sub-rede no comando create da rede docker corresponde à sub-rede configurada do roteador.

Já vi soluções que aproveitam o -p do Docker, mas isso não é uma opção para mim, já que preciso me referir a cada contêiner apenas por seu endereço IP.

Alguém teve algum sucesso em realizar o que estou tentando fazer? Além disso, por que os dois contêineres teriam entradas ARP, mas não seriam acessíveis, e o que eu poderia fazer para corrigir isso? Ou, há algo relevante em como o VirtualBox lida com adaptadores em ponte?

Eu pensei em editar iptables na VM para definir a política FORWARD padrão como ACCEPT , mas isso também não funcionou. Como parece que o ARP funciona, acredito que os pacotes estejam sendo descartados pela VM antes que eles possam retornar ao host, mas não tenho certeza do que alterar para corrigir isso.

    
por atomborn 25.07.2018 / 18:46

1 resposta

1

Se alguém estiver enfrentando esse problema, parece estar relacionado ao fato de o modo promíscuo estar ou não ativado para a interface à qual a rede do docker está conectada.

Eu pensei que configurar o adaptador para o modo promíscuo a partir das configurações do VirtualBox seria suficiente, mas aparentemente não é (minha melhor hipótese para o porquê disso é que estou usando o Vagrant).

Depois de definir o modo promíscuo do VirtualBox (Configurações - > Rede - > Adaptador em ponte - > Avançado - > Modo promíscuo - > Permitir tudo), também tive que ativá-lo dentro do VM:

sudo ip link set eth1 promisc on

Agora, posso fazer ping dos contêineres da minha VM por IP da minha máquina host! Eu pude testar isso com sucesso tanto no Ubuntu 14.04 quanto no 16.04, tudo sem mexer no iptables !

Mais uma vez, como mencionei acima, você não poderá fazer ping dos contêineres a partir da VM devido à natureza do macvlan.

    
por 25.07.2018 / 19:15