家里有一台10年前的旧笔记本,闲置了几年。最近收拾出来改造了一下,真机部署了Proxmox环境,把它打造成一个简易家用Homelab服务器。
上面跑了Ubuntu和FnOS的虚拟机,搭配内网穿透可以作为一台长期在线的VPS使用,也可以部署NAS系统备份文件和图片。
本篇文章将介绍PVE + 虚拟机 + FRP内网穿透 + Nginx反向代理的整套部署方案,可以安全地把局域网服务暴露给公网域名访问。
前言
Proxmox Virtual Environment(PVE)是一个基于KVM的开源虚拟化平台,目前最新版本为9.1,基于Debian13打造,是一个社区比较活跃且免费的虚拟化平台。
之所以不选择直接真机安装对应的系统,是因为在底层搞一个虚拟化平台,能够比较方便地管理、切换与并行执行系统(当然取决于旧笔记本的性能,也不可能并行跑太多)。如果把虚拟机系统搞崩了,在PVE中直接删掉重建或恢复快照就行了,非常方便。也能让我非常随心所欲地测试哪个NAS系统好用。
而且开启硬件对虚拟化的支持,也没有太多的性能损耗(KVM虚拟化CPU损耗通常在2-5%左右),并且可以配置硬件直通虚拟机进一步降低损耗。
硬件改造
我的这台笔记本是ASUS P453UJ,CPU是i7 6500U、8G DDR4内存,500G HHD。扩展性方面,只有一个SATA接口,被HDD占用,还有光驱。没法直接插两块硬盘。
虽然只有8G内存,但是现在内存行情非常夸张,我也不打算给它扩容内存了,我要跑的服务8G内存也够用了,除此之外给PVE还另外加了8G Swap空间。
光驱改硬盘位
现在已经是2025年了,原来在HDD上装的是Win10,从开机到能操作要几分钟,卡的怀疑人生。所以第一步肯定要换一块SSD。光驱也没用了,也可以把光驱位拆掉,买一个硬盘托架转接2.5寸SATA,也就几块钱到十几块钱不等。

另外,我刚好有一块M2 NGFF的256G固态,刚好可以用来装系统,但是因为笔记本没这个接口不能直接装,还需要买一个M2 NGFF转2.5寸SATA的硬盘盒。
然后把它插到光驱位上。原来的SATA口,可以用来单独放一块硬盘。
网卡升级
这台笔记本的内置网卡是高通QCNFA435,是一个中低端的网卡配置,只支持Wifi5,且1x1 MIMO,最大传输速度只能支持433Mbps。
这个规格现在根本跑不满带宽,老牛拉破车了属于是。
所以,给他升级了Intel AX200或210网卡,可以支持Wifi6,2X2 MIMO,最大速度可达2.4Gbps,性能远超QCNFA435,目前价格40-60之间。
安装PVE
注意:安装PVE之前,请确认你的CPU支持虚拟化,并且需要在BIOS中开启虚拟化。
Intel:Advanced-CPU Configuration-Intel Virtualization Technology改成Enable。
然后如PVE官方下载镜像:Downloads
找个U盘,刻录进去即可。建议使用Ventory,既能够当作普通优盘使用,也能把ISO放进去,选择加载,这样就不用每个镜像都重新刻录一遍了,类似的技术在早些年用过Fbinstool,Ventory就更方便了。
另外,安装PVE时最好机器插着网线,默认是桥接网络,这样默认安装完就能通过局域网进行连接。
安装成功后screenfetch一下:

默认PVE安装完是不带X环境的,只能在局域网内设备用浏览器通过IP访问,默认端口为8006。

PVE优化/配置
连接Wifi网络
笔记本因为自带WLAN网卡,而我又不希望机器拖着根网线,我希望它能连接WIFI,这样只需要解决供电,就可以随便丢到哪个角落里去就行了。
网络配置
下面介绍一下PVE连接WIFI,并让虚拟机使用NAT组网的方法。
- 输入
ip a查看无线网卡设备名,我这里是wlp3s0。

- 安装 Wi-Fi 软件包
1 | apt install -y wpasupplicant iw wireless-tools |
- 配置要连接的WIFI并保存,可配置多个(
/etc/wpa_supplicant/wpa_supplicant.conf)
1 | ctrl_interface=/run/wpa_supplicant |
- 配置
nano /etc/network/interfaces,修改 Wi-Fi 网卡部分的配置,注意其中的设备名wlp3s0换成自己的
1 | allow-hotplug wlp3s0 |
启动,执行
ifup wlp3s0,此时输入ip a查看 Wi-Fi 网卡因该已能正常联网。开启IP转发功能,编辑
/etc/sysctl.conf
- 将
#net.ipv6.conf.all.forwarding=1前的#去掉并保存 - 将
#net.ipv4.ip_forward=1前的#去掉并保存
注:在最新版本PVE上(9.1),没有
/etc/sysctl.conf这个文件了,需要在/etc/sysctl.d目录下新建一个conf文件。
1 | root@homelab:/etc/sysctl.d# cat pve.conf |
- 修改
/etc/network/interfaces添加vmbr0的 NAT 规则
1 | auto vmbr0 |
- 重启网络即可正常连接 Wi-Fi,并且通过局域网访问。
1
systemctl restart networking
DHCP
前面虽然已经让PVE连接上了WIFI,但是此时虚拟还是无法获取网络, 因为前面的配置是把PVE的网络改为了NAT模式(一般家用WLAN网卡也不支持直接桥接),还需要在PVE中添加一个DHCP服务,让这个DHCP服务给虚拟机分配IP。
安装isc-dhcp-server:
1 | apt install isc-dhcp-server |
编辑/etc/dhcp/dhcpd.conf:
1 | # 定义子网,必须与 vmbr0 的 IP 段一致 |
然后启动dhcp-server:
1 | systemctl restart isc-dhcp-server |
此时虚拟机应该可以正常分配IP并联网了。
我的完整的/etc/network/interface如下:
1 | auto lo |
NAT端口转发
因为前面我们连接WIFI时,使用NAT组网。那么PVE中的虚拟机和物理网络是隔离的,无法直接通过ip:port的方式访问虚拟机中的服务。
如果想要直接通过局域网访问,还需要进行iptables的端口转发配置。
为了方便扩展,可以在/etc/network/interface中添加一个post-up的脚本:
1 | auto vmbr0 |
后续如果想要添加新的端口转发,就只需要修改这个文件就行了:
1 |
|
作用就是把虚拟机的端口,映射到宿主机的端口上。比如把虚拟机(10.10.10.100:22)映射到宿主机的10022端口:
1 | iptables -t nat -A PREROUTING -i $WIFI_IF -p tcp --dport 10022 -j DNAT --to 10.10.10.100:22 |
执行脚本,就能生效,因为前面我们修改了/etc/network/interface,所以每次networking服务启动时都会执行到,这样重启也不用担心不生效了。
访问的方式:假如宿主机在物理路由的IP为192.168.1.123,那么就可以访问192.168.1.123:10022访问虚拟机(10.10.10.100:22)了。
Wifi全功率运行
默认情况下,WLAN网卡是标准省电模,会定期进入休眠状态,只在需要发送或接收数据包时唤醒。但我们作为长期持续联网的设备来说,我希望机器能保持最高的网络稳定性和性能。
所以可以把网卡改为默认全功率运行:
1 | # 查看网卡列表,找到WLAN的网卡,我的是wlp3s0 |
一键优化脚本
针对PVE有一些一键优化脚本,可以直接配置直通+CPU/硬盘/温度显示+换源/去订阅+CPU睿频模式。
还是非常方便的,推荐pve-diy。
1 | bash -c "$(curl -fsSL https://raw.githubusercontent.com/xiangfeidexiaohuo/pve-diy/master/pve.sh)" |
可以按需进行选择配置。
安装X环境
因为PVE安装时没有X环境,所以只能进入终端,但是PVE本身又依赖web配置,在无网络或者无另一台机器的情况下就非常不方便。
但是PVE是基于Debian的,我们自然可以给他装上X环境,而官方也提供了安装的方法,可以安装xfce:Developer_Workstations_with_Proxmox_VE_and_X11
简单来说就下面几行命令:
1 | apt update && apt dist-upgrade |
这样每次开机后就能正常进入xfce了,也安装了chromium,可以通过localhost:8006来本机管理PVE。
关闭合盖休眠
笔记本默认盒盖休眠,需要设置为不休眠,不然一盒盖就用不了了。
编辑/etc/systemd/logind.conf,把下面三行改为ignore,并取消注释。
1 | # 未充电状态 |
内置电池当作UPS
因为笔记本本身自带电池,所以当断电时,笔记本的内置电池就可以当作简易UPS使用。
注:我认为UPS最大的价值是,能保证异常断电后系统正常关机,不会因为断电丢失数据和硬件异常。
安装upower,设置动作:
1 | vim /etc/UPower/UPower.conf |
1 | [UPower] |
然后开启upower的服务并设置为开机自启:
1 | root@homelab:~# systemctl start upower |
这样,当笔记本断电,且电池容量低于30%时,就自动触发关机了,保证PVE和虚拟机环境都能够正常退出。
虚拟机安装
我在PVE上跑了两个系统:
- Ubuntu
- FnOS,飞牛最近出了正式版本,作为国产免费的NAS系统,社区还算比较活跃。
可以直接在PVE上输入URL下载镜像:
创建虚拟机时指定镜像即可,在每台虚拟机的控制台中可以看到画面和进行操作:
在NAT网络下,想要访问虚拟机内的服务,需要利用iptables进行端口转发,详见前文中NAT端口转发。
硬盘直通
因为现在这台笔记本上有两块硬盘,一块256G SSD用来装系统、安装虚拟机,一块4T硬盘专门来存储数据,我把它直通给了FnOS。
可以通过ls /dev/disk/by-id查看当前的硬盘信息:
记录下想要直通的硬盘id,然后通过下面的命令直通给指定的虚拟机:
1 | # qm set {VM_ID} -scsi2 /dev/disk/by-id/{DISK_ID} |
然后在虚拟机的硬件中,就可以看到这块硬盘了:
内网穿透
在之前的文章中,曾详细地介绍了如何在VPS上部署一个内网穿透服务:使用 frp 进行内网穿透
同样地,跑在PVE上的虚拟机以及PVE本身,都可以用frpc来连接公网VPS进行内网穿透服务。
但是运行方式有些区别,近期我逐渐把依赖的软件服务都打包成docker镜像,然后用容器的方式在多台机器运行,这样可以统一执行环境,只需要维护好配置即可。
所以,我把frp打包成了一个docker镜像,方便在各种环境部署:frp-docker
可以用仓库中的docker_builder自己打包镜像,或者使用其中的prebuild版本(目前最新0.65.0),默认支持了amd64与arm64架构的,支持frpc/frps。
导入镜像后可以直接启动,只需要指定两个参数:
MODE:frpc或frpsARCH:amd64或arm64
docker run启动:
1 | # frpc |
1 | # frps |
这样就能够非常简单地跑内网穿透了,只需要维护frpc/frps的配置文件即可。
新增了穿透端口,需要把容器重新启动一下。
Nginx反向代理
当我们把PVE虚拟中的服务端口通过frp转发到VPS上后,我们还可以通过Nginx绑定域名,实现把局域网服务暴露在公网用域名访问。
以Fnos为例,我在CF上创建了一个二级域名:fnos.xxx.com,解析上VPS的IP。
然后在VPS上可以添加一个nginx配置:
1 | # fnos.xxxxx.com.conf |
然后停止nginx服务,申请证书:
1 | apt-get install certbot |
然后启动nginx服务即可。
注:申请ssl证书以及自动更新,详见文章部署一个自托管的 MEMOS 笔记系统#SSL证书。
此时就能访问fnos.xxxxx.com域名,然后访问到部署在PVE虚拟机中的飞牛了。
注:如果访问域名出现502错误,可以查看nginx的日志。
1 >tail -f /var/log/nginx/error.log
如果是ssl的问题,需要检查/etc/letsencrypt/目录下的证书权限,确保nginx可以读取。
1 | ls -ld /etc/letsencrypt/ |
然后重启nginx服务即可。
1 | sudo nginx -s reload |
通过域名访问飞牛,且HTTPS:
总结
文章中介绍的整套部署方案,是PVE + 虚拟机 + FRP内网穿透 + Nginx反向代理的流程,可以安全地把局域网服务暴露给公网域名访问。
在我部署的服务负载中,大多数情况下,CPU基本处于闲置状态,功耗也是很低的:

在拆机改造时顺便给笔记本清了清灰,目前看散热压力并不大,持续稳定运行了几天没发现异常,可以作为一个简易版家庭Homelab服务器了。
让旧机器焕发新生,废物再利用,是折腾的意义,但乐于折腾往往是稳定性的最大阻碍,所以及时收手,能用就行:)。