利用旧笔记本打造家用Homelab服务器

Build a Homelab server using an old laptop

家里有一台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组网的方法。

  1. 输入 ip a查看无线网卡设备名,我这里是 wlp3s0

  1. 安装 Wi-Fi 软件包
1
apt install -y wpasupplicant iw wireless-tools
  1. 配置要连接的WIFI并保存,可配置多个(/etc/wpa_supplicant/wpa_supplicant.conf
1
2
3
4
5
6
7
8
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
ssid="wifiname1"
psk="password1"
priority=5
}
  1. 配置nano /etc/network/interfaces,修改 Wi-Fi 网卡部分的配置,注意其中的设备名wlp3s0换成自己的
1
2
3
allow-hotplug wlp3s0
iface wlp3s0 inet dhcp
wpa_conf /etc/wpa_supplicant/wpa_supplicant.conf
  1. 启动,执行ifup wlp3s0,此时输入 ip a 查看 Wi-Fi 网卡因该已能正常联网。

  2. 开启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
2
3
4
5
6
root@homelab:/etc/sysctl.d# cat pve.conf 
net.ipv6.conf.all.forwarding=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.wlp3s0.rp_filter = 0
  1. 修改 /etc/network/interfaces 添加 vmbr0 的 NAT 规则
1
2
3
4
5
6
7
8
9
10
11
12
13
auto vmbr0
iface vmbr0 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o wlp3s0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o wlp3s0 -j MASQUERADE

post-up ip6tables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
post-down ip6tables -t nat -D POSTROUTING -o wlp3s0 -j MASQUERADE
iface vmbr0 inet6 auto
  1. 重启网络即可正常连接 Wi-Fi,并且通过局域网访问。
    1
    systemctl restart networking

参考文章:PVE 使用无线网卡连接 Wi-Fi 步骤

DHCP

前面虽然已经让PVE连接上了WIFI,但是此时虚拟还是无法获取网络, 因为前面的配置是把PVE的网络改为了NAT模式(一般家用WLAN网卡也不支持直接桥接),还需要在PVE中添加一个DHCP服务,让这个DHCP服务给虚拟机分配IP。

安装isc-dhcp-server:

1
apt install isc-dhcp-server

编辑/etc/dhcp/dhcpd.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 定义子网,必须与 vmbr0 的 IP 段一致
subnet 10.10.10.0 netmask 255.255.255.0 {
# 0. 核心设置:告诉所有客户端网关是谁 (指向 PVE 的 vmbr0)
option routers 10.10.10.1;
# 1. 分配给虚拟机的 IP 范围 (例如 100 到 200)
range 10.10.10.100 10.10.10.200;

# 2. 核心设置:告诉虚拟机网关是谁 (指向 PVE 的 vmbr0)
option routers 10.10.10.1;

# 3. DNS 服务器 (可以用 114.114.114.114 或 8.8.8.8)
option domain-name-servers 114.114.114.114, 8.8.8.8;

# 4. 租期设置 (单位:秒,这里设为 12 小时)
default-lease-time 43200;
max-lease-time 86400;

# 5. 设置固定IP
host fnos-server{
hardware ethernet BC:24:11:A7:EB:99;
fixed-address 10.10.10.100;
}
}

然后启动dhcp-server:

1
2
systemctl restart isc-dhcp-server
systemctl enable isc-dhcp-server

此时虚拟机应该可以正常分配IP并联网了。

我的完整的/etc/network/interface如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
auto lo
iface lo inet loopback

iface nic0 inet manual
post-up echo 1 > /proc/sys/net/ipv4/ip_forward

iface nic1 inet manual

auto wlp3s0
iface wlp3s0 inet dhcp
wpa_conf /etc/wpa_supplicant/wpa_supplicant.conf

auto vmbr0
iface vmbr0 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o wlp3s0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o wlp3s0 -j MASQUERADE

post-up ip6tables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
post-down ip6tables -t nat -D POSTROUTING -o wlp3s0 -j MASQUERADE
iface vmbr0 inet6 auto

source /etc/network/interfaces.d/*

NAT端口转发

因为前面我们连接WIFI时,使用NAT组网。那么PVE中的虚拟机和物理网络是隔离的,无法直接通过ip:port的方式访问虚拟机中的服务。

如果想要直接通过局域网访问,还需要进行iptables的端口转发配置。

为了方便扩展,可以在/etc/network/interface中添加一个post-up的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
auto vmbr0
iface vmbr0 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o wlp3s0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o wlp3s0 -j MASQUERADE

post-up ip6tables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
post-down ip6tables -t nat -D POSTROUTING -o wlp3s0 -j MASQUERADE

# === 加载端口转发脚本 ===
post-up /root/documents/iptables-nat.sh

iface vmbr0 inet6 auto

后续如果想要添加新的端口转发,就只需要修改这个文件就行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

# 定义变量
WIFI_IF="wlp3s0" # 你的WiFi网卡名
VM_NET="10.10.10.0/24"

# 清除旧的 NAT 规则 (防止重复)
iptables -t nat -F PREROUTING
# ---------------------------------------------------
# 在下面添加你的端口转发规则
# 格式: iptables -t nat -A PREROUTING -i $WIFI_IF -p tcp --dport [宿主机端口] -j DNAT --to [虚拟机IP]:[虚拟机端口]
# ---------------------------------------------------

# 示例1: SSH (宿主机 10022 -> VM 22)
# iptables -t nat -A PREROUTING -i $WIFI_IF -p tcp --dport 10022 -j DNAT --to 10.10.10.100:22
# 示例2: 远程桌面 RDP (宿主机 33890 -> VM 3389)
# iptables -t nat -A PREROUTING -i $WIFI_IF -p tcp --dport 33890 -j DNAT --to 10.10.10.101:3389

作用就是把虚拟机的端口,映射到宿主机的端口上。比如把虚拟机(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
2
3
4
5
6
7
# 查看网卡列表,找到WLAN的网卡,我的是wlp3s0
$ iw dev
# 查看当前网卡的省电模式
$ iw dev wlp3s0 get power_save
Power save: on
# 关闭省电模式
$ sudo iw dev wlp3s0 set power_save off

一键优化脚本

针对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
2
3
4
5
6
7
apt update && apt dist-upgrade
apt install xfce4 chromium lightdm
# adduser newusername
systemctl start lightdm

# 开机自动进入X环境
systemctl enable lightdm

这样每次开机后就能正常进入xfce了,也安装了chromium,可以通过localhost:8006来本机管理PVE。

关闭合盖休眠

笔记本默认盒盖休眠,需要设置为不休眠,不然一盒盖就用不了了。

编辑/etc/systemd/logind.conf,把下面三行改为ignore,并取消注释。

1
2
3
4
5
6
# 未充电状态
HandleLidSwitch=ignore
# 充电中
HandleLidSwitchExternalPower=ignore
# 连接扩展坞
HandleLidSwitchDocked=ignore

内置电池当作UPS

因为笔记本本身自带电池,所以当断电时,笔记本的内置电池就可以当作简易UPS使用。

注:我认为UPS最大的价值是,能保证异常断电后系统正常关机,不会因为断电丢失数据和硬件异常。

安装upower,设置动作:

1
vim /etc/UPower/UPower.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[UPower]
# 开启电源检测
EnableWattsUpPro=true
# 忽略盖子关闭事件(笔记本合盖不休眠)
IgnoreLid=true
# 使用百分比而非剩余时间
UsePercentageForPolicy=true

# 低电量警告 - 50%
PercentageLow=50
# 临界电量 - 40%
PercentageCritical=40
# 执行操作的电量 - 30%
PercentageAction=30
# 临界电量时的操作(关机)
CriticalPowerAction=PowerOff

然后开启upower的服务并设置为开机自启:

1
2
3
root@homelab:~# systemctl start upower
root@homelab:~# systemctl enable upower
Created symlink '/etc/systemd/system/graphical.target.wants/upower.service''/usr/lib/systemd/system/upower.service'.

这样,当笔记本断电,且电池容量低于30%时,就自动触发关机了,保证PVE和虚拟机环境都能够正常退出。

虚拟机安装

我在PVE上跑了两个系统:

  • Ubuntu
  • FnOS,飞牛最近出了正式版本,作为国产免费的NAS系统,社区还算比较活跃。

可以直接在PVE上输入URL下载镜像:

创建虚拟机时指定镜像即可,在每台虚拟机的控制台中可以看到画面和进行操作:

在NAT网络下,想要访问虚拟机内的服务,需要利用iptables进行端口转发,详见前文中NAT端口转发

硬盘直通

因为现在这台笔记本上有两块硬盘,一块256G SSD用来装系统、安装虚拟机,一块4T硬盘专门来存储数据,我把它直通给了FnOS。

可以通过ls /dev/disk/by-id查看当前的硬盘信息:

记录下想要直通的硬盘id,然后通过下面的命令直通给指定的虚拟机:

1
2
# qm set {VM_ID} -scsi2 /dev/disk/by-id/{DISK_ID}
qm set 100 -scsi2 /dev/disk/by-id/ata-HGST_HTSXXXXXXXXXX30_RCYYYYYYYYYYEM

然后在虚拟机的硬件中,就可以看到这块硬盘了:

内网穿透

在之前的文章中,曾详细地介绍了如何在VPS上部署一个内网穿透服务:使用 frp 进行内网穿透
同样地,跑在PVE上的虚拟机以及PVE本身,都可以用frpc来连接公网VPS进行内网穿透服务。

但是运行方式有些区别,近期我逐渐把依赖的软件服务都打包成docker镜像,然后用容器的方式在多台机器运行,这样可以统一执行环境,只需要维护好配置即可。

所以,我把frp打包成了一个docker镜像,方便在各种环境部署:frp-docker

可以用仓库中的docker_builder自己打包镜像,或者使用其中的prebuild版本(目前最新0.65.0),默认支持了amd64与arm64架构的,支持frpc/frps。

导入镜像后可以直接启动,只需要指定两个参数:

  • MODE:frpc或frps
  • ARCH:amd64或arm64

docker run启动:

1
2
3
4
5
6
7
8
9
# frpc
docker run -d \
--name frpc \
--network host \
--restart=always \
-e MODE=frpc \
-e ARCH=amd64 \
-v /home/root/frp/frpc.toml:/etc/frp/frpc.toml \
frp-linux:0.65.0
1
2
3
4
5
6
7
8
9
# frps
docker run -d \
--name frps \
--network host \
--restart=always \
-e MODE=frps \
-e ARCH=amd64 \
-v /home/root/frp/frps.toml:/etc/frp/frps.toml \
frp-linux:0.65.0

这样就能够非常简单地跑内网穿透了,只需要维护frpc/frps的配置文件即可。

新增了穿透端口,需要把容器重新启动一下。

Nginx反向代理

当我们把PVE虚拟中的服务端口通过frp转发到VPS上后,我们还可以通过Nginx绑定域名,实现把局域网服务暴露在公网用域名访问。

以Fnos为例,我在CF上创建了一个二级域名:fnos.xxx.com,解析上VPS的IP。

然后在VPS上可以添加一个nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# fnos.xxxxx.com.conf
server {
listen 80;
server_name fnos.xxxxx.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name fnos.xxxxx.com;

client_max_body_size 1024m;

ssl_certificate /etc/letsencrypt/live/$server_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$server_name/privkey.pem;

ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
# 飞牛服务转发到VPS的端口号
proxy_pass https://localhost:15667;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto https; # 明确设置为 https
proxy_set_header X-Forwarded-Port 443; # 设置端口
proxy_set_header X-Forwarded-Host $host;
}
}

然后停止nginx服务,申请证书:

1
2
apt-get install certbot
certbot certonly --standalone -d fnos.xxxxx.com

然后启动nginx服务即可。

注:申请ssl证书以及自动更新,详见文章部署一个自托管的 MEMOS 笔记系统#SSL证书

此时就能访问fnos.xxxxx.com域名,然后访问到部署在PVE虚拟机中的飞牛了。

注:如果访问域名出现502错误,可以查看nginx的日志。

1
>tail -f /var/log/nginx/error.log

如果是ssl的问题,需要检查/etc/letsencrypt/目录下的证书权限,确保nginx可以读取。

1
2
3
4
5
6
ls -ld /etc/letsencrypt/

sudo chmod o+x /etc/letsencrypt/live -R
sudo chmod 644 /etc/letsencrypt/live -R
sudo chmod o+x /etc/letsencrypt/archive -R
sudo chmod 644 /etc/letsencrypt/archive -R

然后重启nginx服务即可。

1
sudo nginx -s reload

通过域名访问飞牛,且HTTPS:

总结

文章中介绍的整套部署方案,是PVE + 虚拟机 + FRP内网穿透 + Nginx反向代理的流程,可以安全地把局域网服务暴露给公网域名访问。

在我部署的服务负载中,大多数情况下,CPU基本处于闲置状态,功耗也是很低的:

在拆机改造时顺便给笔记本清了清灰,目前看散热压力并不大,持续稳定运行了几天没发现异常,可以作为一个简易版家庭Homelab服务器了。

让旧机器焕发新生,废物再利用,是折腾的意义,但乐于折腾往往是稳定性的最大阻碍,所以及时收手,能用就行:)。

全文完,若有不足之处请评论指正。

微信扫描二维码,关注我的公众号。

本文标题:利用旧笔记本打造家用Homelab服务器
文章作者:查利鹏
发布时间:2025/12/03 10:39
本文字数:4.7k 字
原始链接:https://imzlp.com/posts/54672/
许可协议: CC BY-NC-SA 4.0
文章禁止全文转载,摘要转发请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!