После установки Proxmox VE на хост-ноду начинается основная работа — превратить её в VPS, которые можно продавать: быстро создавать много виртуальных машин, выдавать каждой собственный IP и пароль, соблюдать лимиты тарифа и не допускать, чтобы клиент занял чужой IP. Эта статья посвящена именно эксплуатационной стороне: клонирование VPS из шаблона cloud-init, автоматическая настройка IP, пароля и SSH-ключа, ограничение CPU, дискового ввода-вывода и полосы пропускания, защита от кражи IP средствами файрвола Proxmox, отдельный вход в консоль для клиентов и скрипт для массового создания 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
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.
# 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 на том же диске.
Без фильтрации клиент с 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 и попробовать пинговать с него, пакеты теперь не должны проходить.
Клиенту, который сломал сеть на своём 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.
Скрипт ниже читает по одной строке на каждый 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
lvs или zfs list: переполненный thin pool может повредить диски VPS.Проверьте IP, префикс и шлюз в qm config, убедитесь, что используется тот мост, через который идёт ваш блок IP, и что IPSet фильтра IP содержит IP этого VPS. Если вышестоящая сеть привязывает IP к MAC-адресам, VPS в режиме моста нужна маршрутизируемая схема или виртуальные MAC; см. настройка сети Proxmox VE на хост-ноде.
В некоторых образах вход root по паролю через SSH отключён. Войдите по SSH-ключу или через консоль и при необходимости разрешите вход по паролю в /etc/ssh/sshd_config либо сразу внесите это изменение в шаблон.
Да, с шаблоном Windows, подготовленным через cloudbase-init или sysprep, но за лицензирование Windows отвечаете вы: для каждого VPS нужна действующая лицензия Windows.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP хост-сервера, версию Proxmox VE, ID виртуальной машины с выводом qm config ID и полный текст ошибки, чтобы мы быстрее нашли причину.