Статьи

Дополнительные советы по Virtualbox и Vagrant для сетей VLAN, PXE и ​​Hostonly


Я бредил о
Бродяге
много-
много раз прежде.

Первоначально это было сделано для отдельных машин, работающих за интерфейсом NAT. Позже была добавлена ​​поддержка hostonly-network, что открыло возможность одновременного общения нескольких хостов по частной сети.

Но что, если настройка сети производства намного сложнее, чем эта? В этом посте я собираюсь объяснить, как воспроизвести следующую сетевую настройку в бродячей установке:

Настройка сети

          HOST
            |
            |
          eth2                          eth2
          (NAT)                         (NAT)
            |                             |
        [ Gateway ]      <---->      [ Mgmt Host]  <----->   [Servers1,2]
               br10              br10          eth3       br0
              (eth0.10,        (eth0.10,                  (eth0
               eth1.10)         eth1.10)                   eth1)
              vboxnet0          vboxnet0     vboxnet1    vboxnet1

Это довольно типичная производственная установка:

шлюз

  • он действует как входящий / исходящий межсетевой экран, прокси-сервер squid, nginx и т. д.
  • у него есть два рабочих интерфейса eth0, eth1, которые VLAN-ed (ID 10) и соединены вместе

управляющий хост

  • подключен к шлюзу для внутри и снаружи трафика
  • содержит все необходимые инструменты для управления серверами, dhcp, tftpboot и т.д ..

серверы

  • все серверы устанавливаются через хост mgmt
  • server1 будет установлен только через PXE
  • server2 не будет подключен диск и будет загружаться из сети каждый раз

Подготовка базовой коробки

Почти все базовые блоки предполагают, что интерфейс DHCP для интерфейса NAT находится на интерфейсе eth0. Перемещение интерфейса NAT на eth2 требует, чтобы вы изменили / etc / network / interfaces, чтобы указать, что dhcp выполняется на eth2, а eth0, eth1 не являются dhcp. В противном случае загрузка будет очень медленной, ожидая таймаута, что приведет к отсутствию IP-адресов.

Мы использовали Veewee для добавления другого сценария postinstall, чтобы изменить файл / etc / network / interfaces в нужное нам состояние. В результате ‘squeeze64’

sed -i -e "s/eth0/eth2/" /etc/network/interfaces

Hostonly сети в Вагранте

В то время как Vagrant поддерживает сетевые соединения только для хоста , он предполагает, что ему необходимо назначить интерфейсу IP-адрес. В нашем случае интерфейсы eth0, eth1 не получают IP-адрес, только мост получает IP-адрес.

Также, используя встроенную в vagrant поддержку hostonly для сетей, мы обнаружили, что она изменила порядок интерфейсов: кажется, что она динамически удаляет все интерфейсы хоста и воссоздает их.

Мы прибегали к:

  • добавление наших интерфейсов hostonly к нашей «базовой коробке» с помощью команд VBoxManage
  • экспортировать его с помощью подкоманды vagrant basebox export

И, таким образом, создать бродячую коробку ‘gateway.box’ и ‘manager.box’.

Для узла шлюза:

IFTYPE="virtio"
VBoxManage modifyvm squeeze64 --nic1 hostonly
VBoxManage modifyvm squeeze64 --nic2 hostonly
VBoxManage modifyvm squeeze64 --nic3 nat
VBoxManage modifyvm squeeze64 --nic4 none
VBoxManage modifyvm squeeze64 --macaddress1 auto
VBoxManage modifyvm squeeze64 --macaddress2 auto
VBoxManage modifyvm squeeze64 --macaddress3 auto
VBoxManage modifyvm squeeze64 --nictype1 $IFTYPE
VBoxManage modifyvm squeeze64 --nictype2 $IFTYPE
VBoxManage modifyvm squeeze64 --nictype3 $IFTYPE
VBoxManage modifyvm squeeze64 --cableconnected2 off
VBoxManage controlvm squeeze64 setlinkstate2 off
VBoxManage modifyvm squeeze64 --hostonlyadapter1 vboxnet0
VBoxManage modifyvm squeeze64 --hostonlyadapter2 vboxnet0

rm squeeze64.box
bundle exec vagrant basebox export squeeze64
mv  squeeze64.box boxes/manager.box
bundle exec vagrant box remove 'manager'
bundle exec vagrant box add 'manager' 'boxes/manager.box

Для управляющего узла:

IFTYPE="virtio"
VBoxManage modifyvm squeeze64 --nic1 hostonly
VBoxManage modifyvm squeeze64 --nic2 hostonly
VBoxManage modifyvm squeeze64 --nic3 nat
VBoxManage modifyvm squeeze64 --nic4 hostonly
VBoxManage modifyvm squeeze64 --macaddress1 auto
VBoxManage modifyvm squeeze64 --macaddress2 auto
VBoxManage modifyvm squeeze64 --macaddress3 auto
VBoxManage modifyvm squeeze64 --macaddress4 auto
VBoxManage modifyvm squeeze64 --nictype1 $IFTYPE
VBoxManage modifyvm squeeze64 --nictype2 $IFTYPE
VBoxManage modifyvm squeeze64 --nictype3 $IFTYPE
VBoxManage modifyvm squeeze64 --nictype4 $IFTYPE
VBoxManage modifyvm squeeze64 --cableconnected2 off
VBoxManage controlvm squeeze64 setlinkstate2 off
VBoxManage modifyvm squeeze64 --hostonlyadapter1 vboxnet0
VBoxManage modifyvm squeeze64 --hostonlyadapter2 vboxnet0
VBoxManage modifyvm squeeze64 --hostonlyadapter4 vboxnet1

mv squeeze64.box manager.box

bundle exec vagrant box remove 'manager'
bundle exec vagrant basebox export squeeze64
mv  squeeze64.box boxes/manager.box
bundle exec vagrant box add 'manager' 'boxes/manager.box'

Адаптация Vagrant для использования eth2 для NAT

Не указав сеть hostonly в Vagrantfile, сохранил порядок и имена интерфейсов сетей hostonly без изменений. Но по умолчанию vagrant предполагает, что ему нужно установить сопоставление ssh-порта NAT на eth0. Чтобы указать на eth2, вы можете указать адаптер, явно добавив отображение ssh portforwarding в Vagrantfile.

  config.vm.forward_port("ssh",22,2222,{:auto => true,:adapter => 2})

Поддержка VLAN в Virtualbox

Я ожидал, что VLAN будет работать из коробки с Virtualbox, но это не так.

По какой-то причине и шлюз, и менеджер не могли общаться друг с другом. Я бы увидел, что пакеты приходят с обеих сторон на интерфейсах, но это просто не будет работать.

После некоторых поисков я нашел этот пост на VLAN Stripping в Virtualbox и его исследованиях .

Оказывается, поставщики сетевых драйверов Intel Pro, предоставляемые Virtualbox, удаляют теги VLAN. В блоге предлагается изменить типы интерфейса на более старый AMD PCNet Fast III. Это действительно сработало.

Но при больших всплесках сетевого трафика я столкнулся с предупреждением ядра NETDEV Watchdog: eth0: Тайм-аут передачи .

К счастью, в сетевой документации для Virtualbox есть третий вариант : драйверы virtio. Сначала я подумал, что это невозможно использовать, потому что я работал на Mac, но virtio являются драйверами внутри гостевой ОС, а не на хосте.

Вот почему в приведенных выше модификациях коробки мы устанавливаем nictype в virtio

VBoxManage modifyvm squeeze64 --nictype1 virtio

Соединение в Virtualbox

Много раз, воссоздавая vms, я заметил, что иногда мост не работает. Когда я посмотрел в графическом интерфейсе VirtualBox, я заметил, что иногда virtualbox указывает, что активное сетевое соединение находится на eth0 в шлюзе и на eth1 в диспетчере. Чтобы подделать поведение и иметь их обоих на тех же интерфейсах, я отключил кабель на eth1.

VBoxManage modifyvm squeeze64 --cableconnected2 off
VBoxManage controlvm squeeze64 setlinkstate2 off

Теперь мостовые сетевые интерфейсы всегда могут видеть друг друга.

PXE загрузка в Virtualbox

Если вы хотите использовать pxe-загрузку в virtualbox, обязательно установите пакет расширений. Это будет включать в себя функциональность загрузки PXE.

$ VBoxManage list extpacks
Extension Packs: 1
Pack no. 0:   Oracle VM VirtualBox Extension Pack
Version:      4.1.4
Revision:     74291
Description:  USB 2.0 Host Controller, VirtualBox RDP, PXE ROM with E1000 support.
VRDE Module:  VBoxVRDP
Usable:       true 
Why unusable: 

Более подробную информацию можно найти в документации Virtualbox

Создание pxe-boot basebox

Для server1 и server2 мы хотим, чтобы они загружались с узла менеджера. Это означает, что мы хотим иметь пустой диск, но с включенной сетевой загрузкой.

VBoxManage modifyvm pxe-server1 --boot4 net

Veewee пока не способен сделать это, но вот команды, которые мы использовали для создания пустого базового блока сетевой загрузки.

VMPATH="/"$(VBoxManage list systemproperties|grep "^Default"| cut -d '/' -f 2-)"/pxe/"
DISKPATH="/"$VMPATH/"/pxe.vdi"
VBoxManage unregistervm pxe --delete
rm -rf "$VMPATH"
VBoxManage createvm --name pxe --ostype Debian_64 --register
VBoxManage storagectl 'pxe' --name 'IDE Controller' --add ide
VBoxManage storagectl 'pxe' --name 'SATA Controller' --add sata --hostiocache off --sataportcount 1

VBoxManage createhd --filename "$DISKPATH" --size 20000 --format VDI 
VBoxManage storageattach 'pxe' --storagectl 'SATA Controller' --port 0 --device 0 --type hdd --medium "$DISKPATH"

Загрузка PXE на сервер1

Теперь, когда у нас есть базовый ящик загрузки pxe, мы можем начать изменять его следующим образом:

  • исправить macaddress, чтобы мы могли поместить их в dhcp
  • создать необходимые интерфейсы только для хоста

Поскольку первая загрузка pxe занимает много времени, мы увеличили время ожидания ssh в Vagrantfile

    config.ssh.timeout = 1000000
    config.ssh.max_tries = 50

Опять же драйвер virtio используется

IF_TYPE=virtio
VBoxManage unregistervm pxe-server1 --delete
VBoxManage clonevm pxe --name pxe-server1 --register

VBoxManage modifyvm pxe-server1 --memory 256 --ostype Debian_64

VBoxManage modifyvm pxe-server1 --nic1 hostonly
VBoxManage modifyvm pxe-server1 --nic2 hostonly
VBoxManage modifyvm pxe-server1 --nic3 nat
VBoxManage modifyvm pxe-server1 --nic4 none
VBoxManage modifyvm pxe-server1 --macaddress1 080027BA2DAE
VBoxManage modifyvm pxe-server1 --macaddress2 080027BE8E74
VBoxManage modifyvm pxe-server1 --macaddress3 auto
VBoxManage modifyvm pxe-server1 --macaddress4 auto
VBoxManage modifyvm pxe-server1 --nictype1 $IF_TYPE
VBoxManage modifyvm pxe-server1 --nictype2 $IF_TYPE
VBoxManage modifyvm pxe-server1 --nictype3 $IF_TYPE
VBoxManage modifyvm pxe-server1 --nictype4 $IF_TYPE
VBoxManage modifyvm pxe-server1 --cableconnected2 off
VBoxManage controlvm pxe-server1 setlinkstate2 off
VBoxManage modifyvm pxe-server1 --cableconnected3 off
VBoxManage controlvm pxe-server1 setlinkstate3 off
VBoxManage modifyvm pxe-server1 --hostonlyadapter1 vboxnet1
VBoxManage modifyvm pxe-server1 --hostonlyadapter2 vboxnet1
VBoxManage modifyvm pxe-server1 --boot4 net
rm boxes/pxe-server1.box
bundle exec vagrant box remove 'server1'
bundle exec vagrant basebox export pxe-server1
mv 'pxe-server1.box' boxes/
bundle exec vagrant box add 'server1' 'boxes/pxe-server1.box'

Исправление mac-адреса моста

Несмотря на то, что мы можем управлять mac-адресом через физические интерфейсы, macaddress моста назначается случайным образом.

Хитрость заключается в том, чтобы указать macaddress на if-up интерфейса моста

auto br0
iface br0 inet dhcp
  bridge_ports eth0
  bridge_maxage 12
  bridge_hello 2
  bridge_fd 6
  bridge_stp on
  post-up ip link set br0 address 08:00:27:ba:2d:ae

PXE boot для server2

Основное отличие от server1 заключается в том, что server2 всегда загружается из памяти.

Vagrant basebox export ожидает, что диск будет там. Поэтому мы должны назначить его один, даже если он нам не нужен.

Мы также обнаружили, что внутренняя поддержка pxe ограничена, использование ipxe.org позволило нам загружаться со многими специальными параметрами pxe.

Это заставило нас поместить загрузочный код ipxe на первый диск.

VBoxManage convertfromraw ../ipxe/ipxe.usb "$DISKPATH"

И замените диск на него, чтобы он воспроизводился с помощью vagrant export

Полный сценарий создания выглядит следующим образом

VMPATH="/"$(VBoxManage list systemproperties|grep "^Default"| cut -d '/' -f 2-)"/pxe-server2/"
DISKPATH="$VMPATH/pxe-server2.vdi"
VBoxManage storageattach 'pxe-server2' --storagectl 'SATA Controller'  --port 0 --device 0 --medium none
VBoxManage closemedium disk  "$DISKPATH" --delete
VBoxManage unregistervm pxe-server2 --delete
rm -rf "$VMPATH"
VBoxManage clonevm pxe --name pxe-server2 --register
VBoxManage modifyvm pxe-server2 --memory 1024 --ostype Debian_64
VBoxManage modifyvm pxe-server2 --nic1 hostonly
VBoxManage modifyvm pxe-server2 --nic2 hostonly
VBoxManage modifyvm pxe-server2 --nic3 nat
VBoxManage modifyvm pxe-server2 --nic4 none
VBoxManage modifyvm pxe-server2 --macaddress1 080027C5DAB8
VBoxManage modifyvm pxe-server2 --macaddress2 0800274020F8
VBoxManage modifyvm pxe-server2 --macaddress3 auto
VBoxManage modifyvm pxe-server2 --macaddress4 auto

VBoxManage modifyvm pxe-server2 --nictype1 virtio
VBoxManage modifyvm pxe-server2 --nictype2 virtio
VBoxManage modifyvm pxe-server2 --nictype3 virtio
VBoxManage modifyvm pxe-server2 --nictype4 virtio
VBoxManage modifyvm pxe-server2 --cableconnected2 off
VBoxManage controlvm pxe-server2 setlinkstate2 off
VBoxManage modifyvm pxe-server2 --cableconnected3 off
VBoxManage controlvm pxe-server2 setlinkstate3 off
VBoxManage modifyvm pxe-server2 --hostonlyadapter1 vboxnet1
VBoxManage modifyvm pxe-server2 --hostonlyadapter2 vboxnet1
VBoxManage modifyvm pxe-server2 --boot4 net
rm "$DISKPATH"
VBoxManage storageattach 'pxe-server2' --storagectl 'SATA Controller'  --port 0 --device 0 --medium none
VBoxManage closemedium disk  "$DISKPATH" --delete
VBoxManage convertfromraw ../ipxe/ipxe.usb "$DISKPATH"
VBoxManage storageattach 'pxe-server2' --storagectl 'SATA Controller' --type hdd --port 1 --device 0 --medium "$DISKPATH"

rm boxes/pxe-server2.box
bundle exec vagrant box remove 'server2'
bundle exec vagrant basebox export pxe-server2
mv 'pxe-server2.box' boxes/
bundle exec vagrant box add 'server2' 'boxes/pxe-server2.box'

Направляйте ssh в бродячую виртуальную машину через Hostonly IF

Вместо того, чтобы сопоставлять порты с сервером server1 или server2 через NAT, мы сочли полезным поместить интерфейс нашего хоста в сеть hostonly. Это позволило подключиться к сервисам на сервере1, сервере2, например.

VBoxManage hostonlyif ipconfig vboxnet1 --ip 172.168.0.1

А затем настройте, например, свойства ssh сервера server2 следующим образом:

    config.ssh.host = "172.168.0.22"
    config.ssh.port = 22

Вывод:

Чтобы это заработало, нужно немного помассировать, но это возможно:

  • по возможности используйте драйвер virtio
  • использовать ipxe для загрузки сложных настроек pxe
  • использовать hostonly сети для прямого доступа к услугам

Источник:  http://www.jedi.be/blog/2011/11/04/vagrant-virtualbox-hostonly-pxe-vlans/