一个基于 Python Flask 和 WebSocket 实现的轻量级堡垒机系统,提供 SSH 会话管理和 Web 终端访问能力。
- 🔐 用户认证 - 简单的用户名认证机制
- 🖥️ 服务器管理 - 支持添加、编辑、删除目标服务器
- 🔌 SSH 连接 - 通过 SSH 协议连接到远程服务器
- 🌐 Web 终端 - 基于 WebSocket 的实时终端访问
- 📊 会话审计 - 记录用户会话和操作历史
- 🔑 多认证方式 - 支持密码认证和密钥认证(预留接口)
- 后端框架: Flask + Flask-SQLAlchemy
- 实时通信: WebSocket (websockets)
- SSH 连接: Paramiko
- 数据库: SQLite
- 跨域支持: Flask-CORS
┌─────────────────┐ HTTP API ┌─────────────┐
│ Web 前端 │ ◄──────────────► │ Flask App │
│ (smn 项目) │ │ (Port 5001) │
│ │ └──────┬──────┘
│ │ │
│ │ WebSocket │
│ │ ◄────────────────────────► │
└─────────────────┘ ┌──────▼──────┐
│ WebSocket │
│ (Port 5002) │
└──────┬──────┘
│ SSH
┌─────▼─────┐
│ Target │
│ Servers │
└───────────┘
📌 前端说明:本项目的 Web 终端界面由 SMN 项目 托管提供。SMN 是一个功能完善的 Web 文件管理工具,支持用户认证、文件操作和代理功能,与本跳板机后端配合使用可提供完整的堡垒机解决方案。
- Python 3.8+
- pip
- Git(用于克隆前端项目)
使用提供的 _set.sh 脚本自动安装所有依赖:
chmod +x _set.sh
./_set.sh该脚本会自动完成:
- 检查 Python 环境
- 安装 Python 依赖包(flask, flask-cors, flask-sqlalchemy, paramiko, websockets)
- 创建必要的目录结构
- 初始化数据库
使用 _run.sh 脚本启动服务:
chmod +x _run.sh
./_run.sh服务启动后会显示:
============================================================
堡垒机后端启动成功
HTTP API: http://localhost:5001
WebSocket: ws://localhost:5002
============================================================
如果自动脚本失败,可以手动执行:
# 安装依赖
pip install flask flask-cors flask-sqlalchemy paramiko websockets
# 启动服务
python jump_server.py| 变量名 | 说明 | 默认值 |
|---|---|---|
SECRET_KEY |
Flask 会话密钥 | bastion-secret-key-change-in-production |
| 服务 | 端口 | 说明 |
|---|---|---|
| HTTP API | 5001 | RESTful API 服务 |
| WebSocket | 5002 | WebSocket 终端服务 |
POST /api/auth/login
Content-Type: application/json
{
"username": "admin"
}响应:
{
"message": "登录成功",
"user": {
"username": "admin",
"is_admin": true
}
}POST /api/auth/logoutGET /api/auth/meGET /api/serversPOST /api/servers
Content-Type: application/json
{
"name": "生产服务器",
"host": "192.168.1.100",
"port": 22,
"username": "root",
"password": "your_password",
"description": "生产环境主服务器"
}GET /api/servers/{server_id}PUT /api/servers/{server_id}
Content-Type: application/json
{
"name": "新名称",
"host": "新IP"
}DELETE /api/servers/{server_id}GET /api/sessionsGET /api/sessions/{session_id}ws://localhost:5002
所有消息均为 JSON 格式。
{
"type": "connect_server",
"server_id": 1,
"username": "admin",
"cols": 120,
"rows": 40
}{
"type": "command",
"session_id": "uuid-string",
"command": "ls -la\n"
}{
"type": "resize",
"session_id": "uuid-string",
"cols": 120,
"rows": 40
}{
"type": "disconnect_server",
"session_id": "uuid-string"
}{
"type": "output",
"session_id": "uuid-string",
"data": "command output here..."
}{
"type": "connected",
"session_id": "uuid-string",
"message": "连接成功"
}{
"type": "error",
"message": "错误描述"
}| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| name | String(100) | 服务器名称 |
| host | String(255) | 主机地址 |
| port | Integer | SSH 端口 |
| username | String(80) | 登录用户名 |
| password | String(255) | 登录密码(加密存储) |
| ssh_key | Text | SSH 密钥(预留) |
| description | Text | 描述信息 |
| created_at | DateTime | 创建时间 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| username | String(80) | 用户名 |
| server_id | Integer | 关联服务器 ID |
| session_id | String(100) | 会话唯一标识 |
| start_time | DateTime | 会话开始时间 |
| end_time | DateTime | 会话结束时间 |
| commands | Text | 命令记录(JSON 格式) |
| ip_address | String(45) | 客户端 IP |
⚠️ 生产环境部署前请注意:
- 修改默认密钥:务必设置环境变量
SECRET_KEY为强密码 - 密码存储:当前密码以明文存储,生产环境应使用加密存储
- CORS 配置:当前允许所有来源,生产环境应限制具体域名
- 认证机制:当前为简化认证,生产环境建议集成 OAuth/LDAP
- 会话审计:建议启用更详细的命令审计功能
- 网络隔离:WebSocket 和 HTTP 服务应配置防火墙规则
.
├── jump_server.py # 主程序文件
├── _set.sh # 环境安装脚本
├── _run.sh # 服务启动脚本
├── bastion.db # SQLite 数据库(运行时生成)
└── README.md # 项目文档
自动完成以下任务:
- 检查 Python 3.8+ 环境
- 升级 pip 到最新版本
- 安装所有必需的 Python 包
- 验证安装是否成功
- 检查依赖是否已安装
- 启动 HTTP API 服务(端口 5001)
- 启动 WebSocket 服务(端口 5002)
- 显示服务状态信息
本跳板机后端需要配合 SMN 项目 的前端界面使用。SMN 提供了完整的 Web 终端界面和用户管理功能。
-
克隆 SMN 项目
git clone https://github.com/gopsc/smn.git cd smn -
配置 SMN 代理
编辑 SMN 项目的
config.ini文件,添加跳板机 API 的代理配置:[proxy] enabled = true allowed_targets = http://localhost:5001,ws://localhost:5002
-
启动 SMN 前端
./_run.sh # SMN 项目的前端启动脚本 -
启动跳板机后端
cd /path/to/jump-server ./_run.sh -
访问 Web 终端
打开浏览器访问 SMN 前端地址(默认
http://localhost:5000),通过代理功能连接到跳板机后端。
- 支持 SSH 密钥认证
- 增加用户角色和权限管理
- 实现命令黑白名单过滤
- 添加会话录像功能
- 支持 RDP 协议
- 集成 LDAP/OAuth 认证
- 完善 Web 管理界面
- 支持多租户隔离
检查防火墙是否开放 5002 端口,确认 WebSocket 服务正常启动。
- 确认目标服务器 SSH 服务正常运行
- 检查网络连通性
- 验证用户名和密码是否正确
SQLite 并发写入能力有限,生产环境建议迁移到 PostgreSQL 或 MySQL。
- 确认 Python 版本 >= 3.8
- 检查是否有管理员权限(某些系统需要 sudo)
- 手动执行
pip install flask flask-cors flask-sqlalchemy paramiko websockets
编辑 jump_server.py 文件,找到 app.run(host='127.0.0.1', port=5001, ...) 和 serve(handle_websocket, "0.0.0.0", 5002) 修改端口号。
欢迎提交 Issue 和 Pull Request。
MIT License
- SMN - 前端 Web 管理界面和代理服务
如有问题,请提交 Issue 或联系项目维护者。