打破内网藩篱:用 FRP 构建 HomeLab 的全天候访问通道

没有公网 IP 也能远程管理 PVE?基于 TOML 新格式的 FRP 高性能穿透实战指南。

痛点:我在星巴克,服务器在家里

上一篇文章我们用 Minisforum N5 Pro 搭建了完美的 P xVE + TrueNAS 底座。但问题随之而来:当我带着 MacBook 出门,坐在星巴克想查看家里正在跑的 ST-GNN 模型训练进度,或者想远程 SSH 修复一个 Bug 时,却发现连不上家里的局域网。

没有公网 IPv4?不想用慢吞吞的向日葵/TeamViewer? FRP 是目前最适合技术人员的解决方案:稳定、开源、配置灵活。

准备工作

  1. 一台有公网 IP 的 VPS:作为中转服务器(Server)。配置要求极低,阿里云/腾讯云最便宜的实例即可(带宽建议 5Mbps 以上)。
  2. 家里的 HomeLab:作为客户端(Client),即我们的 N5 Pro。

1. 服务端配置 (VPS)

注意:从 v0.52 版本开始,FRP 全面拥抱 TOML 格式,旧的 INI 配置已不推荐使用。

首先在 VPS 上下载对应架构的 FRP(通常是 linux_amd64),解压后我们只需要 frpsfrps.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