面向场景:你在家里的 Windows 笔记本(Surface Laptop 2)上运行若干 Docker 服务(例如端口 3210、5432、8181),家中宽带在 大内网/NAT 后,没有公网 IP;你已有一台有公网 IP 的 云服务器,并已部署 Nginx Proxy Manager(NPM)。目标是通过 frp 建立安全隧道,让手机在 5G 外网也能访问这些服务。
NAT:网络地址转换,将大量私网地址通过少量公网地址上网,导致内网设备无法被公网主动访问。
text手机/外网 → 域名(Nginx Proxy Manager, 云) → 127.0.0.1:远程端口(frps) ↓ frp 隧道 家中 Windows: 本地端口 (Docker 服务)
隧道:指通过中间节点转发建立的端到端连接通道,常用于穿透 内网 或 防火墙。
TOML:一种人类友好的配置文件格式,键值以 key = "value" 表示,层级清晰、类型明确。
以下以 Debian/Ubuntu 为例,其他发行版同理。
1)下载与解压(保持与本文版本一致)
bashsudo 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 服务(开机自启)
bashsudo 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)放通安全组与防火墙
bashsudo 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)验证
1)准备文件
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)
batD:\nssm-2.24\win64\nssm.exe install frpc
在弹出的窗口中填写:
保存后启动服务:
权限不足可以用powershell管理员模式执行命令
windows + x
在弹出的菜单中,选择“Windows PowerShell (管理员)”或“终端 (管理员)”
batD:\nssm-2.24\win64\nssm.exe start frpc
常用命令:
batnssm stop frpc nssm edit frpc nssm remove frpc confirm
NSSM:将任意可执行程序包装成 Windows 服务的工具,支持崩溃重启、日志重定向。
4)容器与本地端口自检
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
docker logs <容器名> 排查,确保服务可用。Exited(137):多见于内存不足或被系统/管理器终止,排查容器资源与参数。
1)DNS 解析
2)NPM 新建 Proxy Host
反向代理:由网关服务器代表客户端向后端发起请求,实现统一入口、证书管理与安全策略。
frpc 连接超时(i/o timeout)
systemctl status frpsTest-NetConnection 云IP -Port 7777隧道已建立但访问失败
docker ps -a、docker logs 核对端口映射与状态证书申请失败
性能与安全
transport.tls.enable = true 提升链路安全HTTP Basic Auth:最基础的 HTTP 认证方式,可在网关上添加用户名/密码保护后台。
1)云服务器 /root/frp/frp_0.65.0_linux_amd64/frps.toml
tomlbindPort = 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(含三个服务)
tomlserverAddr = "云服务器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 为服务
transport.tls.enable = true);restart: unless-stopped,避免重启后不自起;Dashboard:frps 自带的状态面板,可直观看到在线客户端与代理列表。
[[proxies]] 模板增添条目,并在 NPM 中按域名分别反代。| 环节 | 关键文件/命令 | 要点 | 常见坑 |
|---|---|---|---|
| 云端安装 | /root/frp/frp_0.65.0_linux_amd64 | 统一使用 TOML 配置;目录按本文固定 | 写错路径、版本不一致 |
| frps 配置 | frps.toml | bindPort、auth.token、TLS、Dashboard | 安全组/防火墙未放行 7777/远程端口 |
| frps 服务 | systemd | enable + restart=on-failure | 手工前台启动忘记做服务 |
| 本地 frpc | frpc.toml | 多个服务用多个 [[proxies]] | localPort 写成容器内部端口而非宿主映射端口 |
| Windows 服务 | NSSM | 以服务运行,日志重定向 | 直接用 CMD 启动导致窗口关闭即退出 |
| 入口网关 | NPM | 127.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 版本特性进行说明。