Problem sieci Vagrant (Virtualbox) tylko z wieloma hostami

9

Próbuję użyć błędnego środowiska wielu maszyn wirtualnych jako platformy testowej do wdrażania OpenStack i napotkałem problem z siecią podczas próby komunikacji z jedną maszyną wirtualną na maszynie wirtualnej wewnątrz maszyny wirtualnej.

Mam dwa węzły Vagrant, węzeł kontrolera chmury i węzeł obliczeniowy. Używam sieci tylko do hosta. Mój plik Vagrant wygląda następująco:

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

Kiedy próbuję uruchomić maszynę wirtualną (opartą na QEMU), uruchamia się ona pomyślnie na compute1, a jej wirtualna nic (vnet0) jest połączona mostem, br100:

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

                        vnet0

Gdy maszyna wirtualna QEMU wysyła żądanie do serwera DHCP (dnsmasq) działającego na kontrolerze, widzę, że żądanie dociera do kontrolera z powodu danych wyjściowych w dzienniku syslog na kontrolerze:

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 

Jednak DHCPOFFER nigdy nie wraca do maszyny wirtualnej działającej na compute1. Jeśli oglądam żądania za pomocą tcpdump na interfejsie vboxnet3 na moim hoście, na którym działa Vagrant (Mac OS X), widzę zarówno żądania, jak i odpowiedzi

$ 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

Ale jeśli uruchomię tcpdump na eth2 podczas obliczeń, widzę tylko żądania, a nie odpowiedzi:

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

W tym momencie utknąłem. Nie jestem pewien, dlaczego odpowiedzi DHCP nie docierają do węzła obliczeniowego. Być może ma to coś wspólnego z konfiguracją wirtualnego przełącznika / routera VirtualBox?

Zauważ, że interfejsy eth2 w obu węzłach zostały ustawione na tryb rozwiązły.

Lorin Hochstein
źródło

Odpowiedzi:

11

Problem polega na tym, że interfejs Vagrant musi być ustawiony w tryb rozwiązawczy, nie wystarczy to zrobić w systemach operacyjnych gościa.

Na przykład, jeśli dodasz dwie karty sieciowe, a ostatnia karta sieciowa, którą zdefiniujesz, będzie połączona z maszynami wirtualnymi, plik Vagrantfile powinien zawierać coś takiego:

compute1_config.vm.customize ["modifyvm", :id, "--nicpromisc3", "allow-all"]
Lorin Hochstein
źródło
3
czy możesz wyjaśnić, co określa „nicpromisc3”?
jayunit100,
2
@ jayunit100 Ustawia trzecią nicę (co odpowiada eth2) na „tryb rozwiązawczy”, co oznacza, że ​​VirtualBox wyśle ​​pakiety do maszyny wirtualnej, nawet jeśli adres MAC hosta docelowego w pakiecie nie zgadza się z adresem MAC VM.
Lorin Hochstein,
1
Więc --nicpromisc3 ​​to Adapter 3? Dlatego --nicpromisc2 to Adapter 2?
CMCDragonkai
@CMCDragonkai Tak, uważam, że tak.
Lorin Hochstein,
1
@Alfred zobacz to pytanie, jak naprawić The following settings shouldn't exist: customizebłąd.
Nick Craig-Wood