在母鸡上装好 Proxmox VE 之后,真正的工作是把它变成可以售卖的 VPS:快速开出大量小鸡,给每台分配独立的 IP 和密码,按套餐限制资源,并确保任何客户都无法占用别人的 IP。本文讲的就是这部分运营实操:从 Cloud-Init 模板克隆 VPS,自动设置 IP、密码和 SSH 密钥,限制 CPU、磁盘 IO 和带宽,用 Proxmox 防火墙防止 IP 盗用,为客户开通独立的控制台登录,以及用脚本批量开小鸡。
完整克隆(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 会替换整个网卡定义:请从 qm config 中复制原有的 MAC 地址(virtio=BC:24:11:...)一并写上,否则 VPS 会获得新的 MAC,如果上游机房把 IP 与 MAC 绑定,小鸡就可能断网。磁盘 IO 限制可以防止某一台高负载的小鸡拖慢同一块磁盘上的所有其他 VPS。
如果不做过滤,拥有 root 权限的客户可以在系统里随意配置 IP 段中任何空闲的 IP 并占为己用。Proxmox 防火墙的 IP 过滤(IP filter)会丢弃源地址不在允许列表中的数据包。必须先在数据中心(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,并用这个 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 登录,领域(Realm)选择 “Proxmox VE authentication server”,登录后只能看到 VPS 101,可以使用控制台、开关机,并查看自己的监控图表。如果要做带计费的全自动销售,下一步可以使用 Virtualizor 这类面板,或者 WHMCS 搭配 Proxmox 模块。
下面的脚本按行读取 VPS 列表(每行包括 ID、IP、内存 MB 数、核心数、磁盘大小),并按上述设置从模板批量创建。密码随机生成,请妥善保存,以便交付给客户。
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 一旦写满,可能导致小鸡磁盘数据损坏。检查 qm config 中的 IP、前缀和网关是否正确,所用网桥是否就是承载该 IP 段的网桥,以及 IP 过滤的 IPSet 中是否包含该 VPS 的 IP。如果上游把 IP 与 MAC 地址绑定,桥接的小鸡需要改用路由模式或虚拟 MAC,参见 Proxmox VE 母鸡网络配置。
部分系统镜像默认禁止 root 通过 SSH 密码登录。请用 SSH 密钥或控制台登录,如有需要可在 /etc/ssh/sshd_config 中允许密码登录,或者直接在模板里改好这一项。
可以,需要准备好用 cloudbase-init 或 sysprep 处理过的 Windows 模板。但 Windows 授权由你自行负责:每台 VPS 都必须有合法的 Windows 许可证。
如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上母鸡服务器 IP、Proxmox VE 版本、虚拟机 ID 及 qm config ID 的输出,以及完整报错信息,方便工程师快速定位。