Vagrant (Virtualbox) проблема с несколькими узлами только для хоста

9

Я пытаюсь использовать бродячую среду с несколькими виртуальными машинами в качестве испытательного стенда для развертывания OpenStack, и я столкнулся с сетевой проблемой при попытке установить связь с одной виртуальной машины на виртуальную машину внутри виртуальной машины.

У меня есть два узла Vagrant, узел облачного контроллера и вычислительный узел. Я использую сеть только для хоста. Мой Vagrantfile выглядит так:

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

Когда я пытаюсь запустить виртуальную машину (на основе QEMU), она успешно загружается на compute1, а ее виртуальный ник (vnet0) подключается через мост br100:

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

                        vnet0

Когда виртуальная машина QEMU делает запрос к DHCP-серверу (dnsmasq), работающему на контроллере, я вижу, что запрос достигает контроллера из-за вывода в системном журнале на контроллере:

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 

Однако DHCPOFFER никогда не возвращается к виртуальной машине, работающей на compute1. Если я смотрю запросы с помощью tcpdump на интерфейсе vboxnet3 на моем хост-компьютере, на котором работает Vagrant (Mac OS X), я вижу как запросы, так и ответы

$ 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

Но если я запустил tcpdump на eth2 при вычислении, я вижу только запросы, а не ответы:

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

На данный момент я застрял. Я не уверен, почему ответы DHCP не попадают на вычислительный узел. Возможно, это как-то связано с настройкой виртуального коммутатора / маршрутизатора VirtualBox?

Обратите внимание, что интерфейсы eth2 на обоих узлах были установлены в случайный режим.

Лорин Хохштайн
источник

Ответы:

11

Проблема в том, что через Vagrant интерфейс должен быть установлен в беспорядочный режим, этого недостаточно в гостевых операционных системах.

Например, если вы добавите два сетевых адаптера, а последний, который вы определите, будет подключен к виртуальным машинам, ваш Vagrantfile должен содержать что-то вроде:

compute1_config.vm.customize ["modifyvm", :id, "--nicpromisc3", "allow-all"]
Лорин Хохштайн
источник
3
Вы можете уточнить, что указывает "nicpromisc3"?
jayunit100
2
@ jayunit100 Он устанавливает третий ник (который соответствует eth2) на «случайный режим», что означает, что VirtualBox будет отправлять пакеты на виртуальную машину, даже если MAC-адрес хоста назначения в пакете не совпадает с MAC-адресом VM.
Лорин Хохштайн
1
Итак, --nicpromisc3 ​​- это Адаптер 3? Следовательно, --nicpromisc2 - это Адаптер 2?
CMCDragonkai
@CMCDragonkai Да, я верю в это.
Лорин Хохштайн
1
@ Альфред видит этот вопрос, как исправить The following settings shouldn't exist: customizeошибку.
Ник Крейг-Вуд,