This commit is contained in:
238
README.md
238
README.md
@@ -15,8 +15,9 @@ GoTunnel 是一个类似 frp 的内网穿透解决方案,核心特点是**服
|
||||
|------|----------|-----|
|
||||
| 配置管理 | 服务端集中管理 | 客户端各自配置 |
|
||||
| TLS 证书 | 自动生成,零配置 | 需手动配置 |
|
||||
| 管理界面 | 内置 Web 控制台 | 需额外部署 Dashboard |
|
||||
| 客户端部署 | 仅需 3 个参数 | 需配置文件 |
|
||||
| 管理界面 | 内置 Web 控制台 (naive-ui) | 需额外部署 Dashboard |
|
||||
| 客户端部署 | 仅需 2 个参数 | 需配置文件 |
|
||||
| 客户端 ID | 可选,服务端自动分配 | 需手动配置 |
|
||||
|
||||
### 架构设计
|
||||
|
||||
@@ -104,7 +105,14 @@ go build -o client ./cmd/client
|
||||
### 客户端启动
|
||||
|
||||
```bash
|
||||
# 最简启动(ID 由服务端自动分配)
|
||||
./client -s <服务器IP>:7000 -t <Token>
|
||||
|
||||
# 指定客户端 ID
|
||||
./client -s <服务器IP>:7000 -t <Token> -id <客户端ID>
|
||||
|
||||
# 禁用 TLS(需服务端也禁用)
|
||||
./client -s <服务器IP>:7000 -t <Token> -no-tls
|
||||
```
|
||||
|
||||
**参数说明:**
|
||||
@@ -113,7 +121,7 @@ go build -o client ./cmd/client
|
||||
|------|------|------|
|
||||
| `-s` | 服务器地址 (ip:port) | 是 |
|
||||
| `-t` | 认证 Token | 是 |
|
||||
| `-id` | 客户端 ID(需与服务端配置匹配) | 否(自动生成) |
|
||||
| `-id` | 客户端 ID | 否(服务端自动分配) |
|
||||
| `-no-tls` | 禁用 TLS 加密 | 否 |
|
||||
|
||||
## 配置系统
|
||||
@@ -189,6 +197,7 @@ web:
|
||||
```json
|
||||
{
|
||||
"id": "client-a",
|
||||
"nickname": "办公室电脑",
|
||||
"rules": [
|
||||
{"name": "web", "type": "tcp", "local_ip": "127.0.0.1", "local_port": 80, "remote_port": 8080},
|
||||
{"name": "dns", "type": "udp", "local_ip": "127.0.0.1", "local_port": 53, "remote_port": 5353},
|
||||
@@ -211,22 +220,23 @@ GoTunnel/
|
||||
│ │ ├── config/ # 配置管理
|
||||
│ │ ├── db/ # 数据库存储
|
||||
│ │ ├── app/ # Web 服务
|
||||
│ │ ├── router/ # API 路由
|
||||
│ │ └── plugin/ # 服务端插件管理
|
||||
│ │ └── router/ # API 路由
|
||||
│ └── client/
|
||||
│ ├── tunnel/ # 客户端隧道
|
||||
│ └── plugin/ # 客户端插件管理和缓存
|
||||
│ └── tunnel/ # 客户端隧道
|
||||
├── pkg/
|
||||
│ ├── protocol/ # 通信协议
|
||||
│ ├── crypto/ # TLS 加密
|
||||
│ ├── proxy/ # 代理服务器
|
||||
│ ├── relay/ # 数据转发
|
||||
│ ├── auth/ # JWT 认证
|
||||
│ ├── utils/ # 工具函数
|
||||
│ └── plugin/ # 插件系统核心
|
||||
│ ├── builtin/ # 内置插件 (socks5)
|
||||
│ ├── wasm/ # WASM 运行时 (wazero)
|
||||
│ └── store/ # 插件持久化 (SQLite)
|
||||
├── web/ # Vue 3 前端
|
||||
├── web/ # Vue 3 + naive-ui 前端
|
||||
├── scripts/ # 构建脚本
|
||||
│ └── build.sh # 跨平台构建脚本
|
||||
└── go.mod
|
||||
```
|
||||
|
||||
@@ -258,7 +268,22 @@ type ProxyHandler interface {
|
||||
|
||||
## Web API
|
||||
|
||||
Web 控制台提供 RESTful API 用于管理客户端和配置。
|
||||
Web 控制台提供 RESTful API 用于管理客户端和配置。配置了 `username` 和 `password` 后,API 需要 JWT 认证。
|
||||
|
||||
### 认证
|
||||
|
||||
```bash
|
||||
# 登录获取 Token
|
||||
POST /api/auth/login
|
||||
Content-Type: application/json
|
||||
{"username": "admin", "password": "password"}
|
||||
|
||||
# 响应
|
||||
{"token": "eyJhbGciOiJIUzI1NiIs..."}
|
||||
|
||||
# 后续请求携带 Token
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
### 客户端管理
|
||||
|
||||
@@ -266,23 +291,45 @@ Web 控制台提供 RESTful API 用于管理客户端和配置。
|
||||
# 获取所有客户端
|
||||
GET /api/clients
|
||||
|
||||
# 添加客户端
|
||||
POST /api/clients
|
||||
Content-Type: application/json
|
||||
{"id": "client-a", "rules": [...]}
|
||||
|
||||
# 获取单个客户端
|
||||
GET /api/client/{id}
|
||||
|
||||
# 更新客户端规则
|
||||
# 更新客户端(昵称和规则)
|
||||
PUT /api/client/{id}
|
||||
Content-Type: application/json
|
||||
{"rules": [...]}
|
||||
{"nickname": "办公室电脑", "rules": [...]}
|
||||
|
||||
# 删除客户端
|
||||
DELETE /api/client/{id}
|
||||
```
|
||||
|
||||
### 客户端控制
|
||||
|
||||
```bash
|
||||
# 推送配置到在线客户端(客户端会立即应用新规则)
|
||||
POST /api/client/{id}/push
|
||||
|
||||
# 断开客户端连接
|
||||
POST /api/client/{id}/disconnect
|
||||
```
|
||||
|
||||
### 插件管理
|
||||
|
||||
```bash
|
||||
# 获取已注册的插件列表
|
||||
GET /api/plugins
|
||||
|
||||
# 响应示例
|
||||
[
|
||||
{
|
||||
"name": "socks5",
|
||||
"version": "1.0.0",
|
||||
"description": "SOCKS5 proxy plugin",
|
||||
"source": "builtin"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### 服务状态
|
||||
|
||||
```bash
|
||||
@@ -292,6 +339,11 @@ GET /api/status
|
||||
# 获取配置
|
||||
GET /api/config
|
||||
|
||||
# 更新配置
|
||||
PUT /api/config
|
||||
Content-Type: application/json
|
||||
{"server": {"heartbeat_sec": 30}, "web": {"enabled": true}}
|
||||
|
||||
# 重载配置
|
||||
POST /api/config/reload
|
||||
```
|
||||
@@ -324,9 +376,9 @@ curl --socks5 server:1080 http://internal-service/
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q: 客户端连接失败,提示 "client not configured"**
|
||||
**Q: 客户端连接后如何设置昵称?**
|
||||
|
||||
A: 需要先在服务端 Web 控制台添加对应的客户端 ID。
|
||||
A: 在 Web 控制台点击客户端详情,进入编辑模式即可设置昵称。
|
||||
|
||||
**Q: 如何禁用 TLS?**
|
||||
|
||||
@@ -336,6 +388,156 @@ A: 服务端配置 `tls_disabled: true`,客户端使用 `-no-tls` 参数。
|
||||
|
||||
A: 服务端会自动检测端口冲突,请检查日志并更换端口。
|
||||
|
||||
**Q: 客户端 ID 是如何分配的?**
|
||||
|
||||
A: 如果客户端未指定 `-id` 参数,服务端会自动生成 16 位随机 ID。
|
||||
|
||||
## 构建
|
||||
|
||||
使用构建脚本可以一键构建前后端:
|
||||
|
||||
```bash
|
||||
# 构建当前平台
|
||||
./scripts/build.sh current
|
||||
|
||||
# 构建所有平台
|
||||
./scripts/build.sh all
|
||||
|
||||
# 仅构建 Web UI
|
||||
./scripts/build.sh web
|
||||
|
||||
# 清理构建产物
|
||||
./scripts/build.sh clean
|
||||
|
||||
# 指定版本号
|
||||
VERSION=1.0.0 ./scripts/build.sh all
|
||||
```
|
||||
|
||||
构建产物输出到 `build/<os>_<arch>/` 目录。
|
||||
|
||||
## 架构时序图
|
||||
|
||||
### 1. 连接建立阶段
|
||||
|
||||
```
|
||||
┌────────┐ ┌────────┐ ┌──────────┐
|
||||
│ Client │ │ Server │ │ Database │
|
||||
└───┬────┘ └───┬────┘ └────┬─────┘
|
||||
│ │ │
|
||||
│ 1. TCP/TLS Connect│ │
|
||||
│──────────────────>│ │
|
||||
│ │ │
|
||||
│ 2. AuthRequest │ │
|
||||
│ {token, id?} │ │
|
||||
│──────────────────>│ │
|
||||
│ │ 3. 验证 Token │
|
||||
│ │ 4. 查询/创建客户端 │
|
||||
│ │───────────────────>│
|
||||
│ │<───────────────────│
|
||||
│ │ │
|
||||
│ 5. AuthResponse │ │
|
||||
│ {ok, client_id} │ │
|
||||
│<──────────────────│ │
|
||||
│ │ │
|
||||
│ 6. Yamux Session │ │
|
||||
│<═════════════════>│ │
|
||||
│ │ │
|
||||
│ 7. ProxyConfig │ │
|
||||
│ {rules[]} │ │
|
||||
│<──────────────────│ │
|
||||
│ │ │
|
||||
```
|
||||
|
||||
### 2. TCP 代理数据流
|
||||
|
||||
```
|
||||
┌──────────┐ ┌────────┐ ┌────────┐ ┌───────────────┐
|
||||
│ External │ │ Server │ │ Client │ │ Local Service │
|
||||
└────┬─────┘ └───┬────┘ └───┬────┘ └───────┬───────┘
|
||||
│ │ │ │
|
||||
│ 1. Connect │ │ │
|
||||
│ :remote │ │ │
|
||||
│─────────────>│ │ │
|
||||
│ │ │ │
|
||||
│ │ 2. Yamux │ │
|
||||
│ │ Stream │ │
|
||||
│ │────────────>│ │
|
||||
│ │ │ │
|
||||
│ │ 3. NewProxy │ │
|
||||
│ │ {port} │ │
|
||||
│ │────────────>│ │
|
||||
│ │ │ │
|
||||
│ │ │ 4. Connect │
|
||||
│ │ │ local:port │
|
||||
│ │ │────────────────>│
|
||||
│ │ │ │
|
||||
│ 5. Relay (双向数据转发) │ │
|
||||
│<════════════>│<═══════════>│<═══════════════>│
|
||||
│ │ │ │
|
||||
```
|
||||
|
||||
### 3. SOCKS5/HTTP 代理数据流
|
||||
|
||||
```
|
||||
┌──────────┐ ┌────────┐ ┌────────┐ ┌─────────────┐
|
||||
│ External │ │ Server │ │ Client │ │ Target Host │
|
||||
└────┬─────┘ └───┬────┘ └───┬────┘ └──────┬──────┘
|
||||
│ │ │ │
|
||||
│ 1. SOCKS5 │ │ │
|
||||
│ Handshake │ │ │
|
||||
│─────────────>│ │ │
|
||||
│ │ │ │
|
||||
│ │ 2. Proxy │ │
|
||||
│ │ Connect │ │
|
||||
│ │ {target} │ │
|
||||
│ │────────────>│ │
|
||||
│ │ │ │
|
||||
│ │ │ 3. Dial target │
|
||||
│ │ │───────────────>│
|
||||
│ │ │ │
|
||||
│ │ 4. Result │ │
|
||||
│ │<────────────│ │
|
||||
│ │ │ │
|
||||
│ 5. Relay (双向数据转发) │ │
|
||||
│<════════════>│<═══════════>│<══════════════>│
|
||||
│ │ │ │
|
||||
```
|
||||
|
||||
### 4. 心跳保活机制
|
||||
|
||||
```
|
||||
┌────────┐ ┌────────┐
|
||||
│ Client │ │ Server │
|
||||
└───┬────┘ └───┬────┘
|
||||
│ │
|
||||
│ │ 1. Ticker (30s)
|
||||
│ │
|
||||
│ 2. Heartbeat │
|
||||
│<──────────────────│
|
||||
│ │
|
||||
│ 3. HeartbeatAck │
|
||||
│──────────────────>│
|
||||
│ │
|
||||
│ │ 4. 更新 LastPing
|
||||
│ │
|
||||
│ ... 循环 ... │
|
||||
│ │
|
||||
│ │ 5. 超时检测 (90s)
|
||||
│ │ 无响应则断开
|
||||
│ │
|
||||
```
|
||||
|
||||
### 核心组件说明
|
||||
|
||||
| 组件 | 职责 |
|
||||
|------|------|
|
||||
| Client | 连接服务端、转发本地服务、响应心跳 |
|
||||
| Server | 认证、管理会话、监听端口、路由流量 |
|
||||
| Yamux | 单连接多路复用,承载控制和数据通道 |
|
||||
| Plugin | 处理 SOCKS5/HTTP 等代理协议 |
|
||||
| PortManager | 端口分配与释放管理 |
|
||||
| Database | 持久化客户端配置和规则 |
|
||||
|
||||
## 许可证
|
||||
|
||||
本项目采用 [MIT License](LICENSE) 开源许可证。
|
||||
|
||||
Reference in New Issue
Block a user