Я бредил о
Бродяге
много-
много раз прежде.
Первоначально это было сделано для отдельных машин, работающих за интерфейсом 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/