Виртуализация и хост-ноды

Продажа VPS на Proxmox VE: массовое создание через cloud-init, лимиты и защита от кражи IP

7 шагов 17 мин чтения 35 просмотров 0
Содержание

После установки Proxmox VE на хост-ноду начинается основная работа — превратить её в VPS, которые можно продавать: быстро создавать много виртуальных машин, выдавать каждой собственный IP и пароль, соблюдать лимиты тарифа и не допускать, чтобы клиент занял чужой IP. Эта статья посвящена именно эксплуатационной стороне: клонирование VPS из шаблона cloud-init, автоматическая настройка IP, пароля и SSH-ключа, ограничение CPU, дискового ввода-вывода и полосы пропускания, защита от кражи IP средствами файрвола Proxmox, отдельный вход в консоль для клиентов и скрипт для массового создания VPS.

Предполагается, что Proxmox VE уже установлен и мост работает (см. установка Proxmox VE на выделенный сервер), а также что у вас есть шаблон cloud-init (см. создание шаблона cloud-init). Проверьте всё на одном VPS, прежде чем создавать десятки, и сохраните доступ к консоли IPMI/KVM хоста на случай, если изменение сети отрежет вас от сервера.

Шаг 1: Клонирование VPS из шаблона

Полный клон (full clone) не зависит от шаблона, поэтому шаблон можно позже удалить или обновить. Связанные клоны (linked clone) создаются быстрее и занимают меньше места, но каждый из них зависит от диска шаблона.

# Template 9000 -> new VPS 101 (full clone on local-lvm)
qm clone 9000 101 --name vps101 --full 1 --storage local-lvm

# Plan resources: 2 vCPU, 2 GB RAM (no ballooning), 40 GB disk
qm set 101 --cores 2 --memory 2048 --balloon 0
qm resize 101 scsi0 40G
qm set 101 --onboot 1

Шаг 2: IP, пароль и SSH-ключ через cloud-init

Cloud-init при первой загрузке записывает в VPS сетевые настройки и данные для входа, так что клиент получает готовый сервер, а вам не нужно на него заходить.

qm set 101 \
  --net0 virtio,bridge=vmbr0,firewall=1 \
  --ipconfig0 ip=203.0.113.11/24,gw=203.0.113.1 \
  --nameserver "1.1.1.1 8.8.8.8" \
  --ciuser root \
  --cipassword 'Ch4nge-This-Password' \
  --sshkeys /root/customer101.pub

qm start 101
qm guest cmd 101 network-get-interfaces   # works once qemu-guest-agent is running in the VPS

Если позже вы меняете параметры cloud-init, пересоздайте диск cloud-init (qm cloudinit update 101) и перезагрузите VPS. Для IPv6 добавьте ip6=2001:db8:100::11/64,gw6=2001:db8:100::1 в --ipconfig0.

Шаг 3: Ограничения по тарифу

# CPU: at most 2 cores of CPU time in total, normal scheduling weight
qm set 101 --cpulimit 2 --cpuunits 100

# Bandwidth: rate is in MB/s on the virtual NIC (12.5 MB/s = 100 Mbps)
qm set 101 --net0 virtio,bridge=vmbr0,firewall=1,rate=12.5

# Disk I/O: repeat the disk exactly as shown by "qm config 101", adding the limits
qm config 101 | grep scsi0
qm set 101 --scsi0 local-lvm:vm-101-disk-0,size=40G,iops_rd=2000,iops_wr=2000,mbps_rd=200,mbps_wr=150

Учтите, что --net0 заменяет описание сетевой карты целиком: сохраните прежний MAC-адрес, скопировав его из qm config (virtio=BC:24:11:...), иначе VPS получит новый MAC и может потерять сеть, если вышестоящая сеть привязывает IP к MAC. Лимиты диска не дают одному «шумному» VPS тормозить все остальные VPS на том же диске.

Шаг 4: Защита от кражи IP файрволом Proxmox

Без фильтрации клиент с root-доступом может прописать у себя любой свободный IP из вашего блока и занять его. IP filter файрвола Proxmox отбрасывает пакеты VPS, у которых адрес источника не входит в разрешённый список. Сначала файрвол нужно включить на уровне датацентра (Datacenter); задайте там входящую политику ACCEPT, чтобы не заблокировать себе доступ к хосту.

# /etc/pve/firewall/cluster.fw  (datacenter level)
[OPTIONS]
enable: 1
policy_in: ACCEPT
# /etc/pve/firewall/101.fw  (VPS 101)
[OPTIONS]
enable: 1
ipfilter: 1
macfilter: 1
policy_in: ACCEPT
policy_out: ACCEPT

[IPSET ipfilter-net0]
203.0.113.11
2001:db8:100::11
pve-firewall compile >/dev/null && pve-firewall restart
pve-firewall status

На сетевой карте должен быть указан firewall=1 (задан в шаге 2). macfilter (включён по умолчанию) не позволяет VPS сменить MAC-адрес. Проверьте изнутри VPS: если добавить второй, не выданный ему IP и попробовать пинговать с него, пакеты теперь не должны проходить.

Шаг 5: Отдельный вход в консоль для клиентов

Клиенту, который сломал сеть на своём VPS, всё равно нужна консоль, чтобы её починить. Создайте пользователя Proxmox, который видит только свой VPS и может управлять только им:

pveum user add customer101@pve --password 'Another-Strong-Pass' --comment "VPS 101"
pveum acl modify /vms/101 --users customer101@pve --roles PVEVMUser

Клиент входит по адресу https://HOST_IP:8006, выбрав realm «Proxmox VE authentication server», и видит только VPS 101 — с консолью, управлением питанием и собственными графиками. Для полностью автоматизированного магазина с биллингом следующий шаг — панель вроде Virtualizor или WHMCS с модулем Proxmox.

Шаг 6: Массовое создание VPS

Скрипт ниже читает по одной строке на каждый VPS (ID, IP, RAM в МБ, число ядер, диск) и создаёт их из шаблона с описанными выше настройками. Используйте случайные пароли и храните их в надёжном месте до передачи клиентам.

cat > /root/vps-list.txt <<'EOF2'
101 203.0.113.11 2048 2 40G
102 203.0.113.12 2048 2 40G
103 203.0.113.13 4096 4 80G
EOF2

cat > /root/make-vps.sh <<'EOF2'
#!/bin/bash
set -e
TEMPLATE=9000; GW=203.0.113.1; PREFIX=24
while read -r ID IP RAM CORES DISK; do
  [ -z "$ID" ] && continue
  PASS=$(openssl rand -base64 12)
  qm clone $TEMPLATE $ID --name vps$ID --full 1 --storage local-lvm
  qm set $ID --cores $CORES --memory $RAM --balloon 0 --onboot 1 --cpulimit $CORES
  qm resize $ID scsi0 $DISK
  qm set $ID --net0 virtio,bridge=vmbr0,firewall=1,rate=12.5 \
             --ipconfig0 ip=$IP/$PREFIX,gw=$GW --nameserver "1.1.1.1 8.8.8.8" \
             --ciuser root --cipassword "$PASS"
  printf '[OPTIONS]\nenable: 1\nipfilter: 1\nmacfilter: 1\npolicy_in: ACCEPT\npolicy_out: ACCEPT\n\n[IPSET ipfilter-net0]\n%s\n' "$IP" > /etc/pve/firewall/$ID.fw
  qm start $ID
  echo "$ID $IP root $PASS" >> /root/vps-credentials.txt
done < /root/vps-list.txt
chmod 600 /root/vps-credentials.txt
EOF2

chmod +x /root/make-vps.sh && /root/make-vps.sh

Шаг 7: Контроль хост-ноды

  • RAM: суммарно выделенная память должна быть меньше физической за вычетом 4–8 ГБ для самого хоста и ZFS/кэша. Оверселл памяти — самый быстрый способ замедлить все VPS сразу.
  • Диск: тонкие хранилища (LVM-thin, ZFS) допускают переподписку, но следите за реальным использованием через lvs или zfs list: переполненный thin pool может повредить диски VPS.
  • Абьюз: один VPS, с которого идут атаки или спам, может отправить в блэклисты весь ваш блок IP. См. поиск VPS-нарушителей на хост-ноде.
  • Бэкапы: настройте расписание, как описано в статье резервные копии и снапшоты Proxmox VE.

Частые вопросы

У нового VPS нет сети

Проверьте IP, префикс и шлюз в qm config, убедитесь, что используется тот мост, через который идёт ваш блок IP, и что IPSet фильтра IP содержит IP этого VPS. Если вышестоящая сеть привязывает IP к MAC-адресам, VPS в режиме моста нужна маршрутизируемая схема или виртуальные MAC; см. настройка сети Proxmox VE на хост-ноде.

Пароль, заданный через cloud-init, не подходит

В некоторых образах вход root по паролю через SSH отключён. Войдите по SSH-ключу или через консоль и при необходимости разрешите вход по паролю в /etc/ssh/sshd_config либо сразу внесите это изменение в шаблон.

Можно ли так продавать Windows VPS?

Да, с шаблоном Windows, подготовленным через cloudbase-init или sysprep, но за лицензирование Windows отвечаете вы: для каждого VPS нужна действующая лицензия Windows.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP хост-сервера, версию Proxmox VE, ID виртуальной машины с выводом qm config ID и полный текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства