update
All checks were successful
Build Multi-Platform Binaries / build (push) Successful in 11m54s

This commit is contained in:
Flik
2025-12-26 17:14:54 +08:00
parent 4623a7f031
commit 549f9aaf26
63 changed files with 10266 additions and 740 deletions

238
README.md
View File

@@ -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) 开源许可证。