Skip to content

wy414012/RustProxy

Repository files navigation

RustProxy

轻量级内网穿透工具,使用 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 职责

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 时)

第二步:通过 Web 面板添加代理规则

打开浏览器访问 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 响应不泄漏数据库细节或版本信息

Web 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 获取在线客户端列表

创建/更新/删除代理规则后,服务端自动通知关联客户端,实时生效。

与 frp 的对比

特性 RustProxy frp
语言 Rust Go
二进制大小 ~5MB ~15MB
内存占用 ~5MB ~30MB
代理规则管理 服务端 Web 面板集中管理 客户端配置文件
配置复杂度 客户端极简(仅连接信息) 较多选项
Web 面板 内置 内置
加密通信 TLS(默认开启) 可选 TLS
远程端口映射 有(Relay)
流量统计
范围端口映射 规划中

在 CNB 云原生开发环境中使用

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 面板添加代理规则

在服务端 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 服务)
  • 范围端口映射

License

MIT

About

rust版内网穿透

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors