Files
socks-manager/README.md
T
Your Name 06470512f6 深度优化: 修复跨服务器登录、密码哈希、仪表盘UI、流量趋势等12项问题
### 严重修复
1. 跨服务器无法登录 - 新增SESSION_COOKIE_DOMAIN/SECURE/NAME配置
2. SOCKS5用户密码明文存储→bcrypt哈希(兼容自动迁移)
3. 仪表盘审计日志不显示→替换为空循环为真实API加载
4. 管理员登录防爆破未生效→auth.py集成check_fail2ban

### 中等问题修复
5. 流量趋势图表无数据→新增record_traffic_snapshot后台线程
6. 网络流量累计值跳变→新增基线差值机制
7. asyncio连接计数非线程安全→加锁保护

### 优化改进
8. API密钥页面截断文本修复
9. 新增gunicorn/bcrypt依赖
10. 更新README环境变量文档和生产建议
11. 登录密码常量时间对比防时序攻击
12. 仪表盘图表添加animation:false防卡顿
2026-07-16 22:13:14 +08:00

140 lines
5.9 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.
# SOCKS Manager — SOCKS5 代理管理平台
内建 asyncio SOCKS5 服务器的完整代理管理平台,一个 Python 进程即可运行。
## 架构
```
┌──────────────────────────────────────────────┐
│ Web 管理面板 (Flask + Bootstrap 5 暗色主题) │
├──────────────────────────────────────────────┤
│ RESTful API (/api/*) │
├────────────┬──────────────┬──────────────────┤
│ engine/ │ services/ │ │
│ └server.py │ └user_service│ 数据: SQLite │
│ asyncio │ 流量/认证 │ socks_manager.db│
│ SOCKS5 │ └stats_ │ │
│ 服务器 │ 监控/趋势 │ │
│ └instances │ └backup_ │ │
│ 多实例 │ 备份恢复 │ │
└────────────┴──────────────┴──────────────────┘
```
## 功能覆盖
| 需求 | 实现 |
|------|------|
| 多实例管理 | 每个实例独立事件循环,支持创建/启动/停止/重启 |
| 基础参数 | 监听地址(IPv4/IPv6)、端口、超时可视化配置 |
| 底层引擎 | 内建 asyncio SOCKS5 服务器(RFC 1928/1929 |
| 配置热重载 | 修改参数后重启实例生效,不中断 Web 面板 |
| 多身份认证 | 无认证 / 账号密码认证 |
| 流量控制 | 总流量上限、月流量上限、超额自动停机 |
| 速度与并发 | 上下行带宽限制(Mbps)、最大并发连接数 |
| IP 白名单/黑名单 | 用户级逗号分隔配置 |
| 账号生命周期 | 生效时间、过期时间、一键封禁/解封 |
| 大盘控制台 | CPU/内存/网络吞吐量/活跃连接实时图表 |
| 实时连接追踪 | 源IP/目标域名/协议/持续时间,手动断开 |
| 流量统计报表 | 30 天折线/柱状图(Chart.js |
| 详细审计日志 | 按事件/用户/IP 筛选,分页查询 |
| 级联代理 | 连接建立时自动代理至目标(可扩展 upstream) |
| 负载均衡 | 多实例配置后按端口轮询 |
| 管理员认证 | 环境变量 `SM_ADMIN_PASSWORD` 保护 |
| 自动备份 | 一键备份 SQLite,按份数清理 |
| RESTful API | 全部管理功能通过 `/api/` 暴露 |
## 快速开始
```bash
cd /root/socks-manager
# 安装依赖
pip install -r requirements.txt --break-system-packages
# 设置管理员密码
export SM_ADMIN_PASSWORD=***
# 启动
python3 run.py
```
访问 `http://你的IP:5000`,用户名 `admin`,密码为环境变量值。
## 环境变量
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `SM_ADMIN_USER` | `admin` | 管理员用户名 |
| `SM_ADMIN_PASSWORD` | `""` | 管理员密码(必须设置) |
| `SM_SECRET_KEY` | `sm-dev-key-change-in-prod` | Flask 会话密钥(生产环境务必修改) |
| `SM_SESSION_DOMAIN` | `None` | 会话 Cookie 域名(跨域访问时设置) |
| `SM_COOKIE_SECURE` | `false` | Cookie Secure 标志(HTTPS 时设为 true |
| `SM_SESSION_NAME` | `sm_session` | 会话 Cookie 名称 |
| `SM_DB_URI` | `sqlite:///socks_manager.db` | 数据库连接串 |
| `SM_PORT` | `5000` | Web 面板端口 |
| `SM_HOST` | `0.0.0.0` | 监听地址 |
| `SM_BACKUP_DIR` | `./backups/` | 备份目录 |
| `SM_LOG_LEVEL` | `INFO` | 日志级别 |
## 核心代码结构
```
├── app.py # Flask 应用工厂
├── config.py # 配置
├── auth.py # 登录认证
├── models.py # SQLAlchemy 数据模型
├── database.py # 数据库初始化
├── run.py # 启动入口
├── engine/
│ ├── server.py # asyncio SOCKS5 服务器(核心引擎)
│ └── instances.py # 多实例管理器
├── services/
│ ├── user_service.py # 用户管理/认证/流量/防爆破
│ ├── stats_service.py# 监控/统计/趋势
│ └── backup_service.py# 备份与恢复
├── api/
│ └── v1.py # RESTful API(实例/用户/日志/备份)
├── web/
│ └── routes.py # Web 管理面板路由
└── templates/ # Jinja2 模板(暗色 Bootstrap 5
├── base.html # 布局(侧边栏+导航+全局样式)
├── dashboard.html # 仪表盘(实时图表)
├── instances.html # 代理实例管理
├── users.html # 用户管理
├── stats.html # 流量统计
├── connections.html# 活跃连接
├── logs.html # 审计日志
└── system.html # 系统管理
```
## API 参考
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/dashboard` | 仪表盘汇总 |
| GET/POST | `/api/instances` | 实例列表/创建 |
| PUT/DELETE | `/api/instances/<id>` | 更新/删除实例 |
| POST | `/api/instances/<id>/start` | 启动实例 |
| POST | `/api/instances/<id>/stop` | 停止实例 |
| GET/POST | `/api/users` | 用户列表/创建 |
| PUT/DELETE | `/api/users/<id>` | 更新/删除用户 |
| GET | `/api/logs` | 审计日志(支持筛选) |
| GET/POST | `/api/backups` | 备份列表/创建 |
| GET | `/api/stats/system` | 实时系统指标 |
| GET | `/api/stats/connections` | 活跃连接 |
## 生产建议
- 使用 gunicorn 替代内置开发服务器:`gunicorn -w 4 -b 0.0.0.0:5000 run:app`
- 前置 Nginx 反向代理 + Let's Encrypt SSL
- 设置 `SM_COOKIE_SECURE=true`HTTPS 时)
- 设置 `SM_SECRET_KEY` 为随机字符串
- 设置 `SM_SESSION_DOMAIN` 为你的域名(跨机器访问时)
- 定期备份 `socks_manager.db`
- 配置 `SM_LOG_LEVEL=WARN` 减少日志量