ホストノードに Proxmox VE をインストールしたら、次は販売できる VPS に仕上げる作業です。多数の VM をすばやく作成し、それぞれに専用の IP とパスワードを割り当て、プランの制限を適用し、顧客が他人の IP を乗っ取れないようにする必要があります。この記事ではその運用面として、cloud-init テンプレートからの VPS のクローン、IP・パスワード・SSH キーの自動設定、CPU・ディスク I/O・帯域の制限、Proxmox ファイアウォールによる IP 盗用の防止、顧客専用のコンソールログイン、VPS を一括作成するスクリプトを解説します。
フルクローンはテンプレートから独立しているため、後からテンプレートを削除・更新しても影響しません。リンククローンは高速で容量も小さく済みますが、すべてのクローンがテンプレートのディスクに依存します。
# 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 を使う場合は --ipconfig0 に ip6=2001:db8:100::11/64,gw6=2001:db8:100::1 を追加します。
# 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 は NIC の定義全体を置き換える点に注意してください。qm config から MAC アドレス(virtio=BC:24:11:...)をコピーして同じ値を維持しないと、VPS に新しい MAC が割り当てられ、上流が IP と MAC を紐付けている場合はネットワークが切断されることがあります。ディスクの制限を設定しておけば、高負荷な VPS が 1 台あるだけで同じディスク上の他の VPS がすべて遅くなる事態を防げます。
フィルタリングがなければ、root 権限を持つ顧客はブロック内の空き IP を自由に設定して乗っ取ることができます。Proxmox ファイアウォールの IP フィルターは、送信元アドレスが許可リストにない VPS からのパケットを破棄します。先にデータセンターレベルでファイアウォールを有効にする必要があります。その際、ホストから自分を締め出さないよう、受信ポリシーは 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
NIC には firewall=1 が必要です(ステップ2で設定済み)。macfilter(既定で有効)は、VPS が MAC アドレスを変更するのを防ぎます。VPS 内からテストしてください。割り当てられていない 2 つ目の IP を追加し、その IP から外部へ ping を送ると、失敗するはずです。
VPS のネットワークを壊してしまった顧客が自分で修復するには、コンソールが必要です。自分の VPS だけを表示・操作できる Proxmox ユーザーを作成します。
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 にレルム「Proxmox VE authentication server」でログインし、VPS 101 だけを確認できます。コンソール、電源操作、その VPS のグラフが利用可能です。課金まで完全に自動化したショップを運営するなら、次のステップは Virtualizor や、Proxmox モジュールを組み合わせた WHMCS などのパネルです。
以下のスクリプトは VPS ごとに 1 行(ID、IP、メモリ容量(MB)、コア数、ディスク)を読み込み、上記の設定でテンプレートから VPS を作成します。パスワードはランダムに生成し、引き渡しまで安全な場所に保管してください。
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 で実際の使用量を監視してください。シンプールが満杯になると VPS のディスクが破損するおそれがあります。qm config で IP、プレフィックス、ゲートウェイを確認し、使用しているブリッジが IP ブロックを収容しているものか、IP フィルターの IPSet にその VPS の IP が含まれているかを確認してください。上流が IP と MAC アドレスを紐付けている場合、ブリッジ接続の VPS にはルーティング構成か仮想 MAC が必要です。ホストノード向け Proxmox VE ネットワーク設定を参照してください。
イメージによっては、SSH での root パスワードログインが無効になっています。SSH キーまたはコンソールでログインし、必要であれば /etc/ssh/sshd_config でパスワードログインを許可するか、その変更をテンプレートに組み込んでください。
はい。cloudbase-init または sysprep で準備した Windows テンプレートを使えば可能ですが、Windows のライセンスはお客様の責任となります。VPS ごとに有効な Windows ライセンスが必要です。
上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。ホストサーバーの IP、Proxmox VE のバージョン、VM ID と qm config ID の出力、エラー全文を添えていただくと、より迅速に調査できます。