PROXMOX

Задача

1. Установить на "железную" машину систему виртуализации PROXMOX с готового образа.
2. Установить ВМ с Windows 2008 Server.
3. Сделать доступ к хостовой машине по нестандартным портам.
4. Настроить доступ ВМ в интернет и доступ извне к службам на ВМ - RDP, RADMIN, FTP по нестандартным портам.

Реализация

Установка и первоначальная настройка

Установка производилась с загрузочной USB флешки, "приготовленной" командой:

dd if=proxmox-ve_4.4-eb2d6f1e-2.iso of=/dev/sde bs=1M
Картинки процесса установки:

Последующие действия удобнее проводить с другого компьютера, соединившись с сервером по SSL на стандартный (22) порт пользователем root и с паролем, указанным при установке.

Увеличение раздела root

Увеличение корневого раздела возможно, если при установке было оставлено свободное место в группе логических томов в параметре "minfree".

Выясняем, какой том соответствует root:

lvdisplay

Получаем, в том числе:

--- Logical volume ---
LV Path                /dev/pve/root
LV Name                root
VG Name                pve
LV UUID                XiaskC-GJlj-3qrl-I1WL-OgHk-AtU8-Cpz10K
LV Write Access        read/write
LV Creation host, time proxmox, 2017-04-08 21:56:34 +0300
LV Status              available
# open                 1
LV Size                14.00 GiB
Current LE             3584
Segments               2
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           251:0

Текущий размер тома root - 14 гигабайт.

Проверяем наличие свободного места в группе томов:

vgdisplay

Получаем:

File descriptor 7 (pipe:[16710]) leaked on vgdisplay invocation. Parent PID 1221: bash
--- Volume group ---
VG Name               pve
System ID             
Format                lvm2
Metadata Areas        1
Metadata Sequence No  9
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                3
Open LV               2
Max PV                0
Cur PV                1
Act PV                1
VG Size               48.57 GiB
PE Size               4.00 MiB
Total PE              12435
Alloc PE / Size       5270 / 20.59 GiB
Free  PE / Size       7165 / 27.99 GiB
VG UUID               DYeAvN-oaWd-esYV-9xze-2bvu-TN3T-SH1tnf

Свободно - 27.99 гигабайт.

Увеличиваем размер тома, заняв всё свободное место:

lvextend -l +100%FREE /dev/pve/root

Или только на нужное число:

lvextend -L+10G /dev/pve/root

и:

resize2fs -p /dev/pve/root

Настройка репозиториев, обновление

Удаляем платный репозиторий

rm /etc/apt/sources.list.d/pve-enterprise.list

Добавляем community репозитории

cat >> /etc/apt/sources.list.d/proxmox.list << EOF
deb http://download.proxmox.com/debian jessie pve-no-subscription pvetest
deb http://ftp.debian.org/debian jessie main contrib
EOF

Обновление:

aptitude -y update

Полный апгрейд (можно сделать позже):

aptitude -y full-upgrade

Установка "любимого" MC:

aptitude -y install mc

Откючение сообщения об отсутствии платной подписки при входе в WEB интерфейс.

sed -i.bak "s/data.status !== 'Active'/false/g" /usr/share/pve-manager/js/pvemanagerlib.js

Взято отсюда (Установка Proxmox VE 4.2 - 1.3. Обновляем Promox).
После какого-то обновления, строка вернулась к исходному виду. Пршлось запускать повторно.

Если при обновлении из WEB интерфейса, выскакивает ошибка:

GPG error: http://download.proxmox.com jessie InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY C23AC7F49887F95A

С консоли ввести:

gpg --keyserver pgpkeys.mit.edu --recv-key C23AC7F49887F95A
gpg -a --export C23AC7F49887F95A | apt-key add -

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

Включения форвардинга

Необходимо включить форвадинг пакетов - в файле /etc/sysctl.conf раскомментировать строку

net.ipv4.ip_forward=1

Для доступа извне к FTP ВМ нужно подгружать модуль ядра, для этого в файле /etc/modules добавить строку

nf_nat_ftp

Интерфейсы на хостовой машине

Создаётся два интерфейса - один соответствует физическому, другой - мост к виртуальным машинам.

eth0 - это физический интерфейс "железной" машины.
vmbr0 - виртуальный интерфейс. Этот интерфейс будет шлюзом для ВМ.

В результате, файл /etc/network/interfaces должен выглядеть так:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
      address  192.168.1.15
      netmask  255.255.255.0
      gateway  192.168.1.3

auto vmbr0
iface vmbr0 inet static
      address  192.168.10.1
      netmask  255.255.255.0
      bridge_ports none
      bridge_stp off
      bridge_fd 0

Для применения изменений без перезагрузки (но, почему-то, срабатывает не всегда, надёжнее, всё-таки перезагрузка):

service networking reload

Правила IPTABLES

Для правил iptables, создаём файл /etc/network/iptables примерно такого содержания:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Входящие на хост
# Нестандартный SSH
-A INPUT -m state --state NEW -m tcp -p tcp --dport 14022 -j ACCEPT
# Нестандартный PROXMOX WEB
-A INPUT -m state --state NEW -m tcp -p tcp --dport 14033 -j ACCEPT
# Нестандартный удалённый терминал SPICE
-A INPUT -m state --state NEW -m tcp -p tcp --dport 14044 -j ACCEPT

# Разрешить все входящие от виртуальной внутренней сети
-A INPUT -m iprange --src-range 192.168.10.2-192.168.10.254 -j ACCEPT

# Ответы и релеи
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# PING
-A INPUT -p icmp -j ACCEPT
# Локальный интерфейс
-A INPUT -i lo -j ACCEPT

# Разрешение форварда пакетов
-A FORWARD -j ACCEPT

# Всё остальное - запретить
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT
*mangle
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*nat
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]

# Нестандартный RDP w2008
-A PREROUTING -i eth0 -p tcp --dport 20577 -j DNAT --to 192.168.10.15:3389
# Нестандартный RADMIN w2008
-A PREROUTING -i eth0 -p tcp --dport 20578 -j DNAT --to 192.168.10.15:4899
# Нестандартный FTP w2008
-A PREROUTING -i eth0 -p tcp --dport 20579 -j DNAT --to 192.168.10.15:21

# Выход в интернет
-A POSTROUTING -m iprange --src-range 192.168.10.2-192.168.10.254 -j MASQUERADE

COMMIT

Извне разрешён доступ к SSH хоста по нестандартному порту 14022 и доступ к службам RDP, RADMIN, FTP в ВМ по нестандартным портам 20577, 20578, 20579, соответственно.

Чтобы правила применялись при загрузке "железной" машины, в директории /etc/network/if-up.d создаём файл iptables со следующим содержимым:

#!/bin/sh
iptables-restore < /etc/network/iptables

И устанавливаем ему флаг исполнения.
После изменения правил в /etc/network/iptables, для их применения нужно запустить /etc/network/if-up.d/iptables или выполнить команду, указанную в этом скрипте. Правила применяются сразу, ни перезапуска сети, ни перезагрузки машин не требуется.


Нестандартный порт для SSH

В файле /etc/ssh/sshd_config меняем значение "Port" со стандартного (22) на какой-либо другой, например, 14022.


Нестандартный порт для WEB PROXMOX

Для доступа к WEB PROXMOX по нестандартному порту применён HAPROXY (который оказался установлен и запущен на машине с PROXMOX).
В файле "/etc/haproxy/haproxy.cfg" добывляем правило пересылки:

listen NON-STANDARD-PROXMOX-WEB 0.0.0.0:14033
  mode tcp
  server LOCAL 127.0.0.1:8006

и перезапустить HAPROXY - "service haproxy restart".
Это означает: Слушать порт 14033 на всех адресах хостовой машины и перенаправлять пакеты, приходящие на этот порт на порт 8006 (стандартный порт WEB PROXMOX).


Нестандартный порт для SPICE

Исправить все значения "3128", например, на 14044 в файлах:

/usr/share/perl5/PVE/HTTPServer.pm:          my $remport = $remip ? 3128 : $spiceport;
/usr/share/perl5/PVE/AccessControl.pm:       proxy => "http://$proxy:3128",
/usr/share/perl5/PVE/Service/spiceproxy.pm:  my $socket = $self->create_reusable_socket(3128, undef, $family);
/usr/share/perl5/PVE/Service/spiceproxy.pm:  SPICE proxy server for Proxmox VE. Listens on port 3128.
/usr/share/perl5/PVE/API2Tools.pm:           my $port = $uri->port || 3128;

и перегрузиться.
Найдено здесь.
А, вообще-то, это свинство, жёстко забивать порт службы и клиента в перловых модулях. Стыдно, господа австрийцы…


Интерфейсы виртуальных машин

Для ВМ сетевой интерфейс установлен в "Bridged mode" на "vmbr0":

На виртуальных машинах устанавливается IP из диапазона 192.168.10.2-192.168.10.254 с адресом шлюза 192.168.10.1.

Конвертация образа VHD в образ QCOW2

qemu-img convert W2008.vhd -O qcow2 W2008.qcow2
В случае использования LVM в PROXMOX (по умолчанию), образ должен быть в RAW:
qemu-img convert W2008.vhd -O raw W2008.raw

В ВМ создаётся новый диск, размером чуть больше образа (позже его можно будет "расширить" средствами Windows), выясняется его местоположение и образ копируется в этот диск:

dd if=W2008.raw of=/dev/pve/vm-100-disk-2 bs=1M

или, вообще, не использовать конвертацию, если VHD уже в RAW:

dd if=W2008.vhd of=/dev/pve/vm-100-disk-2 bs=1M

Конвертация образа диска из одного формата в другой

qemu-img convert -f vdi W2008.vdi -O qcow2 W2008.qcow2
Поддерживаемые форматы в опциях "-f" и "-O" - vhdx blkdebug iscsi vvfat null-aio gluster host_cdrom null-co vmdk host_device cloop quorum qcow2 blkreplay blkverify qcow vdi raw sheepdog qed luks nbd dmg rbd file parallels vpc bochs zeroinit

Добавление уже существующего образа диска к ВМ

Подключен новый физический диск. Точка монтирования - /mnt/storage.
К хранилищу добавлена директория для хранения образов:

Существующий образ диска "vm-100-disk-1.qcow2" помещён в директорию "/mnt/storage/images/100"
Для добавления, выполнить команду в консоли:

qm rescan -vmid 100

где "100" идентификатор ВМ.
После чего, диск появится в ВМ, как неисползуемый. Далее "Edit" и "Add".

Общий SAMBA ресурс для ВМ на хосте

Установка SAMBA

aptitude install samba samba-client

Настройка общего ресурса

Правим "/etc/samba/smb.conf":

[global]
workgroup = VGROUP

[share]
comment = Общий ресурс для ВМ
obey pam restrictions = Yes
read only = no
locking = no
path = /mnt/storage/share
guest ok = no
force create mode=0660
create mask=0660
directory mask = 0770

Директория общего ресурса "/mnt/storage/share" должна иметь атрибуты, позволяющие полный доступ (0777).

Добавление пользователей SAMBA

Учётные записи пользователей и их пароли на ВМ и на SAMBA сервере должны совпадать. Также пользователи должны существовать и на хостовой системе:

Добавление пользователя user в хост:

useradd user -M -N

Добавление пользователя user в SAMBA:

smbpasswd -a user

Проверка списка пользователей SAMBA:

pdbedit -w -L

Проверка работы SAMBA

Перезапустить SAMBA:

systemctl restart smbd

Проверка подключения пользователя user:

smbclient -U user //myhost/share

Где, "myhost" - имя машины-хоста (так-же можно использовать "localhost" или виртуальный IP адрес ностовой машины).

Подключение к ресурсу в ВМ с Windows

Подключить сетевой диск. В качестве папки указать "\\myhost\share" (или, вместо myhost, указать виртуальный IP адрес хостовой машины)

Взято, в основном отсюда.

Подключение новых дисков к хосту

Установить parted:

aptitude install parted

Запуск parted (sdb - новый диск):

parted /dev/sdb

В parted:
Создаём таблицу разделов GPT:

mklabel gpt

Создаём первичный раздел со 100% заполнением:

mkpart primary 0% 100%

Выходим из gparted (q) и проверяем наличие созданного раздела (sdb1):

lsblk --fs

Форматируем в ext4, нулевым резервированием и меткой "storage1":

mkfs.ext4 -m 0 -L storage1 /dev/sdb1

Создаём точку монтирования:

mkdir /mnt/storage1

В /etc/fstabs добавляем строчку:

/dev/sdb1       /mnt/storage1   ext4    defaults        0 0

Монтируем:

mount /dev/sdb1

Подключение шифрованных дисков к хосту

Устанавливаем пакет утилит для шифрование методом LUKS:

aptitude install cryptsetup

Шифруем раздел (попросит ввести слово "YES" в верхнем регистре и дважды ввести пароль шифрования):

cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/sdb

Монтируем шифрованный раздел (попросит ввести пароль):

cryptsetup luksOpen /dev/sdb sdb

Форматируем в ext4, нулевым резервированием и меткой "storage1":

mkfs.ext4 -m 0 -L storage1 /dev/mapper/sdb

Создаём точку монтирования:

mkdir /mnt/storage1

Монтируем:

mount -t ext4 /dev/mapper/sdb /mnt/storage1

Для монтирования с вводом пароля, создаётся скрипт "cr-mount" в "/usr/local/sbin" (в него добавлять все шифрованные диски для монтирования). Его необходимо запускать после каждой перезагрузки хоста и вводить пароли для каждого шифрованного диска:

#!/bin/sh
DEV=sdb
MP=storage1
echo Mount /dev/$DEV to /mnt/$MP
cryptsetup luksOpen /dev/$DEV $DEV
mount -t ext4 /dev/mapper/$DEV /mnt/$MP
df -h /mnt/$MP
echo -------------------------------------------------

Если диски зашифрованы с использованием одного пароля, можно ввод пароля сделать один раз

#!/bin/bash
function crypt_mount {
  echo Mount /dev/$1 to /mnt/$2
  echo -n "$3" | cryptsetup luksOpen /dev/$1 $1 -
  mount -t ext4 /dev/mapper/$1 /mnt/$2
  echo -n "Test to mount: "
  mount | grep $1
  }
read -t 30 -sp "Password: " PASS
crypt_mount sdb storage1 $PASS
crypt_mount sdс storage2 $PASS

Размонтирование и отключение:

umount /dev/mapper/sdb
cryptsetup luksClose /dev/mapper/sdb

Кое-что на память

При установке по умолчанию,
Бэкапы ВМ лежат в "/var/lib/vz/dump"
ISO образы в "/var/lib/vz/template/iso"

В файле "/etc/issue" содержится текст приглашения, выводимый на консоль. При перезагрузке хоста - перезаписывается на дефолтный (откуда - пока не знаю).

Служба WEB PROXMOX - pveproxy (Отсюда...)

Наверх