Skip to content

Repository files navigation

rproxy

跨平台反向代理工具,支持 TCP、UDP、HTTP、WebSocket 四种协议转发。单二进制、零依赖,带 CLI 和 Web UI。

ReleaseLicense: MITGo


安装

一键安装 / 升级

curl -fsSL https://raw.githubusercontent.com/schovest/rproxy/main/scripts/install.sh | sh

自动检测最新版本,下载对应平台的二进制到 ~/.local/bin/rproxy。再次运行即为升级——已是最新版则自动跳过。

手动下载

前往 Releases 页面,选择对应平台的二进制文件:

文件平台
rproxy-linux-amd64Linux x86_64
rproxy-linux-arm64Linux ARM64
rproxy-darwin-amd64macOS Intel
rproxy-darwin-arm64macOS Apple Silicon
rproxy-windows-amd64.exeWindows x86_64
rproxy-windows-arm64.exeWindows ARM64
chmod +x rproxy
sudo mv rproxy /usr/local/bin/

功能特性

  • 四协议支持 — TCP/UDP (L4 透传) + HTTP/WS (L7 反向代理)
  • 运行时管理 — 无需重启,动态增删、暂停、恢复转发规则
  • Web UI — Svelte 5 图形界面,实时日志流、连接统计、规则管理
  • 桌面模式 — 支持 Wails v3 原生窗口(可选)
  • IPC 控制 — JSON-line TCP 协议,CLI 与守护进程通信
  • 插件接口OnConnect / OnData / OnClose 钩子,可扩展
  • 内置日志 — 环形缓冲区 (1000 条) + 发布/订阅实时推送
  • 跨平台 — Linux / macOS / Windows,amd64 + arm64

快速开始

前置要求

  • Go 1.26+
  • (可选) Node.js 18+ — 构建 Web UI 前端
  • (可选) Wails v3 CLI — 桌面模式开发/构建

编译

# 当前平台
go build -o rproxy ./cmd/rproxy/
# 或使用 Makefile(当前平台)
make build
# 全平台交叉编译(6 个目标)
make
# 单独平台
make linux-amd64
make windows-arm64
make darwin-arm64

构建产物输出到 build/ 目录,命名规则同下载安装。版本和 commit 通过 -ldflags 注入:

VERSION=$(git describe --tags --dirty --always)
COMMIT=$(git rev-parse --short HEAD)
go build -ldflags "-s -w -X main.version=$VERSION -X main.commit=$COMMIT" -o rproxy ./cmd/rproxy/

构建前端

# 仅构建前端资源(不需要 Wails)
make build-frontend
# 等价于: cd frontend && npm run build# Wails 桌面模式构建(需要 wails3 CLI)
make build-ui
# Wails 桌面模式开发
make dev-ui
# Web-only 模式开发(需要 wails3 CLI)
make dev-ui-server

测试

make test# go test -count=1 ./...
make test-race # go test -race -count=1 ./...
make vet # go vet ./...

使用方法

1. 编写配置文件

复制示例配置:

cp config.example.toml config.toml

编辑 config.toml

[server]
control_addr = "0.0.0.0:9527"# IPC 控制地址pid_file = "/tmp/rproxy.pid"# PID 文件(CLI 自动发现守护进程)# TCP 转发(域名自动解析)
[[rules]]
name = "ssh-proxy"local_addr = "0.0.0.0:2222"remote_addr = "192.168.1.100:22"protocol = "tcp"# UDP 转发
[[rules]]
name = "dns-forward"local_addr = "0.0.0.0:5353"remote_addr = "8.8.8.8:53"protocol = "udp"# HTTP 反向代理(本地明文 -> 远端 HTTPS)
[[rules]]
name = "google-proxy"local_addr = "0.0.0.0:8080"upstream = "https://www.google.com"protocol = "http"# WebSocket 反向代理(本地 WS -> 远端 WSS)
[[rules]]
name = "ws-proxy"local_addr = "0.0.0.0:9090"upstream = "wss://echo.example.com/ws"protocol = "ws"

2. 启动守护进程

./rproxy run -c config.toml

输出:

rproxy daemon started, control: 0.0.0.0:9527

守护进程会在前台运行,监听所有配置的本地端口和 IPC 控制端口。按 Ctrl+C 发送 SIGINT 优雅关闭。

3. CLI 命令

守护进程运行后,使用 CLI 命令管理:

# 查看所有规则
./rproxy list
# 查看守护进程状态
./rproxy status
# 添加 TCP 规则
./rproxy add my-ssh --local 127.0.0.1:3333 --remote 10.0.0.1:22 --proto tcp
# 添加 HTTP 规则
./rproxy add my-api --local 127.0.0.1:9000 --upstream https://api.example.com --proto http
# 暂停规则
./rproxy remove my-ssh

CLI 通过读取 PID 文件自动发现守护进程的 IPC 地址。如果 PID 文件不可用,默认连接 127.0.0.1:9527

4. 启动 Web UI

# Web 模式(浏览器访问)
./rproxy ui --web-only --listen 0.0.0.0:9528 -c config.toml
# 桌面模式(原生窗口,需 Wails 构建)
./rproxy ui -c config.toml

浏览器打开 http://<host>:9528 即可使用 Web UI,包含:

  • 规则管理 — 增删、暂停、恢复规则,支持搜索和协议过滤
  • 监控面板 — 实时连接数、流量统计
  • 日志查看 — 实时日志流,按级别/规则/关键词过滤
  • 系统设置 — 守护进程信息、配置导入导出、主题切换

配置详解

[server]

字段默认值说明
control_addr127.0.0.1:9527IPC 控制地址,CLI 和 UI 通过此地址与守护进程通信
pid_filePID 文件路径,写入进程 PID 和控制地址,用于 CLI 自动发现

[[rules]]

字段必填说明
name规则名称,全局唯一
local_addr本地监听地址,如 0.0.0.0:8080
protocol协议:tcp / udp / http / ws
remote_addrL4 必填远端目标地址(TCP/UDP),如 192.168.1.1:22,支持域名
upstreamL7 必填上游 URL(HTTP/WS),如 https://example.comwss://ws.example.com

验证规则:

  • TCP/UDP:必须指定 remote_addr,不能指定 upstream
  • HTTP/WS:必须指定 upstream(合法 URL + 正确 scheme),不能指定 remote_addr
  • mode 字段已废弃(忽略并打印警告)

协议说明

TCP (L4)

透明字节流转发。接受本地连接,建立到 remote_addr 的远端连接,双向 io.Copy 转发。remote_addr 中的域名由 Go net.Dial 自动解析。

UDP (L4)

数据包转发。每个客户端源地址对应一个独立的上游会话,上游响应按源地址路由回客户端。上游读取超时 60 秒,超时后清理会话。

HTTP (L7)

基于 net/http/httputil.ReverseProxy 的反向代理。本地明文 HTTP 监听,转发到 upstream 指定的 URL(支持 http://https://)。自动重写 Host 头和请求路径。

WebSocket (L7)

基于 nhooyr.io/websocket 的反向代理。接受本地 ws:// 连接,代理到远端 ws://wss:// 端点,双向消息中继。

IPC 协议

守护进程通过 TCP 上的 JSON-line 协议接受控制命令。每条消息一行 JSON,响应也是一行 JSON。

请求格式

{"type": "<command>", "name": "...", "local_addr": "...", "remote_addr": "...", "upstream": "...", "protocol": "..."}

响应格式

{"type": "ok|error", "message": "...", "data": {...}}

支持的命令

type说明请求参数
ping心跳检测
add添加规则name, local_addr, protocol, remote_addrupstream
remove删除规则name
list列出所有规则
status守护进程状态
pause暂停规则name
resume恢复规则name
stats获取统计

手动示例

echo'{"type":"ping"}'| nc 127.0.0.1 9527
# {"type":"ok","message":"pong"}echo'{"type":"add","name":"test","local_addr":"0.0.0.0:9999","remote_addr":"1.2.3.4:80","protocol":"tcp"}'| nc 127.0.0.1 9527
# {"type":"ok","message":"rule added"}echo'{"type":"list"}'| nc 127.0.0.1 9527
# {"type":"ok","data":[...]}

HTTP API (Web UI)

Web UI 模式下,以下 HTTP 端点可用:

方法路径说明
GET/api/rules/list列出所有规则
POST/api/rules/add添加规则
POST/api/rules/remove删除规则
POST/api/rules/pause暂停规则
POST/api/rules/resume恢复规则
GET/api/stats/get获取统计数据
GET/api/logs/get获取日志
GET/api/system/status系统状态
GET/api/system/export-config导出配置
POST/api/system/import-config导入配置
GET/wsWebSocket 实时日志流

API 请求体示例

添加规则:

curl -X POST http://localhost:9528/api/rules/add \
-H "Content-Type: application/json" \
-d '{"name":"test","localAddr":"0.0.0.0:9999","remoteAddr":"1.2.3.4:80","protocol":"tcp"}'

删除规则:

curl -X POST http://localhost:9528/api/rules/remove \
-H "Content-Type: application/json" \
-d '{"name":"test"}'

项目结构

rproxy/
├── cmd/rproxy/main.go # CLI 入口(Cobra 命令)
├── internal/
│ ├── config/config.go # TOML 配置解析与规则验证
│ ├── daemon/
│ │ ├── daemon.go # 核心运行时:规则生命周期、统计、插件
│ │ └── ipc.go # IPC 服务端/客户端(JSON-line TCP)
│ ├── logger/
│ │ ├── logger.go # 分级日志器
│ │ └── ring.go # 环形缓冲区 + 发布/订阅
│ ├── plugin/plugin.go # 插件接口与链式调用
│ ├── proxy/
│ │ ├── tcp.go # TCP 代理引擎
│ │ ├── udp.go # UDP 代理引擎
│ │ ├── http.go # HTTP 反向代理引擎
│ │ ├── ws.go # WebSocket 代理引擎
│ │ └── stats.go # 原子计数器(连接数、字节数)
│ └── ui/
│ ├── app.go # UI 应用:资源嵌入、配置解析
│ ├── app_desktop.go # 桌面模式 (build tag: desktop)
│ ├── app_server.go # Web 模式 (build tag: !desktop)
│ ├── bindings.go # Go 服务暴露给前端
│ ├── events.go # 事件常量
│ ├── webserver.go # HTTP API + WebSocket 日志流
│ └── frontend/dist/ # 嵌入的前端构建产物
├── frontend/ # Svelte 5 前端源码
│ ├── src/
│ │ ├── App.svelte # 根布局
│ │ ├── components/ # UI 组件
│ │ ├── lib/
│ │ │ ├── api.ts # API 层(Wails 绑定 / HTTP fetch)
│ │ │ ├── theme.ts # 主题切换
│ │ │ └── stores/ # Svelte stores
│ │ └── routes/ # 页面组件
│ ├── package.json
│ └── vite.config.ts
├── config.example.toml # 示例配置
├── Makefile # 构建脚本
├── go.mod
└── go.sum

依赖

Go 直接依赖

用途
github.com/BurntSushi/tomlTOML 配置解析
github.com/spf13/cobraCLI 框架
nhooyr.io/websocketWebSocket 代理 + UI 实时日志
github.com/wailsapp/wails/v3桌面 UI 框架(间接依赖,仅桌面模式需要)

前端依赖

用途
svelte ^5.55UI 框架
tailwindcss ^4.3CSS 框架
vite ^8.0构建工具
@wailsio/runtime ^3.0Wails JS 运行时(桌面模式)

Makefile 速查

目标说明
make / make all交叉编译全部 6 个平台
make build编译当前平台
make linuxLinux amd64 + arm64
make windowsWindows amd64 + arm64
make darwinmacOS amd64 + arm64
make test运行测试
make test-race竞态检测测试
make vet静态分析
make build-frontend构建前端资源
make build-uiWails 桌面模式构建
make build-ui-serverWails Web 模式构建
make dev-uiWails 桌面开发模式
make dev-ui-serverWails Web 开发模式
make clean清理构建产物

许可证

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages