Files
Havline/docs/FRP公网暴露操作手册.md
T

171 lines
8.6 KiB
Markdown
Raw Permalink Normal View History

2026-09-23 09:40:59 +08:00
# 内网应用经 FRP 暴露公网:NAS 侧完整操作手册
2026-10-01 16:54:35 +08:00
> 场景:把 NAS 内网应用(本例 `192.168.31.152:7023`)通过一台公网 VPS(`38.95.74.87`)以域名(`tv.36800.cc`)暴露出去,URL 不带端口号,且后续域名 / HTTPS / 访问控制全部在 NAS 的 Havline 网页里管理,VPS 只做纯流量转发。
> 适用版本:Havline v1.1.0+(FRP 多服务端模块)。VPS 上 **不需要也不应该** 装 Nginx 反代。
2026-09-23 09:40:59 +08:00
## 0. 最终架构与访问地址
```text
用户浏览器
↓ http://tv.36800.cc(80 端口,URL 不带端口)
VPS frps(监听 80 —— 由 frpc 动态注册的 tcp 隧道,VPS 上无需 Nginx)
↓ FRP 隧道(bindPort 7000,TLS)
NAS frpc
↓ 127.0.0.1:18080
2026-10-01 16:54:35 +08:00
Havline Nginx(按域名分流,后续可加 HTTPS/黑白名单)
2026-09-23 09:40:59 +08:00
↓ http://192.168.31.152:7023
内网应用
```
**访问地址:`http://tv.36800.cc`**
| 角色 | 地址 | 说明 |
| --- | --- | --- |
| 公网 VPS | `38.95.74.87`(tv.36800.cc) | 只跑 frps,Nginx 停用 |
| NAS 内网应用 | `192.168.31.152:7023` | 真正的 Web 服务 |
2026-10-01 16:54:35 +08:00
| Havline 管理后台 | `http://<NAS-IP>:6893` | 全部配置入口 |
2026-09-23 09:40:59 +08:00
## 1. 前置条件
2026-10-01 16:54:35 +08:00
- VPS:已部署 frps(bindPort 7000、token 认证;参考 Havline 服务端详情「frps.toml」一键生成);
2026-09-23 09:40:59 +08:00
- VPS:frps 的 Nginx **未**占用 80(占用见第 5 节排障);
- 云厂商安全组已放行:7000/tcp(frps 控制)、80/tcp(对外)、7500/tcp(frps 管理接口,可选,用于流量统计);
2026-10-01 16:54:35 +08:00
- NAS:Havline 已部署并能打开管理后台;
- 域名:`tv.36800.cc` 的 DNS A 记录指向 VPS IP(可用 Havline DDNS 页「自定义 IP」固定,或由 DNS 服务商直接管理)。
2026-09-23 09:40:59 +08:00
2026-10-01 16:54:35 +08:00
## 2. Havline 网页配置(三处)
2026-09-23 09:40:59 +08:00
### 2.1 FRP 服务端
路径:**FRP 穿透 → 添加服务端**
| 字段 | 值 |
| --- | --- |
| 主机地址 | VPS 的 IP 或域名 |
| 端口 | 7000(= frps bindPort) |
| 认证方式 | Token,与 VPS frps.toml 的 `auth.token` 一致 |
| TLS | 开启(frps 默认接受) |
| frps 管理接口(可选) | 填 frps `webServer` 的地址/端口/用户/密码,用于显示穿透流量 |
保存后状态应显示「运行中 · 已连接」。
### 2.2 穿透规则(核心)
路径:**FRP 穿透 → 添加规则**
| 字段 | 值 | 说明 |
| --- | --- | --- |
| 所属服务端 | 上一步的服务端 | |
| 名称 | `tv`(frps 全局唯一,出现在日志里) | |
2026-10-01 16:54:35 +08:00
| 类型 | **tcp** | ⚠️ 不选 http——80 直接由 frps 转发,域名分流交给 Havline 反代 |
2026-09-23 09:40:59 +08:00
| 远程端口 | **80** | 选 tcp 类型后出现此字段;frpc 登录时向 frps 动态注册 |
2026-10-01 16:54:35 +08:00
| 内网目标 | **127.0.0.1:18080** | 指向 Havline 自己的 Nginx HTTP 监听(fnOS host 模式默认 18080) |
2026-09-23 09:40:59 +08:00
保存 → 右上 **「应用配置」→「校验并应用配置」**,或对该服务端「停止→启动」。
### 2.3 反向代理(域名分流)
路径:**反向代理 → 添加规则**
| 字段 | 值 |
| --- | --- |
| 前端域名 | `tv.36800.cc` |
| 监听端口 | **18080**(与 2.2 的内网目标端口一致;fnOS 下不要用 80,系统 Nginx 已占用) |
| 目标地址 | `http://192.168.31.152:7023`(⚠️ 指向真正的内网应用,完整 URL 带协议与端口) |
2026-10-01 16:54:35 +08:00
| HTTPS | 按需;fnOS 下 Havline Nginx 的 HTTPS 监听默认 9443 |
2026-09-23 09:40:59 +08:00
> ⚠️ **回环警告**:目标地址千万不要填 `http://tv.36800.cc:xxxx`——那会让请求从 NAS 出公网再回 NAS(NAS→VPS→NAS 绕圈)。反代目标是**内网应用本身**。
> ⚠️ **「目标地址缺少主机名」报错**:目标地址格式必须完整 `http://IP:端口`(协议+主机+端口缺一不可,单斜杠 `http:/` 或中文冒号都会报 400)。
## 3. VPS 侧配置(一次性的两步)
2026-10-01 16:54:35 +08:00
### 3.1 frps.toml(Havline 一键生成)
2026-09-23 09:40:59 +08:00
2026-10-01 16:54:35 +08:00
Havline 服务端「详情」→「frps.toml」→ 复制内容到 VPS 保存为 `frps.toml`:
2026-09-23 09:40:59 +08:00
```toml
bindAddr = "0.0.0.0"
bindPort = 7000
auth.method = "token"
2026-10-01 16:54:35 +08:00
auth.token = "<与 Havline 一致>"
2026-09-23 09:40:59 +08:00
2026-10-01 16:54:35 +08:00
webServer.addr = "0.0.0.0" # 可选:Havline 拉取穿透流量
2026-09-23 09:40:59 +08:00
webServer.port = 7500
webServer.user = "admin"
webServer.password = "<自定义>"
log.to = "console"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false
```
> 注意:**这个文件里没有任何远程端口**。tcp 类型规则的远程端口(80)由 frpc 登录时动态注册,frps 只管 bindPort 和认证——规则改了也不用改这个文件。
启动:`./frps -c frps.toml`(建议配 systemd)。
### 3.2 释放 80 端口(关键,`port unavailable` 的唯一解法)
80 只能给一个进程。frps 要绑 80,VPS 上原有的 Nginx 必须停掉:
```bash
# 确认 80 被谁占用
ss -tlnp | grep ':80 '
# 停止并禁用 Nginx(宝塔面板安装的在宝塔「软件商店」里停)
systemctl stop nginx
systemctl disable nginx
# 确认已释放(应无输出)
ss -tlnp | grep ':80 '
```
frpc 约每 33 秒自动重试注册,释放后无需任何手动操作,注册成功后 frps 日志出现 proxy 启动记录、frpc 日志的 `start error: port unavailable` 消失。
> 如果 VPS 的 80/443 还要跑其他站点(Nginx 不能停),本方案不适用——改回「VPS Nginx 监听 80 → proxy_pass 127.0.0.1:8080(frps vhost)」的方案,FRP 规则用 http 类型,见第 6 节方案对比。
## 4. 验证清单
| 步骤 | 命令 / 操作 | 预期 |
| --- | --- | --- |
| VPS 80 已监听 | `ss -tlnp \| grep ':80 '` | 进程为 frps |
2026-10-01 16:54:35 +08:00
| frpc 注册成功 | Havline 服务端「日志」 | 无 `port unavailable`,有 proxy 启动记录 |
| 隧道通 | Havline 服务端「测速」/「详情」诊断 | TCP 可达、frpc 登录 ok、延迟正常 |
2026-09-23 09:40:59 +08:00
| 分流通 | 服务端「详情」→ 诊断 `proxy_reachable` | ok |
| 端到端 | 外网浏览器 `http://tv.36800.cc` | 直达内网应用页面 |
## 5. 故障排查(按链路顺序)
| 现象 | 断点 | 处理 |
| --- | --- | --- |
| `Connection refused`(外部 curl 80) | **VPS 侧**:frps 没绑上 80 | ① `ss -tlnp \| grep ':80 '` 看 80 被谁占(多为 Nginx 没停)→ 停用;② `systemctl status frps` 确认在跑且用的新配置(nohup 手动跑的必须 `pkill frps` 重启);③ 重启后等 frpc 自动重试 |
| frpc 日志 `start error: port unavailable` | 同上 | VPS 80 被占;见 3.2 |
| 诊断「frpc 登录」失败 | Token/端口不一致 | 两端 token 对齐;端口=frps bindPort |
2026-10-01 16:54:35 +08:00
| 登录成功但 `proxy_reachable` 失败 | Havline 反代 | 反代规则监听端口与 FRP 内网目标端口一致(18080);反代已启用 |
2026-09-23 09:40:59 +08:00
| 打开域名 404 | 域名分流失败 | 反代规则的前端域名与访问域名完全一致;frps 无需 vhost(tcp 方案) |
| 域名解析不对 | DNS | `nslookup tv.36800.cc` 应返回 VPS IP;用 DDNS 自定义 IP 固定 |
2026-10-01 16:54:35 +08:00
| 流量统计全 0 | frps webServer 未配 | 非必须;要在 Havline 看流量就配 webServer 并在服务端表单填管理接口 |
2026-09-23 09:40:59 +08:00
## 6. 两种方案对比(VPS 80 的归属)
| | 方案 A:NAS 侧全管(本文) | 方案 B:VPS Nginx 反代 |
| --- | --- | --- |
| FRP 规则类型 | tcp,远程端口 80 → 127.0.0.1:18080 | http 类型 + frps `vhostHTTPPort=8080` |
| http 类型去端口 | —(tcp 方案直接占 80) | `vhostHTTPPort` 从 8080 改 **80**:URL 变 `http://域名`(无端口);前提同样是 VPS 停 Nginx 释放 80,改后 `pkill frps` 重启生效;NAS 侧规则无需动 |
| VPS Nginx | 不需要(停用) | 必须:listen 80 → proxy_pass 127.0.0.1:8080(**必须带** `proxy_set_header Host $host`) |
2026-10-01 16:54:35 +08:00
| 加新域名 | Havline 反代加一条 + FRP 加一条 tcp 规则(远程端口仍 80,内网目标同 18080) | VPS 上加 server 块 |
| 上 HTTPS | Havline 证书页(DNS-01)+ 反代开 HTTPS + FRP 加 tcp 443→127.0.0.1:9443 | VPS 上装证书 |
| 访问控制(IP/BasicAuth) | Havline 反代页直接配 | VPS 上手写 |
2026-09-23 09:40:59 +08:00
| 限制 | VPS 80/443 不能再跑别的站点 | VPS 可共存多站点 |
| URL | `http://tv.36800.cc`(无端口) | `http://tv.36800.cc`(80)或带 vhost 端口 |
选型:VPS 专用做穿透入口 → 方案 A;VPS 80/443 另有他用 → 方案 B。两方案不混用(80 归属唯一)。
## 7. HTTPS 升级路径(方案 A 延伸)
2026-10-01 16:54:35 +08:00
1. **Havline 证书页**:申请 `tv.36800.cc` 或 `*.36800.cc` 证书(ACME DNS-01,复用 DDNS 页服务商凭证);
2026-09-23 09:40:59 +08:00
2. **反代规则**:开 HTTPS、绑定证书、(可选)HTTP 强制跳转;
2026-10-01 16:54:35 +08:00
3. **FRP 加一条 tcp 规则**:远程端口 443 → 内网目标 `127.0.0.1:9443`(Havline Nginx HTTPS 监听);
2026-09-23 09:40:59 +08:00
4. 安全组放行 443;之后 `https://tv.36800.cc` 可用,TLS 全程在 NAS 侧终止。