轻量级内网穿透工具,使用 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、嵌入式前端资源,编译进服务端二进制 |
无需手动下载,一条命令自动检测架构、下载最新版本、部署为 systemd 服务:
# 部署服务端
curl -sL https://cnb.cool/emchaye/RustProxy/-/git/raw/main/deploy/install-server.sh | bash
# 部署客户端
curl -sL https://cnb.cool/emchaye/RustProxy/-/git/raw/main/deploy/install-client.sh | bash
# 指定版本
curl -sL https://cnb.cool/emchaye/RustProxy/-/git/raw/main/deploy/install-server.sh | bash -s 0.1.9详细部署指南见 deploy/README.md
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 |
| 远程端口映射 | 有(Relay) | 有 |
| 流量统计 | 有 | 有 |
| 范围端口映射 | 规划中 | 有 |
在 CNB(云原生构建)的云原生开发环境中,你可以通过 RustProxy 将自己已部署服务器上的后端服务映射到开发环境内,实现开发环境直接访问远程数据库、内网 API 等服务。
┌──────────────────────────────────────────────────┐
│ CNB 云原生开发环境 │
│ ┌────────────────────────────────────────────┐ │
│ │ RustProxy Client │ │
│ │ 启动时自动接收服务端下发的代理规则 │ │
│ └──────────────────┬─────────────────────────┘ │
│ │ localhost:3306 等 │
│ ┌──────────────────┴─────────────────────────┐ │
│ │ 开发环境中的应用 │ │
│ │ 像访问本地服务一样访问远程后端 │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
│
TLS + Token 加密隧道
│
┌──────────────────────────────────────────────────┐
│ 你自己部署的 RustProxy Server │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ Web 面板 │ │ 公网端口监听 │ │
│ │ 管理代理规则 │ │ 转发流量到客户端本地端口 │ │
│ └──────────────┘ └──────────────────────────┘ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 内网服务(数据库、API 等) │ │
│ └──────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
在你的本地机器上创建 client.toml,填写你的服务端连接信息:
[client]
id = "cnb-dev-env" # 客户端标识,需在 Web 面板中创建对应的代理规则
server_addr = "your-server.example.com" # 你的服务端地址
server_port = 7000 # 服务端隧道端口
token = "your-token-here" # 与服务端一致的认证 Token
ca_cert = "" # 自签证书留空即可;正式证书请指定 CA 证书路径
server_name = "" # 正式 CA 证书时设置为证书域名将配置文件编码为单行 Base64 字符串(-w 0 确保无换行):
base64 -w 0 client.toml
# 输出类似: W2NsaWVudF0KaWQgPSAiY25iLWRldi1lbnYi...在你的 CNB 组织下创建一个密钥仓库(如 dev-key),在仓库中新建 rustproxy.yml 文件,将 Base64 编码值写入:
# rustproxy.yml — 存放在密钥仓库中
# CNB 流水线通过 imports 引用此文件后,会自动将 key-value 注入为环境变量
# 因此 $RUSTPROXY_CLIENT_CONFIG 可直接在脚本中使用
# 可选:限制只有特定仓库才能引用此密钥文件
allow_slugs: "your-org/**"
RUSTPROXY_CLIENT_CONFIG: "W2NsaWVudF0KaWQgPSAiY25iLWRldi1lbnYi..."安全提示:密钥仓库禁止
git clone到本地,所有操作仅限 Web 端,配合动态水印和审计日志确保敏感数据安全。
在你的项目仓库中编辑 .cnb.yml,通过 imports 引用密钥仓库中的文件,CNB 会自动将其中的 key-value 注入为环境变量:
$: vscode:
- docker:
image: node:20
services:
- vscode
- docker
imports:
# 引用密钥仓库中的文件,文件内的 key-value 自动注入为环境变量
- https://cnb.cool/your-org/dev-key/-/blob/main/rustproxy.yml
stages:
- name: 配置代理工具
script: |
# 一键安装 RustProxy 客户端
curl -sL https://cnb.cool/emchaye/RustProxy/-/git/raw/main/deploy/install-client.sh | bash
# 从环境变量还原配置文件(imports 自动注入 RUSTPROXY_CLIENT_CONFIG)
echo "$RUSTPROXY_CLIENT_CONFIG" | base64 -d > /home/rustproxy/client/client.toml
# 后台启动客户端
cd /home/rustproxy/client && nohup ./rustproxy-client > /dev/null 2>&1 &在服务端 Web 面板 http://your-server.example.com:7500 中,为客户端 cnb-dev-env 添加代理规则:
| 名称 | 类型 | 客户端 ID | 本地地址 | 本地端口 | 远程端口 / 域名 |
|---|---|---|---|---|---|
| mysql | tcp | cnb-dev-env | 127.0.0.1 | 3306 | 6000 |
| redis | tcp | cnb-dev-env | 127.0.0.1 | 6379 | 6001 |
| api | http | cnb-dev-env | 127.0.0.1 | 8080 | api.your-domain.com |
配置完成后,开发环境中的应用即可通过 127.0.0.1:6000 访问远程数据库等后端服务。
注意:代理规则中的「本地地址/端口」指的是开发环境中的地址。RustProxy Client 在开发环境中运行时,会将服务端公网端口收到的流量转发到客户端所在环境的本地端口。
- 项目架构设计
- 核心通信协议定义(帧编解码 + 控制消息 + 数据消息)
- TLS 隧道建立与 Token 认证
- 自签证书自动生成
- Web 管理面板(代理规则 CRUD + 在线客户端查看)
- Web API(REST + JWT 鉴权)
- TCP 代理支持(公网监听 + 工作连接 + 双向数据转发)
- UDP 代理支持(工作连接隧道传输 UDP 数据包)
- HTTP 代理支持(共享端口,基于 Host 头域名路由)
- HTTPS 代理支持(共享端口,SNI 路由 + TLS 终止)
- 流量统计(实时字节级入站/出站统计)
- 运行时动态管理代理规则(创建/更新/删除实时生效)
- 远程端口映射(Relay,将服务端端口转发到远程主机)
- 映射规则类型(Direct 直连 / Relay 远程映射)
- 一键部署脚本(自动检测架构 + 下载 + systemd 服务)
- 范围端口映射
MIT