编辑
2025-11-16
环境部署
00

目录

从零到上线:用 frp + Nginx Proxy Manager 将家中 Windows 笔记本的 Docker 服务安全暴露到公网(v0.65.0,TOML 版)
一、架构与原理
二、版本与目录约定(重要)
三、云服务器部署 frps(服务端)
四、Windows 笔记本部署 frpc(客户端,以“服务”运行)
五、用 Nginx Proxy Manager 配置域名反代(可选但强烈推荐)
六、验证与排错清单
七、完整配置清单(可直接套用)
八、安全加固与最佳实践
后续建议
总结表格

从零到上线:用 frp + Nginx Proxy Manager 将家中 Windows 笔记本的 Docker 服务安全暴露到公网(v0.65.0,TOML 版)

面向场景:你在家里的 Windows 笔记本(Surface Laptop 2)上运行若干 Docker 服务(例如端口 3210、5432、8181),家中宽带在 大内网/NAT 后,没有公网 IP;你已有一台有公网 IP 的 云服务器,并已部署 Nginx Proxy Manager(NPM)。目标是通过 frp 建立安全隧道,让手机在 5G 外网也能访问这些服务。

NAT:网络地址转换,将大量私网地址通过少量公网地址上网,导致内网设备无法被公网主动访问。


一、架构与原理

  • 家里笔记本安装并以“服务”方式运行 frpc(客户端),主动连接云服务器的 frps(服务端),形成一条加密的 隧道
  • 外部请求访问云服务器(IP 或域名),由 Nginx Proxy Manager 反代到 frps 暴露的端口,再回源到家中笔记本对应的本地端口。
  • 该方案绕过运营商 NAT 限制,稳定且安全。
text
手机/外网 → 域名(Nginx Proxy Manager, 云) → 127.0.0.1:远程端口(frps) ↓ frp 隧道 家中 Windows: 本地端口 (Docker 服务)

隧道:指通过中间节点转发建立的端到端连接通道,常用于穿透 内网防火墙


二、版本与目录约定(重要)

  • frp 版本:v0.65.0(从该版本开始官方主推配置文件为 TOML,不再使用 INI)。
  • 云服务器(Linux)frp 安装目录:/root/frp/frp_0.65.0_linux_amd64
  • 本地 Windows 目录示例:D:\frp_0.65.0_windows_amd64
  • Windows 端以“系统服务”方式运行 frpc,避免关闭窗口导致进程退出。

TOML:一种人类友好的配置文件格式,键值以 key = "value" 表示,层级清晰、类型明确。


三、云服务器部署 frps(服务端)

以下以 Debian/Ubuntu 为例,其他发行版同理。

1)下载与解压(保持与本文版本一致)

bash
sudo mkdir -p /root/frp && cd /root/frp sudo wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz sudo tar -xzvf frp_0.65.0_linux_amd64.tar.gz cd /root/frp/frp_0.65.0_linux_amd64

2)编写 frps.toml(开启认证与仪表盘,建议开启传输层 TLS)

toml
# /root/frp/frp_0.65.0_linux_amd64/frps.toml bindPort = 7777 # 仪表盘(可选) webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "StrongPass123" # 修改为强密码 # 认证 auth.method = "token" auth.token = "My_Frps_Secret_Token_2025" # 修改为强随机串 # 传输层 TLS(提升链路安全) transport.tls.enable = true

token:frpc 与 frps 之间的共享密钥,用于简单身份校验;请使用足够复杂的随机字符串。

3)先前台测试启动

bash
./frps -c /root/frp/frp_0.65.0_linux_amd64/frps.toml # 看到 started successfully 即可,Ctrl + C 停止,改为服务运行

4)注册为 systemd 服务(开机自启)

bash
sudo tee /etc/systemd/system/frps.service >/dev/null <<'EOF' [Unit] Description=FRP Server (frps) After=network.target [Service] Type=simple User=root WorkingDirectory=/root/frp/frp_0.65.0_linux_amd64 ExecStart=/root/frp/frp_0.65.0_linux_amd64/frps -c /root/frp/frp_0.65.0_linux_amd64/frps.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now frps sudo systemctl status frps

systemd:Linux 的系统与服务管理器,支持自启、崩溃重启与统一日志。

5)放通安全组与防火墙

  • 云厂商安全组放行 TCP: 7777(frpc 连接)、7500(仪表盘,可限制来源 IP)、以及你要对外暴露的远程端口(例如 13210、15432、18181)。
  • 本机防火墙(以 UFW 为例):
bash
sudo ufw allow 7777/tcp sudo ufw allow 7500/tcp sudo ufw allow 13210/tcp sudo ufw allow 15432/tcp sudo ufw allow 18181/tcp sudo ufw status

安全组:云厂商提供的实例级访问控制列表(ACL),常用于开放外网端口。

6)验证


四、Windows 笔记本部署 frpc(客户端,以“服务”运行)

1)准备文件

  • 下载 frp v0.65.0 Windows amd64 压缩包并解压到:D:\frp_0.65.0_windows_amd64
  • 目录应包含:frpc.exe、frpc.toml、frps.exe、frps.toml、LICENSE(无 .ini 为正常现象)。

amd64:x86-64 指令集,适配 Intel/AMD 64 位 CPU;与 ARM64 版本不同。

2)编写 frpc.toml(一次性暴露多个服务:3210、5432、8181)
注意:你的 NPM 管理界面映射是 8181:81,因此本机应连接 8181;若要暴露 NPM 的 80/443,则对应本机映射 8800、4443。

toml
# D:\frp_0.65.0_windows_amd64\frpc.toml serverAddr = "云服务器IP" serverPort = 7777 auth.method = "token" auth.token = "My_Frps_Secret_Token_2025" transport.tls.enable = true # 服务1:本地 3210 → 云端 13210 [[proxies]] name = "lobe_chat_db" type = "tcp" localIP = "127.0.0.1" localPort = 3210 remotePort = 13210 # 服务2:本地 5432(PostgreSQL) → 云端 15432 [[proxies]] name = "my_postgres" type = "tcp" localIP = "127.0.0.1" localPort = 5432 remotePort = 15432 # 服务3:NPM 管理界面 本地 8181 → 云端 18181 [[proxies]] name = "npm_web" type = "tcp" localIP = "127.0.0.1" localPort = 8181 remotePort = 18181

[[proxies]]:TOML 的数组表(重复块)语法,代表声明多个 代理条目

3)将 frpc 安装为 Windows 服务(推荐 NSSM)

  • 下载 NSSM(Non-Sucking Service Manager):https://nssm.cc/download
  • 假设 nssm.exe 在 D:\nssm-2.24\win64\nssm.exe
bat
D:\nssm-2.24\win64\nssm.exe install frpc

在弹出的窗口中填写:

  • Application path: D:\frp_0.65.0_windows_amd64\frpc.exe
  • Startup directory: D:\frp_0.65.0_windows_amd64
  • Arguments: -c D:\frp_0.65.0_windows_amd64\frpc.toml
  • (可选) I/O、Log 文件重定向到 D:\frp_0.65.0_windows_amd64\logs\frpc.log

保存后启动服务:

权限不足可以用powershell管理员模式执行命令

windows + x

在弹出的菜单中,选择“Windows PowerShell (管理员)”或“终端 (管理员)”

bat
D:\nssm-2.24\win64\nssm.exe start frpc

常用命令:

bat
nssm stop frpc nssm edit frpc nssm remove frpc confirm

NSSM:将任意可执行程序包装成 Windows 服务的工具,支持崩溃重启、日志重定向。

4)容器与本地端口自检

  • 确保相应 Docker 容器 Running,本机端口在监听:
powershell
# Windows PowerShell Test-NetConnection -ComputerName 127.0.0.1 -Port 3210 Test-NetConnection -ComputerName 127.0.0.1 -Port 5432 Test-NetConnection -ComputerName 127.0.0.1 -Port 8181
  • 若容器 Exited(137) 等,先用 docker logs <容器名> 排查,确保服务可用。

Exited(137):多见于内存不足或被系统/管理器终止,排查容器资源与参数。


五、用 Nginx Proxy Manager 配置域名反代(可选但强烈推荐)

1)DNS 解析

  • 在你的 DNS 提供商处为域名添加 A 记录指向云服务器 IP:
    • lobe.example.com → 云IP
    • npm.example.com → 云IP

2)NPM 新建 Proxy Host

  • lobe.example.com → Forward Hostname/IP: 127.0.0.1, Port: 13210
  • npm.example.com → 127.0.0.1:18181(如需暴露 NPM 管理界面)
  • 勾选 Enable SSL → Request a new SSL certificate(Let’s Encrypt),强制 HTTPS,开启 HTTP/2

反向代理:由网关服务器代表客户端向后端发起请求,实现统一入口、证书管理与安全策略。


六、验证与排错清单

  • frpc 连接超时(i/o timeout)

    • 云端 frps 是否运行:systemctl status frps
    • 安全组与防火墙是否放行 7777
    • 本地连通性:Test-NetConnection 云IP -Port 7777
  • 隧道已建立但访问失败

    • 错误 “connect to local service refused”:本地端口无进程监听或容器未启动
    • docker ps -adocker logs 核对端口映射与状态
  • 证书申请失败

    • 确认域名已解析到云服务器 IP,80/443 未被其他程序占用
    • NPM 日志中查明原因
  • 性能与安全

    • 开启 transport.tls.enable = true 提升链路安全
    • token 使用高强度随机串;NPM 后端如为管理界面,建议启用 HTTP Basic Auth 或限制来源 IP

HTTP Basic Auth:最基础的 HTTP 认证方式,可在网关上添加用户名/密码保护后台。


七、完整配置清单(可直接套用)

1)云服务器 /root/frp/frp_0.65.0_linux_amd64/frps.toml

toml
bindPort = 7777 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "StrongPass123" auth.method = "token" auth.token = "My_Frps_Secret_Token_2025" transport.tls.enable = true

2)云服务器 systemd 服务文件 /etc/systemd/system/frps.service

ini
[Unit] Description=FRP Server (frps) After=network.target [Service] Type=simple User=root WorkingDirectory=/root/frp/frp_0.65.0_linux_amd64 ExecStart=/root/frp/frp_0.65.0_linux_amd64/frps -c /root/frp/frp_0.65.0_linux_amd64/frps.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

3)Windows D:\frp_0.65.0_windows_amd64\frpc.toml(含三个服务)

toml
serverAddr = "云服务器IP" serverPort = 7777 auth.method = "token" auth.token = "My_Frps_Secret_Token_2025" transport.tls.enable = true [[proxies]] name = "lobe_chat_db" type = "tcp" localIP = "127.0.0.1" localPort = 3210 remotePort = 13210 [[proxies]] name = "my_postgres" type = "tcp" localIP = "127.0.0.1" localPort = 5432 remotePort = 15432 [[proxies]] name = "npm_web" type = "tcp" localIP = "127.0.0.1" localPort = 8181 remotePort = 18181

4)NSSM 安装 frpc 为服务

  • Application: D:\frp_0.65.0_windows_amd64\frpc.exe
  • Arguments: -c D:\frp_0.65.0_windows_amd64\frpc.toml
  • Logs:指向 D:\frp_0.65.0_windows_amd64\logs\

八、安全加固与最佳实践

  • frps/frpc 都启用 TLStransport.tls.enable = true);
  • token 使用高强度随机串,定期更换;
  • 云端仅开放必要端口;NPM 后台尽量做 来源 IP 限制二次认证
  • Docker 服务设置 restart: unless-stopped,避免重启后不自起;
  • Dashboard 观察隧道状态,异常时优先看 frpc 日志与本地端口监听。

Dashboard:frps 自带的状态面板,可直观看到在线客户端与代理列表。


后续建议

  1. 若需将更多端口(如 8800/4443 的 HTTP/HTTPS 前端)一并暴露,可按本文的 [[proxies]] 模板增添条目,并在 NPM 中按域名分别反代。
  2. 若希望对某些服务仅自用、不暴露给公网用户,考虑使用 Tailscale 这类 虚拟局域网 方案配合本方案并行使用,做到“公开服务公开、私有服务私有”。

总结表格

环节关键文件/命令要点常见坑
云端安装/root/frp/frp_0.65.0_linux_amd64统一使用 TOML 配置;目录按本文固定写错路径、版本不一致
frps 配置frps.tomlbindPort、auth.token、TLS、Dashboard安全组/防火墙未放行 7777/远程端口
frps 服务systemdenable + restart=on-failure手工前台启动忘记做服务
本地 frpcfrpc.toml多个服务用多个 [[proxies]]localPort 写成容器内部端口而非宿主映射端口
Windows 服务NSSM以服务运行,日志重定向直接用 CMD 启动导致窗口关闭即退出
入口网关NPM127.0.0.1
反代 + HTTPS
域名未解析或 80/443 被占用
诊断Dashboard/日志看 frps 仪表盘、frpc 日志、本地端口监听容器 Exited(137) 未处理导致“连接被拒绝”

以上流程已按你的实际路径“/root/frp/frp_0.65.0_linux_amd64”和“Windows 以服务运行”定制;亦已对“无 INI、仅 TOML”的 v0.65.0 版本特性进行说明。