适用场景:Hetzner、OVH 等只提供单公网 IP 的独立服务器,或家庭宽带下的 PVE 环境。
目标:通过 NAT 组网,让宿主机充当路由器,实现虚拟机内网隔离与公网访问。
1. 存储选型:ZFS 还是 LVM-Thin?
别纠结,根据硬件条件二选一。
| 方案 | 核心特点 | 建议 |
| ZFS | 数据不死。防静默腐败,快照极强(原子级),支持异地增量备份。 | 生产环境首选。但内存要在 16GB 以上(ZFS 吃内存做 ARC 缓存)。 |
| LVM-Thin | 简单高效。接近裸盘性能,配置极简,资源占用低。 | 家用/测试机首选。适合内存有限或不做关键数据存储的场景。 |
⚠️ 警告:千万别把
/boot分区装在 ZFS 上,GRUB 对 ZFS 的特性支持很差,升级极易挂。引导分区请老老实实由 PVE 安装程序自动处理(通常是 ext4)。
2. 镜像避坑:请认准 Generic
Debian 官方提供了几种 Cloud Image,名字很像,坑很大。
- Generic (
generic):PVE 生产环境唯一推荐。- 带标准物理硬件驱动,内核通用,兼容性最好。
- 注意:默认锁 root 密码,必须配合 Cloud-Init 注入公钥才能登录。
- GenericCloud (
genericcloud):为 AWS/OpenStack 优化的精简版,剔除了很多物理驱动。PVE 下直通硬件时可能会缺驱动,不建议作为首选。 - Nocloud (
nocloud):仅限本地测试。- 允许空密码 root 登录。严禁在公网环境使用,那是给黑客送肉鸡。
下载 debian-12-generic-amd64.qcow2 到 PVE 母机的 /tmp 目录。
3. 网络架构:NAT 模式配置 (核心)
单 IP 环境下,PVE 本身就是一个路由器。我们需要新建一个“内网交换机” (vmbr1)。
3.1 创建内网网桥 (GUI)
在 PVE 节点 -> 系统 -> 网络:
- 新建:Linux Bridge
- 名称:
vmbr1 - IPv4/CIDR:
10.0.0.1/24(这是虚拟机的网关 IP) - 网关/桥接端口:全部留空 (不要填!)
- 应用配置。
3.2 配置 NAT 转发 (CLI)
PVE 界面无法配置 NAT,必须进 Shell 操作。
第一步:开启路由转发
# 写入配置,重启不失效 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
第二步:配置 SNAT (让虚拟机能上网)
# 语法:iptables -t nat -A POSTROUTING -s '内网网段' -o 公网接口 -j MASQUERADE # 请将 vmbr0 替换为你实际有公网 IP 的网口 iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o vmbr0 -j MASQUERADE
第三步:配置端口映射 (让外网访问虚拟机)
比如把公网 80 转发给 10.0.0.101 的 80:
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.101:80 # 其他端口类似添加
第四步:规则持久化
iptables 重启会丢,必须安装持久化工具:
apt update && apt install iptables-persistent -y # 安装时选 Yes,或者手动保存: iptables-save > /etc/iptables/rules.v4
4. 虚拟机部署:Cloud-Init 标准流程
不要用 ISO 安装系统,那是上个世纪的做法。Cloud Image 是秒级部署。
- 创建空壳:Web 界面创建 VM,OS 选“不使用介质”,删除默认硬盘。
- 导入磁盘 (Shell):
# 101 是 VMID,local-lvm 是存储池名称 qm importdisk 101 /tmp/debian-12-generic-amd64.qcow2 local-lvm - 挂载与扩容 (Web 硬件页面):
- 双击
Unused Disk 0-> 添加。 - 关键动作:默认镜像只有 3G。选中磁盘 -> 磁盘操作 -> 调整大小 -> 输入
+37G。
- 双击
- 注入 Cloud-Init:
- 硬件 -> 添加 -> CloudInit Drive。
- 配置 用户 和 SSH 公钥 (必填,否则无法登录)。
- 网络:IP
10.0.0.101/24,网关10.0.0.1,桥接选vmbr1。 - 点击 Regenerate Image (重要!)。
- 启动:别忘了在“选项”里把新硬盘设为第一启动项。
5. 常见痛点 (FAQ)
Q: 既然我扩容了磁盘,为什么进系统看还是 2G?
A: PVE 只是拉大了物理磁盘 (Block Device),文件系统 (File System) 还是懵的。
登录虚拟机执行:
- 扩分区:
growpart /dev/sda 1(注意空格) - 扩文件系统:
resize2fs /dev/sda1(Ext4) 或xfs_growfs /(XFS)
Q: 开机后主机名是 localhost,也没有 IP?
A: Cloud-Init 炸了。通常是因为用了 Nocloud 镜像或者没点 “Regenerate Image”。
- 排查:确保虚拟机光驱里加载了 cloudinit 盘。
- 重置:
sudo cloud-init clean --logs && sudo reboot
Q: 我想跑 Docker/K8s,性能很差?
A: 检查 CPU 类型。
默认的 kvm64 兼容性好但性能差,且不支持嵌套虚拟化。
请将 CPU 类别 (Type) 改为 host,直接透传宿主机指令集。
Q: 虚拟机卡死,Stop 按钮无效?
A: 僵尸进程。
- Shell 查 PID:
ps aux | grep "/usr/bin/kvm -id 101" - 强杀:
kill -9 <PID> - 解锁:
qm unlock 101