September 6, 2022

WebVirtCloud - виртуальные машины на вашем сервере

Всем привет, дорогие нодеры!

Данный гайд не является чем-то сверхъестественным, скорее наоборот упрощенная инструкция рассчитанная на СНГ сегмент для поднятия виртуальных машин на Вашем железе. От мала до велика, от чайников до более менее "продвинутых" пользователей.

Официальный гайд на гитхаб: https://github.com/retspen/webvirtcloud

Данная инструкция является частью одного большого гайда, по поднятию нод-сканеров Forta. И да, гайд будет очень длинным.

UPD. 16.11.2022. Добавил в гайд инструкции для установки виртуальных машин на хостинге Hetzner или других хостерах.

Железо

В моем случае установка будет производиться на 2 локальные машины, которые находятся за роутером. Также возьмем одну машину у хостера, дабы разобраться со всеми тонкостями и нюансами.

Характеристики железа:

  1. Asrock pro v4/AMD Ryzen 2600/48GB RAM/2TB SSD NVME(Kingston).
  2. Huananzhi x99 F8/Intel Xeon 2666v3/48GB RAM/512GB SSD NVME(Samsung 970 EVO Pro).
  3. [NL] HP G7 / Intel 2xL5630 / 32GB RAM DDR3 / 2x240GB SSD / HW RAID / 1x1GE Port / 100TB Traffic(Zomro)

Установка будет происходить на Ubuntu 20.04

По моим прикидкам, на 1-ую машину будет до 4-5 виртуальных машин, а на 2-ую до 5-6. Пока будем делать 5+5 с характеристиками 2-4CPU/8-16GB RAM/50GB. Для наших целей более чем достаточно, а почему такой разброс в CPU и RAM вы поймете позже.

Также у меня есть внешний роутер, через который происходит "открытие/закрытие" портов.

Кроме того, я отдельно рассмотрю установку на сервере у хостера.

p.s. В вашем случае сервер может быть другим, например Hetzner AX101 или другое.

Проверка железа на виртуализацию

Прежде чем начать, обновляемся:

sudo apt update

Проверим наше железо на возможность запуска виртуализации

grep -E -c "vmx|svm" /proc/cpuinfo

Если выдало больше 0, значит переходим к следующему шагу

apt-get install cpu-checker -y

Вводим команду

kvm-ok

Если выдает нечто подобное, то всё ок, можно переходить к установке.

INFO: /dev/kvm exists
KVM acceleration can be used

Установка WebVirtCloud

Загружаем необходимые пакеты:

sudo apt install git virtualenv python3-virtualenv python3-dev \
python3-lxml libvirt-dev zlib1g-dev libxslt1-dev nginx supervisor \
libsasl2-modules gcc pkg-config python3-guestfs libsasl2-dev libldap2-dev \
libssl-dev -y 

Копируем git и создаем файл settings.py из шаблона

git clone https://github.com/retspen/webvirtcloud
cd webvirtcloud
cp webvirtcloud/settings.py.template webvirtcloud/settings.py

Далее необходимо сгенерировать ключ

openssl rand -base64 32

Копируем ключ и записываем его в файл settings.py

sudo nano $HOME/webvirtcloud/webvirtcloud/settings.py

Жмем Ctrl+O, Enter, Ctrl+X

Далее вводим команды

sudo cp conf/supervisor/webvirtcloud.conf /etc/supervisor/conf.d
sudo cp conf/nginx/webvirtcloud.conf /etc/nginx/conf.d
cd ..
sudo mv webvirtcloud /srv
sudo chown -R www-data:www-data /srv/webvirtcloud
cd /srv/webvirtcloud
virtualenv -p python3 venv
source venv/bin/activate
pip install -r conf/requirements.txt
python3 manage.py migrate
python3 manage.py collectstatic --noinput
sudo chown -R www-data:www-data /srv/webvirtcloud
sudo rm /etc/nginx/sites-enabled/default

Перезапускаем ngnix, supervisor

sudo service nginx restart
sudo service supervisor restart

Устанавливаем libvirt и KVM на сервер

wget -O - https://bit.ly/36baWUu | sudo sh

Прежде чем начать настраивать непосредственно сервер в WEB-панели, нужно добавить права доступа к файлам

echo "chmod 777 /var/run/libvirt/libvirt-sock" >> ~/.bash_profile
source ~/.bash_profile

Работа с панелью

Переходим в браузере по ссылке http://serverip

Появляется окно с авторизацией,
логин: admin
пароль: admin

Если данные манипуляции выполняются на арендованном сервере, то в первую очередь необходимо зайти в наш профиль и поменять пароль

Переходим в настройки(Settings)

Меняем Disk Cahe на None
Меняем Disk IO на Native

Переходим в Computes, жмем Local

Вводим имя, такое же как у нас имя сервера либо localhost

Т.к. у меня fortamain, я его и запишу

Далее переходим внутрь компьюта, нажав на глазок.

Прежде чем продолжить, выполняем на сервере команду для создания одной папки и двух подпапок iso и images

mkdir /home/kvm/
mkdir /home/kvm/{iso,images}

Сразу сохраним образ ubuntu 20.04 на машину, выполняем следующие команды:

cd /home/kvm/iso/
wget https://releases.ubuntu.com/20.04/ubuntu-20.04.5-live-server-amd64.iso

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

Переходим в Storages, жмем плюсик чтобы добавить хранилище

Создаем первое хранилище со следующими настройками

Аналогично следующее хранилище, только вкладка iso

В нем, как раз и будет находится наш образ Ubuntu.

Настройка сети(локально)

В случае если Вы запускаете на локальной машине, то нам необходимо установить бридж и настроить его.
Если же это делается на выделенном сервере у хостера, то делать это не надо, просто пропустите данный шаг.

Еще раз! Данные манипуляции подходят только для установки на локальной машине. Для Hetzner такое делать нельзя! Получите предупреждение от хостера, особенно если смените mac адрес!

Ниже мы рассмотрим оба варианта. Начнем с локальной машины.

Сейчас все делаем с предельной осторожностью, иначе вы потеряете доступ к серверу

Устанавливаем bridge

sudo apt install bridge-utils

Теперь надо поправить файл 00-installer-config.yaml в папке /etc/netplan/ под Ваше оборудование

/etc/netplan/

Перед тем как начать редактировать config файл, надо запомнить название устройства:

В моем случае enp9s0, который мы запоминаем, а mac-адрес мы подставим либо наш уже имеющийся, либо рандомный

Редактируем файл 00-installer-config.yaml

network:
  ethernets:
    enp9s0:
      dhcp4: false
      dhcp6: false
  version: 2

  bridges:
    br0:
      macaddress: 16:76:1a:3b:be:03
      interfaces:
        - enp9s0
      dhcp4: true
      dhcp6: false
      parameters:
        stp: true
        forward-delay: 4

enp9s0(дважды), macaddress меняем на свои!

Менять я буду вручную в файле через mobaxterm.

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

sudo netplan apply

Если всё ок, то настройки примутся, если же нет, то мы или потеряем доступ к серверу или же выдаст ошибку.

Далее еще один важный момент. Чтобы наш kvm хост мог осуществлять транзит пакетов через себя, надо это явно разрешить в sysctl. Добавляем в /etc/sysctl.d/99-sysctl.conf новый параметр. Он там уже есть, надо только снять пометку комментария.

net.ipv4.ip_forward=1

Применяем новую настройку ядра.

sudo sysctl -p /etc/sysctl.d/99-sysctl.conf

Перезагружаем сервер

reboot

В конце манипуляций в разделе interfaces появится наш бридж

Если всё сделано правильно, то сервер перезагрузится и у вас будет доступ к нему. А если не будет доступа к серверу, то поздравляю - бегом переустанавливать систему!

Настройка сети (арендованный сервер)

В случае работы с hetzner, может не запуститься virbr0(virtual bridge), а он нам нужен, для этого выполняем следующие манипуляции

Переходим в наш сервер из раздела Computes

Заходим в раздел Networks и жмем на default

Появится примерно следующего вида страница. У меня virbr0 уже включен, в Вашем случае может быть наоборот. Для этого нажимаем кнопку Start, она будет примерно там, где я указал стрелочкой.

После этого можно переходить к настройке, в самом конце будет инструкция как подключиться к виртуальной машине при помощи "другого" порта

Продолжаем настройку

Машина настроена, пора создать intance

Жмем сверху intances и плюсик справа, потом выбираем нашу машину, жмем chose

Далее оставляем как есть, жмем next

Можно создать свой шаблон, но я буду использовать micro, потом делать для него resize

Жмем плюсик напротив micro(1-ая строка)

Заполняем Name, ну и при желании выбираем Storage, но я оставлю как есть.

Поздравляю, первая виртуальная машина сделана, необходимо ее настроить

Первым делом, заходим в Resize. Указываем настройки процессора и жмем Resize. У меня будут Current:2, Maximum:4.

Вы выбираете для себя необходимое количество.
Исходя из требований и кол-ва виртуальных машин.

Идем опять в Resize и выбираем вкладку Memory. Аналогично CPU я указываю 8gb ram/16gb ram и жму Resize.
Наблюдения: для форты хватит и 8gb/8gb, но не меньше, иначе будет ругаться сканер!

Таким же образом захожу в Resize, вкладка Disk. Указываю 50GB(хотя хватит и 20GB), подтверждаю настройки, нажатием кнопки Resize.

После всех манипуляций сверху мы увидим наши настройки виртуальной машины(ВМ).

Далее переходим в раздел настройки(Settings), подраздел Disk, жмем Mount напротив нашего образа

Далее, в случае если у Вас машина стоит дома или же Вы "поднимаете на локалке", то также необходимо зайти в Settings, подраздел Network и поменять Source на br0, т.е. на наш созданный бридж. Если Вы поднимаете у хостера, то у Вас будет Interface virbr0.

Клонирование виртуальных машин

Теперь чтобы упростить процесс, можно клонировать ВМ. Для этого заходите в раздел Settings. подраздел Clone.

Важное замечание! Делать это нужно до запуска и установки ВМ, во избежание косяков.

Таким образом мы сделали 5 ВМ

Запуск и установка Ubuntu 20.04

Для первого запуска, нам необходимо установить нашу ВМ.

Для тех кто "продвинут" в этом вопросе, могут просто пропустить данный шаг.

Переходим в нашу виртуальную машину(ВМ), жмем кнопку Power On

Далее раздел Access, жмем кнопку консоль. При нажатии на нее будет всплывающее окно с доступом к серверу

Выбираем необходимый нам язык, я же буду по старинке на English.

Язык клавиатуры English (US) в обоих вариантах, по стандарту.

Жмем Done. Идем дальше.

Настройки сети. Здесь должно определиться само. Если внутри локальной сети, смотрите чтобы ip соответствовал ей. Если не так, проверьте настройки Network(сети) в WebVirtCloud, возможно у вас не включен бридж.

В случае если данные манипуляции производятся на арендованном сервере, то должен отобразиться ip подсети, у меня это 192.168.122.XXX.

Необходимо запомнить или записать данный адрес, он нам пригодится чуть позже!

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

Следующий шаг оставляем как есть

Далее надо задать настройки диска. На данном этапе оставляю как есть, а на следующем шаге, сделаем несколько манипуляций, дабы использовать весь диск.

Здесь необходимо сделать Unmount раздела / и добавить оставшееся свободное место, но это необязательно, т.к. для Forta хватит и этого пространства. Либо вы можете добавить раздел /home чтобы сохранять рабочие файлы там.
Я же объединяю всё под /, чтобы не заморачиваться, хотя правильнее будет хранить рабочие файлы в другой папке.

Указываем максимальное пространство, а также не забываем в графе выбора Mount указать раздел /

После того как с разметкой разделов закончили, выбираем Done и жмем Enter

Нас предупредят, что мы потеряем всю информацию на данных дисках, с чем я и соглашаюсь.

Далее необходимо указать:

  1. Ваше Имя
  2. Имя сервера
  3. Выбрать логин(советую каждый раз выбирать новый)
  4. Указать пароль дважды

После ввода данных, подтверждаем и появляется следующий экран с предложением установить OpenSSH сервер, жмем Enter(ставим крестик), потом Done. При желании вы можете импортировать SSH ключ, но в данном гайде я не буду рассматривать этот подпункт.

Из всего имеющегося ниже, я бы установил только Docker, но я буду его ставить отдельно для сканера Forta, поэтому кручу вниз и жму Done.

Пошел процесс установки. Ждем пока не появится кнопка reboot

Кнопка появилась, жмем ее

Теперь система ругается что у нас смонтирован образ системы.

Необходимо перейти в WebVirtCloud, Settings, Disk и нажать Unmount.

Возвращаемся к нашему окну и жмем Enter, чтобы запустилась система.

На этом установка закончилась, можно подключиться к серверу по своему ip и логин\паролю.

P.s. для удобства, можно нажать в веб-панели на глазок, чтобы зайти в vnc консоль сразу.

Вход на каждую ВМ под собственным портом

В случае если мы делаем на локальной машине и у нас есть dhcp(автоматическое определение машин и назначение им ip адреса в сети), то данный пункт будет нам неинтересен, ибо каждый раз будет новый ip на виртуалке.

Однако если делать ВМ на сервере, то при наличии нескольких машин с одним логином, возникнут проблемы.

Чтобы не возникало проблем, нужно сделать следующие манипуляции на нужной нам ВМ.

При установке я говорил запомнить данный адрес, в данном случае 192.168.122.136

Далее на основной машине, где у нас установлена KVM, необходимо выполнить следующие команды в iptables

sudo iptables -I FORWARD -o virbr0 -d 192.168.122.XXX -j ACCEPT
sudo iptables -t nat -I PREROUTING -p tcp --dport NNN -j DNAT \
--to 192.168.122.XXX:22

Где XXX - окончание ip адреса нашего сервера, в моем примере это будет 136,
а NNN - номер порта, по которому будет происходить подключение к серверу.

Пример:

sudo iptables -I FORWARD -o virbr0 -d 192.168.122.136 -j ACCEPT
sudo iptables -t nat -I PREROUTING -p tcp --dport 2201 -j DNAT --to 192.168.122.136:22

Пример копировать не надо! У Вас будут свои настройки!

Повторяем данные команды для нужного нам количества серверов!

Поздравляю. Настройка закончена!

Теперь мы можем подключиться к нашему серверу по порту, например, как на скриншоте выше.

Также при желании Вы можете сразу сделать настройки авторизации под root пользователем: https://teletype.in/@mrnixon/root-ssh#5bmr

Благодарности

Если хотите сказать спасибо или у Вас есть вопросы, то можете обратиться ко мне в телеграм https://t.me/N1xxxon :)