first_commit

This commit is contained in:
Pan Qiancheng 2025-10-14 13:51:49 +08:00
commit b6baedeaf8
6 changed files with 495 additions and 0 deletions

42
.gitignore vendored Normal file
View File

@ -0,0 +1,42 @@
# 编译文件
bin/
*.exe
*.exe~
*.dll
*.so
*.dylib
server
client
server-linux
client-linux
# 测试文件
*.test
*.out
# 数据库文件
data/
*.db
*.db-shm
*.db-wal
# 依赖文件
vendor/
# IDE 配置
.idea/
.vscode/
*.swp
*.swo
*~
# 操作系统文件
.DS_Store
Thumbs.db
# 日志文件
*.log
# 临时文件
tmp/
temp/

87
Makefile Normal file
View File

@ -0,0 +1,87 @@
.PHONY: all build clean run-server run-client test install-deps
# 默认目标
all: build
# 安装依赖
install-deps:
@echo "安装依赖..."
go mod download
go mod tidy
# 编译所有程序
build: build-server build-client
# 编译服务器
build-server:
@echo "编译服务器..."
go build -o bin/server ./server
@echo "服务器编译完成: bin/server"
# 编译客户端
build-client:
@echo "编译客户端..."
go build -o bin/client ./client
@echo "客户端编译完成: bin/client"
# 运行服务器
run-server: build-server
@echo "启动服务器..."
./bin/server -config config.yaml
# 运行客户端
run-client: build-client
@echo "启动客户端..."
./bin/client -server localhost:9000
# 清理编译文件
clean:
@echo "清理编译文件..."
rm -rf bin/
rm -rf data/
@echo "清理完成"
# 运行测试
test:
@echo "运行测试..."
go test -v ./...
# 创建必要的目录
init:
@echo "初始化项目目录..."
mkdir -p data
mkdir -p bin
@echo "目录创建完成"
# 交叉编译 Linux
build-linux:
@echo "交叉编译 Linux 版本..."
GOOS=linux GOARCH=amd64 go build -o bin/server-linux ./server
GOOS=linux GOARCH=amd64 go build -o bin/client-linux ./client
@echo "Linux 版本编译完成"
# 格式化代码
fmt:
@echo "格式化代码..."
go fmt ./...
# 代码检查
lint:
@echo "代码检查..."
go vet ./...
# 帮助信息
help:
@echo "可用的 make 命令:"
@echo " make install-deps - 安装依赖"
@echo " make build - 编译所有程序"
@echo " make build-server - 编译服务器"
@echo " make build-client - 编译客户端"
@echo " make run-server - 运行服务器"
@echo " make run-client - 运行客户端"
@echo " make clean - 清理编译文件"
@echo " make test - 运行测试"
@echo " make init - 初始化项目目录"
@echo " make build-linux - 交叉编译 Linux 版本"
@echo " make fmt - 格式化代码"
@echo " make lint - 代码检查"

333
README.md Normal file
View File

@ -0,0 +1,333 @@
# 端口转发和内网穿透系统
一个高性能、生产级别的 TCP 端口转发和内网穿透系统,使用 Go 语言编写。
## 功能特性
- ✅ **端口转发**: 支持配置化的 TCP 端口范围管理和转发
- ✅ **内网穿透**: 支持通过隧道连接实现内网服务穿透
- ✅ **持久化存储**: 使用 SQLite 数据库持久化端口映射配置
- ✅ **动态管理**: 通过 HTTP API 动态创建和删除端口映射
- ✅ **自动恢复**: 服务器启动时自动恢复已保存的端口映射
- ✅ **连接池管理**: 高效的连接池和并发管理
- ✅ **优雅关闭**: 支持优雅关闭和信号处理
- ✅ **自动重连**: 客户端支持断线自动重连
- ✅ **生产级代码**: 完善的错误处理、日志记录和性能优化
## 项目结构
```
port-forward/
├── config.yaml # 配置文件
├── go.mod # Go 模块文件
├── server/ # 服务器端
│ ├── main.go # 服务器主程序
│ ├── config/ # 配置管理
│ │ └── config.go
│ ├── db/ # 数据库管理
│ │ └── database.go
│ ├── forwarder/ # 端口转发
│ │ └── forwarder.go
│ ├── tunnel/ # 内网穿透服务端
│ │ └── server.go
│ └── api/ # HTTP API
│ └── handler.go
└── client/ # 客户端
├── main.go # 客户端主程序
└── tunnel/ # 内网穿透客户端
└── client.go
```
## 快速开始
### 1. 安装依赖
```bash
cd port-forward
go mod download
```
### 2. 配置服务器
编辑 `config.yaml` 文件:
```yaml
# 端口范围配置
port_range:
from: 10000
end: 10100
# 内网穿透配置
tunnel:
enabled: true # 是否启用内网穿透
listen_port: 9000 # 隧道监听端口
# HTTP API 配置
api:
listen_port: 8080
# 数据库配置
database:
path: "./data/mappings.db"
```
### 3. 启动服务器
```bash
# 编译服务器
go build -o server ./server
# 运行服务器
./server -config config.yaml
```
### 4. 启动客户端(如果启用了内网穿透)
```bash
# 编译客户端
go build -o client ./client
# 运行客户端
./client -server <服务器地址:9000>
```
## HTTP API 使用
### 创建端口映射
**请求**:
```bash
curl -X POST http://localhost:8080/api/mapping/create \
-H "Content-Type: application/json" \
-d '{
"port": 10001,
"target_ip": "192.168.1.100"
}'
```
**响应**:
```json
{
"success": true,
"message": "端口映射创建成功",
"data": {
"port": 10001,
"target_ip": "192.168.1.100",
"use_tunnel": false
}
}
```
### 删除端口映射
**请求**:
```bash
curl -X POST http://localhost:8080/api/mapping/remove \
-H "Content-Type: application/json" \
-d '{
"port": 10001
}'
```
**响应**:
```json
{
"success": true,
"message": "端口映射删除成功",
"data": {
"port": 10001
}
}
```
### 列出所有映射
**请求**:
```bash
curl http://localhost:8080/api/mapping/list
```
**响应**:
```json
{
"success": true,
"message": "获取映射列表成功",
"data": {
"mappings": [
{
"id": 1,
"source_port": 10001,
"target_ip": "192.168.1.100",
"target_port": 10001,
"created_at": "2024-01-01 12:00:00"
}
],
"count": 1,
"use_tunnel": false
}
}
```
### 健康检查
**请求**:
```bash
curl http://localhost:8080/health
```
**响应**:
```json
{
"status": "ok",
"tunnel_enabled": true,
"tunnel_connected": true
}
```
## 使用场景
### 场景 1: 直接端口转发(无隧道)
适用于服务器可以直接访问目标服务的情况。
1. 配置 `tunnel.enabled: false`
2. 启动服务器
3. 创建映射时指定 `target_ip`
```bash
curl -X POST http://localhost:8080/api/mapping/create \
-H "Content-Type: application/json" \
-d '{
"port": 10022,
"target_ip": "192.168.1.100"
}'
```
### 场景 2: 内网穿透(隧道模式)
适用于目标服务在内网,服务器无法直接访问的情况。
1. 配置 `tunnel.enabled: true`
2. 启动服务器
3. 在内网机器上启动客户端
4. 创建映射(无需指定 target_ip
```bash
curl -X POST http://localhost:8080/api/mapping/create \
-H "Content-Type: application/json" \
-d '{
"port": 10022
}'
```
## 性能优化
### 连接池配置
数据库连接池在 `db/database.go` 中配置:
```go
db.SetMaxOpenConns(25) // 最大打开连接数
db.SetMaxIdleConns(5) // 最大空闲连接数
```
### 缓冲区大小
数据转发缓冲区在 `forwarder/forwarder.go``tunnel/` 中配置:
```go
buffer := make([]byte, 32*1024) // 32KB 缓冲区
```
### 并发控制
- 每个端口映射使用独立的 goroutine
- 每个连接使用独立的 goroutine 进行双向转发
- 使用 context 和 WaitGroup 进行优雅关闭
## 安全建议
1. **防火墙配置**: 限制 API 端口8080的访问
2. **端口范围**: 合理设置端口范围,避免与系统端口冲突
3. **认证**: 在生产环境建议为 API 添加认证机制
4. **TLS**: 建议为隧道连接添加 TLS 加密
5. **监控**: 部署监控系统,监控端口使用和连接状态
## 监控和日志
### 日志级别
系统使用标准日志记录,包括:
- 启动和关闭事件
- 端口映射的创建和删除
- 连接建立和断开
- 错误和警告信息
### 监控指标
建议监控以下指标:
- 活跃端口映射数量
- 活跃连接数
- 数据传输速率
- 错误率
- 隧道连接状态
## 故障排查
### 问题 1: 端口映射创建失败
**原因**: 端口已被占用或超出范围
**解决**: 检查端口是否在配置的范围内,使用 `netstat` 检查端口占用
### 问题 2: 隧道连接断开
**原因**: 网络不稳定或防火墙阻止
**解决**: 客户端会自动重连,检查网络连接和防火墙规则
### 问题 3: 数据传输缓慢
**原因**: 网络延迟或缓冲区配置不当
**解决**: 调整缓冲区大小,检查网络质量
## 开发和贡献
### 编译
```bash
# 编译服务器
go build -o server ./server
# 编译客户端
go build -o client ./client
# 交叉编译Linux
GOOS=linux GOARCH=amd64 go build -o server-linux ./server
GOOS=linux GOARCH=amd64 go build -o client-linux ./client
```
### 测试
```bash
# 运行所有测试
go test ./...
# 运行特定包的测试
go test ./server/db -v
```
## 许可证
MIT License
## 作者
端口转发和内网穿透系统
## 更新日志
### v1.0.0 (2024-01-01)
- 初始版本发布
- 支持端口转发
- 支持内网穿透
- HTTP API 管理
- SQLite 持久化存储

19
config.yaml Normal file
View File

@ -0,0 +1,19 @@
# 端口转发服务配置文件
# 端口范围配置
port_range:
from: 30000
end: 40000
# 内网穿透配置
tunnel:
enabled: true
listen_port: 9000
# HTTP API 配置
api:
listen_port: 8080
# 数据库配置
database:
path: "./data/mappings.db"

8
go.mod Normal file
View File

@ -0,0 +1,8 @@
module port-forward
go 1.21
require (
github.com/mattn/go-sqlite3 v1.14.22
gopkg.in/yaml.v3 v3.0.1
)

6
go.sum Normal file
View File

@ -0,0 +1,6 @@
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=