Files
OpenFlare/docs/guide/tunnel-usage.md
T
2026-06-27 16:29:58 +08:00

171 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 内网穿透与隧道使用
你会学到:OpenFlare 内网穿透隧道的设计原理、核心概念(中继节点与隧道客户端),以及如何从零开始将内网开发环境或私有云服务一步步安全、稳定地发布到公网域名上。
在许多实际开发和运维场景中,我们的源站服务部署在局域网、本地开发机或防范严密的私有 VPC 内部,没有公网 IP,亦无法在边界防火墙或路由器上配置端口映射。
OpenFlare 提供了**基于反向中继穿透隧道**的整体解决方案。你只需在内网环境发起向公网中继节点的出向安全连接,无需配置任何入方向端口,即可将公网的 Web 访问流量平滑引入内网源站,同时享有网关提供的 TLS 证书自动托管与 WAF 安全防护。
---
## 核心概念
在使用内网穿透功能前,你需要熟悉以下组件与核心概念:
| **中继节点 (Relay)** | 部署在公网边缘的流量中继服务,负责监听内网客户端的长连接,并作为网关 Agent (OpenResty) 与内网流量的中转桥梁。 | 运行 `openflare-relay` 守护的 `tunnel_relay` 节点 |
| **穿透隧道 (Tunnel)** | 逻辑上的穿透客户端实例,拥有全局唯一 ID 与安全认证令牌,用以标识一个具体的内网环境。 | 在「节点管理」中创建的 `tunnel_client` 节点,分配专属 Tunnel Token |
| **隧道客户端 (Client)** | 运行在内网环境下的轻量控制器,根据 Server 下发的配置自动管理底层的 frpc 隧道子进程。 | 内网部署的 `openflared` 容器或独立二进制进程 |
| **隧道上游 (Tunnel Upstream)** | 路由规则中的特殊反代类型。选择此类型后,网关会将公网流量转发至本地中继端的 Vhost 端口,最终送达内网源站。 | 在「规则管理」详情页中配置的反向代理类型,选择源站类型为「内网穿透」并绑定对应 Tunnel 节点 |
---
## 推荐操作顺序
将一个内网服务发布到公网,推荐按这个顺序进行:
1. 注册并部署至少一个公网 **中继节点 (Relay)** 并保持在线。
2. 进入 **「节点管理」**,新建一个类型为 **Tunnel 节点 (tunnel_client)** 的节点,获取专属 Token。
3. 在内网服务器中部署并启动 **隧道客户端 (OpenFlared)**。
4. 确认管理端中该 Tunnel 节点的状态显示为「在线」。
5. 在 **「规则管理」** 页面新增或编辑规则,在「反向代理」选项卡中选择源站类型为 **「内网穿透」**,绑定对应 Tunnel 节点并填写内网服务端口(如 `127.0.0.1:8080`)。
6. 发布并激活新版本。
7. 通过公网域名访问,验证内网穿透链路是否打通。
---
## 详细配置步骤
### 第一步:准备中继节点 (Relay)
内网流量需要通过公网的中继节点进行中转。在开始前,你需要确保公网有一台可用的中继服务器。
1. 登录管理端,进入 **「节点管理」**。
2. 添加一个新节点,并将 **节点类型** 选择为 **中继节点 (tunnel_relay)**。
3. 保存后,复制该节点专属的 `agent_token`。
4. 在你的公网服务器上启动 `openflare-relay`。你可以直接使用 Docker 快速运行:
```bash
docker run -d --name openflare-relay --restart unless-stopped \
-p 7000:7000 \
-e OPENFLARE_SERVER_URL=http://<你的Server公网IP>:3000 \
-e OPENFLARE_AGENT_TOKEN=<刚才复制的AgentToken> \
-v openflare-relay-data:/var/lib/openflare-relay \
ghcr.io/rain-kl/openflare-relay:latest
```
> [!IMPORTANT]
> 请务必在云服务器安全组中放行 `7000` 端口(frpc 客户端连接控制端口)。如果你的 Server 与中继节点部署在同一台机器,这里的 `OPENFLARE_SERVER_URL` 应指向 Server 的公网或内网通信 IP。
### 第二步:在管理端创建 Tunnel 节点
1. 导航至管理侧边栏的 **「节点管理」** 页面。
2. 点击 **「新增节点」** 按钮,在弹窗中选择节点类型为 **「Tunnel 节点 (tunnel_client)」**。
3. 填入节点名称与描述,点击保存。
4. 在节点列表中点击进入刚才创建的 Tunnel 节点详情页,你可以找到专属的 **Tunnel Token** 及相应的客户端一键部署命令。
### 第三步:部署内网客户端 (OpenFlared)
回到你的内网服务器中,根据刚才复制的部署命令运行客户端。
#### 方案 A:使用 Docker 部署(强烈推荐)
官方提供的 `openflared` 镜像已经内置了主控守护进程与 `frpc` 运行时,开箱即用,无需配置额外依赖:
```bash
docker run -d --name openflared --restart unless-stopped \
-e OPENFLARE_SERVER_URL=http://<你的Server公网IP>:3000 \
-e OPENFLARE_TUNNEL_TOKEN=<刚才复制的TunnelToken> \
-v openflared-data:/app/data \
ghcr.io/rain-kl/openflared:latest
```
#### 方案 B:宿主机二进制手动运行
如果你不便使用 Docker,也可以下载或自行编译 `flared` 二进制程序:
1. 在内网机器的程序同级目录下创建 `flared.json` 配置文件:
```json
{
"server_url": "http://<你的Server公网IP>:3000",
"tunnel_token": "<刚才复制的TunnelToken>",
"frpc_path": "/usr/local/bin/frpc",
"data_dir": "./data"
}
```
2. 执行启动命令:
```bash
./flared -config ./flared.json
```
#### 状态确认
启动成功后,内网客户端会通过出向网络向控制面发送心跳同步配置。此时:
1. 刷新管理端的 **「节点管理」** 列表,刚才创建的 Tunnel 节点状态指示灯应当变为绿色的 **「在线」**。
2. 点击节点进入详情页,你可以直观地查看到当前内网客户端连接了公网的哪些中继 Relay 节点。
### 第四步:配置请求路由并绑定隧道上游
现在你可以为你的内网服务配置公网反向代理和域名访问了。
1. 首先进入 **「网站管理」->「域名列表」** 录入你想要公开访问的域名。
2. 进入 **「规则管理」** 页面,点击 **「新增规则」** 或编辑已有规则。
3. 在下方 **「反向代理」** 选项卡下,将 **源站类型** 切换为 **「内网穿透」**。
4. 从下拉列表中选择刚才部署在线的 **Tunnel 节点**。
5. 填写 **内网目标地址**(对于内网客户端来说可访问的本地地址与端口,例如 `127.0.0.1:8080`)与 **内网协议**(通常为 `http`)。
6. 配置其他站点常规项,并点击保存。
### 第五步:发布与生效
为了让网关的 OpenResty 能够正确匹配并路由域名流量,我们需要发布新的配置版本。
1. 点击导航栏右上角的 **「配置预览」**,确认生成的站点配置无误。
2. 在弹出窗口中,点击 **「发布并激活」**。
3. 此时,公网边缘的 Agent 会拉取到最新路由:它会将 `nas.example.com` 的请求转发至同机部署的 `openflare-relay (frps)` 的虚拟主机端口下。
4. 内网客户端 `openflared (frpc)` 会接收到被中继的封包,并安全地透传给内网的 `127.0.0.1:8080` 服务,最后原路返回响应。
5. 在你的公网浏览器中访问 `nas.example.com`,确认内网服务成功展示!
---
## 高级应用场景
### 1. 单隧道多服务复用 (多端口映射)
你并不需要为内网的每一个服务都部署一个 `openflared` 容器。
如果你想在一个内网环境映射多个不同的服务(例如:`127.0.0.1:80` 是博客,`127.0.0.1:8080` 是 API,`192.168.1.120:9000` 是内网网盘):
1. 保持这一个 `openflared` 客户端在线。
2. 在管理端创建三个独立的网站配置(绑定各自对应的公网域名)。
3. 这三个网站配置都将 **上游类型** 选为 **同一个穿透隧道**。
4. 分别在各自的“内网目标地址”中填入对应不同的端口或局域网 IP(例如 `127.0.0.1:80`、`127.0.0.1:8080`、`192.168.1.120:9000`)。
5. 发布并激活新版本,即可实现一隧多用。
### 2. 网关安全功能无缝叠加
因为所有公网流量均首先进入公网的 Agent 节点,在此处完成了 HTTPS/TLS 握手与 WAF 引擎拦截,然后再通过安全隧道送达内网。
因此,你的内网服务**天然且无需做任何改造**即可享受以下高级特性:
* **一键启用 HTTPS**:直接在管理端为域名选择或申请 SSL 证书,数据传输全程加密。
* **全局/自定义 WAF 防护**:开启 SQL 注入拦截、XSS 注入防御与恶意地域 IP 屏蔽。
* **人机挑战 (CC PoW)**:一键抵御针对内网服务的恶意 CC 刷接口攻击。
---
## 常见故障排查
### 1. 隧道在管理端显示为「离线」
* **检查 Token 是否正确**:查看 `flared` 日志或环境变量中配置的 `tunnel_token` 是否与管理端生成的一致。
* **检查网络连通性**:内网服务器需能通过出向网络正常请求 Server 地址。确保控制面没有启用防火墙限制客户端的 HTTP 请求。
* **中继节点防火墙未开**:检查对应中继节点的公网 `7000` 端口(或你自定义的 bindPort)是否已经在安全组中对公网放行。
### 2. 访问公网域名返回 502 Bad Gateway / 504 Gateway Timeout
* **内网服务未运行**:确认内网目标地址对应的服务已在内网服务器上成功启动并处于监听状态。
* **目标地址不可达**:如果内网地址填的是 `127.0.0.1:8080`,确保服务确实在运行着 `openflared` 的同一台主机上;如果填的是局域网 IP `192.168.x.x`,请在 `openflared` 容器内测试该局域网 IP 的连通性。
* **检查客户端应用日志**:在管理端查看「应用记录」或在内网查看 `flared` 运行日志,排查是否有 `LastError` 产生。frpc 在连不上内网端口时,会将连接失败报错原样上报至 Server 方便管理员定位。
### 3. 多中继网络动荡或重试失败
* 当控制面关联了多个 Relay 中继节点时,`openflared` 会为每个 Relay 独立派生 frpc 守护进程,并在 `flared.json` 中配置的 `sync_interval`(默认 30s)内定时向控制面拉取拓扑状态。
* 若发现某一中继节点频繁由于网络抖动离线,系统会自动触发退避重试机制。你可以在宿主机日志中看到 `frpc process missing, starting` 的日志,这属于正常的进程自愈逻辑,通常在网络恢复后 5~10 秒内即可自动恢复建连。