轻量级内网穿透工具,使用 Rust 构建。
RustProxy 是一个轻量、高性能的内网穿透工具,类似于 frp,但更简洁易用。它由服务端(Server)和客户端(Client)两部分组成,通过加密隧道建立安全连接,将内网服务暴露到公网。
┌─────────────────────────────────────────────────────────────┐
│ 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(客户端连接用)http://0.0.0.0:7500auto_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 |
web.jwt_secret 独立于客户端认证 Token,避免凭证复用风险| 方法 | 路径 | 说明 |
|---|---|---|
| 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 |
| 范围端口映射 | 规划中 | 有 |
| 流量统计 | 规划中 | 有 |
MIT