痛点:我在星巴克,服务器在家里
上一篇文章我们用 Minisforum N5 Pro 搭建了完美的 P xVE + TrueNAS 底座。但问题随之而来:当我带着 MacBook 出门,坐在星巴克想查看家里正在跑的 ST-GNN 模型训练进度,或者想远程 SSH 修复一个 Bug 时,却发现连不上家里的局域网。
没有公网 IPv4?不想用慢吞吞的向日葵/TeamViewer? FRP 是目前最适合技术人员的解决方案:稳定、开源、配置灵活。
准备工作
- 一台有公网 IP 的 VPS:作为中转服务器(Server)。配置要求极低,阿里云/腾讯云最便宜的实例即可(带宽建议 5Mbps 以上)。
- 家里的 HomeLab:作为客户端(Client),即我们的 N5 Pro。
1. 服务端配置 (VPS)
注意:从 v0.52 版本开始,FRP 全面拥抱 TOML 格式,旧的 INI 配置已不推荐使用。
首先在 VPS 上下载对应架构的 FRP(通常是 linux_amd64),解压后我们只需要 frps 和 frps.toml。
编辑 frps.toml:
# frps.toml (服务端配置)
bindPort = 7000 # FRP 服务监听端口
vhostHTTPPort = 8080 # HTTP 穿透端口 (可选)
vhostHTTPSPort = 443 # HTTPS 穿透端口 (可选)
# 身份验证 (非常重要!)
auth.method = "token"
auth.token = "Yuansi_Lab_Secret_2026_Key" # 请换成复杂的密码
# 控制台 (可选,用于查看连接状态)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"
启动服务端(建议使用Systemd托管,这里演示临时启动):
./frps -c frps.toml
###2.客户端配置(HomeLab / N5 Pro)在家里的Ubuntu虚拟机或直接在PVE宿主机上配置客户端。我们需要frpc和
# frpc.toml (客户端配置)
serverAddr = "119.96.23.226"
serverPort = 7000
auth.method = "token"
auth.token = "" # 你的 Token
# ... 上面的 [common] 配置保持不变 ...
# 让云端把 80 端口的 HTTP 流量全交给本地 Nginx
[[proxies]]
name = "web_http"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["yuansima.com", "www.yuansima.com", "ai.yuansima.com", "lab.yuansima.com"]
# 让云端把 443 端口的 HTTPS 流量全交给本地 Nginx (为接下来的 Certbot 准备)
[[proxies]]
name = "web_https"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["yuansima.com", "www.yuansima.com", "ai.yuansima.com", "lab.yuansima.com"]
启动客户端:
bash
./frpc -c frpc.toml
3.进阶:Systemd自动启动
为了保证服务器重启后FRP自动拉起,我们需要编写systemd 服务文件。
以客户端为例,创建/etc/systemd/system/frpc.service:
```ini
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
[Install]
WantedBy=multi-user.target
然后启用并运行:
sudo systemctl enable frpc
sudo systemctl start frpc
安全警示 把内网端口暴露在公网是一把双刃剑。远思技术实验室 建议: 1.强密码:PVE和SSH的密码必须极其复杂。 2.防火墙:VPS上的安全组只开放必要的端口(如6000, 8006)。 3.Fail2Ban:在服务端部署Fail2Ban,防止暴力破解。 有了这条加密通道,无论身在何处,我的HomeLab就在指尖。 打开默认配置文件
sudo nano /etc/nginx/sites-available/default
配置内容如下:
# 1. 处理 www 的请求:自动 301 跳转到主域名
server {
server_name www.yuansima.com;
return 301 http://yuansima.com$request_uri;
}
# 2. 处理主域名请求,反向代理给内部的 Hugo
server {
server_name yuansima.com 192.168.31.56;
location / {
proxy_pass http://127.0.0.1:1313;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 这是专门给 Open WebUI 准备的独立大厅
server {
server_name ai.yuansima.com;
location / {
proxy_pass http://192.168.31.138:3000; # 直接转给 138 机器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# 这是专门给 Jupyter Lab 准备的独立大厅
server {
server_name lab.yuansima.com;
location / {
proxy_pass http://127.0.0.1:8888; # Jupyter 跑在本机 8888 端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# Jupyter 强依赖 WebSocket(比如运行终端和内核),这两行必须有
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 防止跑长时间代码时 Nginx 自动断开连接
proxy_read_timeout 86400;
}
}
重新加载配置
sudo nginx -s reload
安装证书申请程序
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
证书申请
sudo certbot --nginx