PVE via Cloudflare NAT-KVM 开小鸡 教程

PVE via Cloudflare NAT-KVM 开小鸡 教程

创建时间
May 16, 2025 08:29 AM
编辑日期
Last updated May 17, 2025
属性
标签
为了避免Virtualizor和Virtfusion每月的正版订阅费,直接采用PVE用户组方式分发小鸡。还有一种备用选择是ConvoyPanel。

1. PVE的安全连接

1.1 隧道建立

Cloudflare Zero Trust提供了免费的Tunnel功能,本章介绍使用CF提供的应用为PVE的管理接口提供安全访问。
假设已经完成了PVE安装,那么直接在CF找到Tunnel创建隧道,如图所示
notion image
选择
notion image
安装cloudflared,以x86为例
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb dpkg -i cloudflared-linux-amd64.deb
自定义隧道名称后,选择环境为Debian,按需选择系统类型,接着使用token方式安装
notion image
完成后PVE终端显示
notion image
并且Tunnels管理面板里对应隧道的状态变为“正常”即创建成功。接着配置主机名称,这是用于访问的URL,这会需要有个域名,按需先写,其中“无TLS验证”需要勾选,除非额外在PVE配置了证书。通常情况下服务器不主动向公网打开8006管理端口的情况下,使用tunnel建立的内网连接是安全的。
notion image

1.2 访问鉴权

首先分别创建两个策略
notion image
Allow规则使用Email接收一次性验证码验证登入,允许持有小鸡的用户使用邮箱访问,当然需要添加自己的
notion image
Deny规则是禁止所有访问
notion image
接着添加一个“自托管”应用程序,公共主机名与之前的保持一致,意味着该主机名是会受到规则保护。在策略部分,严格按顺序Allow先-Deny后摆放策略
notion image
登录方法保持默认,或自行添加额外的登录方法,在高级设置部分,CORS不需要处理。对于Cookie参考如下设置
notion image
可以勾选返回401响应。

1.3 域名安全规则

回到所用对应域名的管理页面,在“安全性”的“安全设置”中创建规则,图例是新仪表板,旧的也是类似操作。URL填入自己访问PVE的公共主机名
notion image
其它国家地区的意思是除了所列出的,禁止访问,操作正确的效果如下
notion image
否则满足条件就会进入填邮箱,收验证码的页面
notion image
更多安全设置可以自行查阅Cloudflare说明文档。至此基本的安全配置已经完成。

2. PVE设置

通过第一章的设置后,可以正常登入PVE的管理面板,无需额外操作就能使用经过CF隧道安全连接的VNC。
notion image

2.1 性能检查

首先运行cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 查看当前CPU调频模式是什么,接着 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 列出当前可用的模式。
如果不是performance,可以从列出可用的模式中进行修改,Intel和AMD以及不同内核版本所显示的可能不一致。自从6.3版本内核开始自带了AMD P-State EPP驱动,但PVE默认不开启。使用performance会带来不必要的功耗和发热,最重要的是它不省电。
以下内容基于AMD CPU操作,Intel仅作参考。首先使用 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver 确认是否有驱动amd-pstate-epp ,然后 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 如果只显示了performance powersave 那么就说明amd-pstate-epp是处于没启用的状态。
为此需要修改引导文件,将 amd_pstate=active 作为内核参数添加到引导程序中,nano /etc/default/grub 打开后找到GRUB_CMDLINE_LINUX_DEFAULT (引导过程中生效),PVE这里默认没有splash,正常使用的话可以不用添加。
notion image
然后改成GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_pstate=active amd_iommu=on" (active: 通过EPP提供性能偏好,由硬件自动管理;guided: 系统设置最大最小频率,硬件在范围内自动调整;passive: 系统直接控制频率)保存后运行update-grub 然后重启系统。再次检查 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 如果只有performance powersave 那就通过EPP自动调整性能。
在此之前先安装cpupower,apt install linux-cpupower 然后cpupower frequency-info 查看当前状态。当前显示使用performance。
notion image
可以用 echo "powersave" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 设置为省电模式(如果你需要的话)。watch -n 0.1 cpupower monitor 观察频率变化。
当Governor设置为powersave 时,EPP默认是性能模式,但可以将其调整为balance_performance ,这个设置选项是独立的。需要注意的是,Governor=performance 的时候是不能设置为balance_performance的,报错如“Device or resource busy”。根据内核说明此时将覆盖EPP的所有设置,状态选择逻辑只专注于性能。
# 查看EPP cat /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference # 修改EPP echo "balance_performance" | tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference # 修改Governor echo "powersave" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
可用s-tui图形化查看功率,在IO测试中功率最大,Governor=performance 时观察到低负载偶尔会睿频到5.0,而powersave 常见于1.2-3.2之间。性能差距不大的情况下可以直接选择powersave / balance_performance,最低待机功率在3瓦。
Governor / EPP
GB5(1/2)
SysBench
跑分功率
峰值睿频
低负载
powersave / performance
2019 / 3805
6040 / 12028
7/28/57
5.06
0.4
powersave / balance_performance
2030 / 3769
6052 / 12031
7/12/58
5.09
0.4
performance / performance
2025 / 3791
6036 / 12048
17/30/57
5.1
0.4

2.2 创建 Cloud-Init

分别以Debian和Ubuntu作为示例,首先安装工具apt install -y libguestfs-tools

2.2.1 Debian

cd /root wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
自定义镜像,其中--install是预装工具
virt-customize -a /root/debian-12-genericcloud-amd64.qcow2 \ --install qemu-guest-agent,curl,wget,nano,htop \ --run-command 'echo -n > /etc/machine-id'
创建虚拟机,稍后会制作成模板
notion image
不需要镜像
notion image
SCSI控制器按需选择,VirtIO SCSI虚拟性能相对较好
notion image
磁盘删掉,稍后用命令行导入
notion image
CPU按需配置,建议host性能更好
notion image
Ballooning动态分配内存,勾选
notion image
Multiqueue可让虚拟机使用多个虚拟CPU处理网络数据包,推荐是与虚拟CPU数量一致(默认)
notion image
然后点击完成,不要启动。接着通过命令行导入qcow2,Web面板暂时还不支持这种操作。
qm importdisk 8000 /root/debian-12-genericcloud-amd64.qcow2 local-lvm
找到该硬盘进行配置
notion image
点击完成后还是无法正常配置硬盘大小的,使用命令qm resize 8000 scsi0 30G 将硬盘调整到30G。现在开始添加Cloud-Init设备
notion image
完成后
notion image
设置引导顺序,CD不用可以删掉它
notion image
再添加一个串口,并将显示修改为图上所示Serial terminal (serial0)或者SPICE(VNC可选),这个步骤是必要的
notion image
接着Cloud-Init里的设置都可以不管,由用户自行输入
notion image
转换为模板
notion image
然后右键模板克隆,要选择完整克隆(Full Clone)
notion image
如此一来就是一台新小鸡
notion image
至此debian的Cloud-Init完整过程结束
notion image

2.2.2 Ubuntu

Ubuntu Cloud Images 最新链接,任选一个LTS版本,本文就使用最新的24.04.2 LTS作为示例。在页面中搜索noble-server-cloudimg-amd64.img,描述部分写明了qcow2 UEFI。
同样的方法下载到/rootwget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
与前面debian的方法一致virt-customize直接修改了镜像文件的内容,还有更灵活的方法但Web操作更不容易出错。
virt-customize -a /root/noble-server-cloudimg-amd64.img \ --install qemu-guest-agent,curl,wget,nano,htop \ --run-command 'echo -n > /etc/machine-id'
接着就是创建一个虚拟机,与前面的步骤完全一致。
# 导入硬盘 qm importdisk 8001 /root/noble-server-cloudimg-amd64.img local-lvm # 修改硬盘大小 qm resize 8001 scsi0 30G
类似的右键转换成模板就完成了
notion image
小鸡的效果如下
notion image
具体网络配置和防火墙根据实际情况调整。

2.3 防火墙设置

本小结介绍一种简单的方法实现禁止VMs相互访问。假如有以下网络结构:
路由器网关
防火墙网关
DHCP-VMs
192.168.123.1
192.168.123.100
192.168.123.20-192.168.123.30
其中防火墙网关可以使用pfSense或Opnsense,对网络流量进行高级处理。
首先确定PVE的基本结构,Datacenter-Node-VM。先在数据中心的防火墙设置选项中打开防火墙,然后配置IPSet,我添加了两台作为示例的虚拟机IP
notion image
这个操作将为后续对VM配置防火墙减少重复性的工作。接着设置安全群组
notion image
数据中心默认的输入策略是DROP,需要翻阅官方文档,可知除了与PVE服务必要的端口和已经建立连接的流量会被允许,其它的端口均为关闭。
notion image
当安全群组策略更新后,需要取消勾选启动,然后再应用,这样才会应用最新的规则。这里只推荐作用于VM,可以设置在模板里,新建的虚拟机都会包含该规则。禁止相互访问的效果如下,因为网关与DNS同为一个IP,所以对外访问是正常的。
notion image
类似的要实现NAT机,只需要手动为每个VM的防火墙添加额外的规则
notion image
每个规则对应一个协议,一般三个:tcp、udp、ipv6。另外宏提供了BT规则模板,可以用于最基础的禁止访问。
notion image
最后的参考配置如下,小鸡in/out方向均禁止BT访问,为了完整实现需要在网关高级处理。
notion image
具体配置以实际需求为主。

2.4 用户设置

首先到数据中心-权限-角色,创建自定义的角色,权限参考如图
notion image
VM.Audit显示虚拟机,VM.Config.Cloudinit允许用户自行修改登录信息,VM.Console控制台,VM.PowerMgmt管理服务器开关机暂停。只建议使用这个四个最低必要权限。然后在用户添加领域是PVE的用户
notion image
接着到虚拟机权限下手动添加用户和角色
notion image
然后就完成了。