Problema de rede de vários nós do host Vagrant (Virtualbox) apenas

9

Estou tentando usar um ambiente de vagabundo multi-VM como um testbed para implantar o OpenStack, e me deparei com um problema de rede ao tentar se comunicar de uma VM, para uma VM dentro de uma VM .

Eu tenho dois nós Vagrant, um nó controlador de nuvem e um nó de computação. Estou usando uma rede somente de host. My Vagrantfile é assim:

Vagrant::Config.run do |config|

  config.vm.box = "precise64"

  config.vm.define :controller do |controller_config|
    controller_config.vm.network :hostonly, "192.168.206.130" # eth1
    controller_config.vm.network :hostonly, "192.168.100.130" # eth2
    controller_config.vm.host_name = "controller"
  end

  config.vm.define :compute1 do |compute1_config|
    compute1_config.vm.network :hostonly, "192.168.206.131" # eth1
    compute1_config.vm.network :hostonly, "192.168.100.131" # eth2
    compute1_config.vm.host_name = "compute1"
    compute1_config.vm.customize ["modifyvm", :id, "--memory", 1024]
  end
end

Quando tento inicializar uma VM (baseada em QEMU), ela inicializa com êxito em compute1 e sua nic virtual (vnet0) é conectada por meio de uma ponte, br100:

root@compute1:~# brctl show 100
bridge name bridge id       STP enabled interfaces
br100       8000.08002798c6ef   no      eth2

                        vnet0

Quando a VM do QEMU faz uma solicitação ao servidor DHCP (dnsmasq) em execução no controlador, posso ver que a solicitação chega ao controlador devido à saída no syslog no controlador:

Aug  6 02:34:56 precise64 dnsmasq-dhcp[12042]: DHCPDISCOVER(br100) fa:16:3e:07:98:11 
Aug  6 02:34:56 precise64 dnsmasq-dhcp[12042]: DHCPOFFER(br100) 192.168.100.2 fa:16:3e:07:98:11 

No entanto, o DHCPOFFER nunca retorna para a VM em execução no compute1. Se eu observar as solicitações usando o tcpdump na interface vboxnet3 em minha máquina host que executa o Vagrant (Mac OS X), posso ver as solicitações e as respostas

$ sudo tcpdump -i vboxnet3  -n port 67 or port 68
tcpdump: WARNING: vboxnet3: That device doesn't support promiscuous mode
(BIOCPROMISC: Operation not supported on socket)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vboxnet3, link-type EN10MB (Ethernet), capture size 65535 bytes
22:51:20.694040 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
22:51:20.694057 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
22:51:20.696047 IP 192.168.100.1.67 > 192.168.100.2.68: BOOTP/DHCP, Reply, length 311
22:51:23.700845 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
22:51:23.700876 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
22:51:23.701591 IP 192.168.100.1.67 > 192.168.100.2.68: BOOTP/DHCP, Reply, length 311
22:51:26.705978 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
22:51:26.705995 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
22:51:26.706527 IP 192.168.100.1.67 > 192.168.100.2.68: BOOTP/DHCP, Reply, length 311

Mas, se eu tcpdump em eth2 on compute, vejo apenas as solicitações, não as respostas:

root@compute1:~# tcpdump -i eth2 -n port 67 or port 68
tcpdump: WARNING: eth2: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
02:51:20.240672 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
02:51:23.249758 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280
02:51:26.258281 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from fa:16:3e:07:98:11, length 280

Neste ponto, estou preso. Não sei por que as respostas de DHCP não estão chegando ao nó de computação. Talvez tenha algo a ver com a configuração do comutador / roteador virtual do VirtualBox?

Observe que as interfaces eth2 em ambos os nós foram configuradas para o modo promíscuo.

    
por Lorin Hochstein 06.08.2012 / 05:04

1 resposta

10

O problema é que a interface tem que ser definida para o modo promíscuo através do Vagrant, fazê-lo dentro dos sistemas operacionais convidados não é suficiente.

Por exemplo, se você adicionar duas NICs, e a última NIC que você definir é a que será conectada às VMs, seu Vagrantfile deve conter algo como:

compute1_config.vm.customize ["modifyvm", :id, "--nicpromisc3", "allow-all"]
    
por 09.08.2012 / 01:54