轻量级内网穿透工具,使用 Rust 构建。
RustProxy 是一个轻量、高性能的内网穿透工具,类似于 frp,但更简洁易用。它由服务端(Server)和客户端(Client)两部分组成,通过加密隧道建立安全连接,将内网服务暴露到公网。
- 多协议支持 — TCP / UDP / HTTP / HTTPS 全协议穿透
- Web 管理面板 — 服务端内置 Web UI,可视化管理端口映射,代理规则集中管理
- 加密隧道 — 服务端与客户端之间基于 TLS + Token 的双向认证,自动生成自签证书
- 轻量高效 — 基于 Rust + Tokio 异步运行时,极低资源占用,单二文件部署
- 配置极简 — 客户端仅配置服务端地址和 Token,代理规则由 Web 面板统一管理
- 动态管理 — 运行时通过 Web 面板增删改代理规则,实时生效,无需重启
┌─────────────────────────────────────────────────────────────┐
│ RustProxy Server │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Web UI │ │ Proxy Listener│ │ TLS Tunnel │ │
│ │ (管理面板)│ │ (公网端口监听) │ │ (加密隧道+认证) │ │
│ └─────┬────┘ └──────┬───────┘ └──────────┬───────────┘ │
│ │ │ │ │
│ ┌─────┴──────────────┴──────────────────────┘ │
│ │ Core Runtime (Tokio) + SQLite │
│ └───────────────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────┘
│
TLS + Token 隧道
│
┌─────────────────────────────────────────────────────────────┐
│ RustProxy Client │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Proxy Worker│ │ TLS Tunnel │ 客户端无需配置代理规则 │
│ │ (本地代理) │ │ (加密隧道) │ 认证后自动接收服务端 │
│ └──────┬───────┘ └──────┬───────┘ 下发的代理规则 │
│ │ │ │
│ ┌──────┴─────────────────┘ │
│ │ Core Runtime (Tokio) │
│ └───────────────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────┘
1. 客户端连接服务端,发送 Auth(携带 client_id + token)
2. 服务端认证成功后,推送该 client_id 的所有代理规则(ServerAssignProxy)
3. 服务端为 TCP/UDP 代理规则创建公网端口监听器
4. 外部用户访问服务端公网端口 → 服务端通知客户端建立工作连接(NewWorkConn)
5. 客户端连接本地服务,建立双向数据转发
数据流:
外部用户 ──▶ 服务端公网端口 ──▶ Proxy Listener ──▶ TLS 隧道 ──▶ 客户端 ──▶ 本地服务
rustproxy/
├── Cargo.toml # Workspace 根配置
├── README.md
├── LICENSE
├── configs/
│ ├── server.toml # 服务端配置模板
│ └── client.toml # 客户端配置模板
└── crates/
├── core/ # 核心共享库
│ └── Cargo.toml
├── proto/ # 通信协议定义
│ └── Cargo.toml
├── server/ # 服务端
│ └── Cargo.toml
├── client/ # 客户端
│ └── Cargo.toml
└── web/ # Web 管理面板前端
└── Cargo.toml
| Crate | 说明 |
|---|---|
rustproxy-core |
共享基础设施:配置解析、日志、错误处理、代理规则管理、SQLite 持久化 |
rustproxy-proto |
通信协议:消息定义、序列化/反序列化、帧编解码 |
rustproxy-server |
服务端:隧道监听、公网端口监听、工作连接桥接、Web API、证书管理 |
rustproxy-client |
客户端:隧道连接、本地代理转发、工作连接管理、心跳保活 |
rustproxy-web |
Web 管理面板:REST API、嵌入式前端资源,编译进服务端二进制 |
# 从源码编译(需要 Rust 工具链)
git clone https://cnb.cool/emchaye/RustProxy.git
cd rustproxy
cargo build --release
# 编译产物位于 target/release/
# - rustproxy-server
# - rustproxy-client# 编辑配置文件
vim configs/server.toml
# 启动服务端
./rustproxy-server -c configs/server.toml服务端启动后:
- 隧道端口 默认监听
0.0.0.0:7000(客户端连接用) - Web 面板 默认监听
http://0.0.0.0:7500 - 自签证书 首次启动自动生成并保存(
auto_cert = true时)
打开浏览器访问 http://your-server-ip:7500,登录后添加代理规则:
| 字段 | 说明 | 示例 |
|---|---|---|
| 名称 | 代理规则唯一标识 | ssh |
| 类型 | 代理协议 | tcp |
| 客户端 ID | 关联的客户端标识 | my-server |
| 本地地址 | 客户端本地服务 IP | 127.0.0.1 |
| 本地端口 | 客户端本地服务端口 | 22 |
| 远程端口 | 服务端暴露的公网端口(TCP/UDP) | 6000 |
重要:代理规则由服务端集中管理,客户端无需任何代理配置。服务端创建规则后自动开启公网端口监听。
# 编辑配置文件(仅需服务端连接信息)
vim configs/client.toml
# 启动客户端
./rustproxy-client -c configs/client.toml客户端连接成功后,自动接收服务端下发的代理规则,开始转发流量。
服务端配置 configs/server.toml:
[server]
bind_addr = "0.0.0.0"
bind_port = 7000 # 隧道监听端口
token = "CHANGE_ME_TO_A_RANDOM_SECRET" # ⚠️ 生产环境必须修改!
[web]
enable = true
bind_addr = "0.0.0.0"
bind_port = 7500 # Web 管理面板端口
user = "admin"
password = "CHANGE_ME_STRONG_PASSWORD" # ⚠️ 必须修改!支持明文或 bcrypt 哈希
# 生成哈希: ./rustproxy-server hash-password 你的密码
jwt_secret = "" # JWT 签名密钥,独立于 server.token(⚠️ 生产环境建议显式设置随机密钥)
# 留空则启动时自动生成,重启后已登录用户需重新登录
# token_expire_hours = 24 # JWT Token 过期时间(小时),默认 24
# cors_origins = [] # 允许访问面板的外部网站,留空=只有直接访问面板地址才有效
[tls]
auto_cert = true # 自动生成自签证书
cert_file = "certs/server.crt"
key_file = "certs/server.key"客户端配置 configs/client.toml(极简,仅需连接信息):
[client]
id = "my-server" # 客户端唯一标识(Web 面板创建规则时关联此 ID)
server_addr = "your-server-ip" # 服务端地址
server_port = 7000 # 服务端隧道端口
token = "CHANGE_ME_TO_A_RANDOM_SECRET" # 必须与服务端一致
# ca_cert = "certs/ca.crt" # ⚠️ 生产环境推荐:拷贝服务端证书启用标准 TLS 验证
# server_name = "proxy.example.com" # 正式 CA 证书时必须设置为证书绑定的域名注意:客户端不需要配置任何代理规则!所有代理规则通过 Web 面板管理,客户端认证后自动接收。
生产环境 TLS 建议:将服务端
certs/server.crt拷贝到客户端并配置ca_cert,启用标准 TLS 证书验证,防止中间人攻击。使用正式 CA 证书时还需配置server_name为证书域名。ca_cert留空则会跳过证书验证,仅适用于开发/测试环境。
| 类型 | 说明 | 配置要点 |
|---|---|---|
tcp |
TCP 端口映射,支持 SSH、数据库等任意 TCP 服务 | 需指定 remote_port(服务端公网端口) |
udp |
UDP 端口映射,支持 DNS、游戏等 UDP 服务 | 需指定 remote_port |
http |
HTTP 代理,基于域名路由,多域名复用同一端口 | 需指定 custom_domains |
https |
HTTPS 代理,服务端终止 TLS,后端连接本地 HTTP 服务 | 需指定 custom_domains |
- TLS 加密隧道 — 服务端与客户端之间所有流量通过 TLS 加密传输,支持自签证书自动生成或用户指定证书
- Token 鉴权 — 客户端连接时需携带与服务器一致的 Token,常量时间比较防止时序攻击
- JWT 认证 — Web 面板使用 JWT(HS256 签名 + 过期时间),签名密钥
web.jwt_secret独立于客户端认证 Token,避免凭证复用风险 - 帧大小限制 — 通信协议单帧最大 64 MiB,拒绝超大帧并断开连接,防止恶意客户端触发内存耗尽攻击
- 密码安全 — 支持 bcrypt 哈希存储密码,登录失败限速(5 次/用户/5 分钟锁定)
- 输入验证 — API 所有字段(名称、IP、端口、域名、协议类型)均做服务端校验
- CORS 防护 — 默认仅允许同源访问,可配置白名单域名
- 错误脱敏 — 内部错误详情仅写日志,API 响应不泄漏数据库细节或版本信息
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/auth/login |
登录获取 Token |
| GET | /api/proxies |
获取所有代理规则 |
| GET | /api/proxies/:name |
获取单个代理规则 |
| POST | /api/proxies |
创建代理规则 |
| PUT | /api/proxies/:name |
更新代理规则 |
| DELETE | /api/proxies/:name |
删除代理规则 |
| GET | /api/clients |
获取在线客户端列表 |
创建/更新/删除代理规则后,服务端自动通知关联客户端,实时生效。
| 特性 | RustProxy | frp |
|---|---|---|
| 语言 | Rust | Go |
| 二进制大小 | ~5MB | ~15MB |
| 内存占用 | ~5MB | ~30MB |
| 代理规则管理 | 服务端 Web 面板集中管理 | 客户端配置文件 |
| 配置复杂度 | 客户端极简(仅连接信息) | 较多选项 |
| Web 面板 | 内置 | 内置 |
| 加密通信 | TLS(默认开启) | 可选 TLS |
| 范围端口映射 | 规划中 | 有 |
| 流量统计 | 规划中 | 有 |
- 项目架构设计
- 核心通信协议定义(帧编解码 + 控制消息 + 数据消息)
- TLS 隧道建立与 Token 认证
- 自签证书自动生成
- Web 管理面板(代理规则 CRUD + 在线客户端查看)
- Web API(REST + JWT 鉴权)
- TCP 代理支持(公网监听 + 工作连接 + 双向数据转发)
- UDP 代理支持(工作连接隧道传输 UDP 数据包)
- HTTP 代理支持(共享端口,基于 Host 头域名路由)
- HTTPS 代理支持(共享端口,SNI 路由 + TLS 终止)
- 流量统计(实时字节级入站/出站统计)
- 运行时动态管理代理规则(创建/更新/删除实时生效)
MIT