跨平台反向代理工具,支持 TCP、UDP、HTTP、WebSocket 四种协议转发。单二进制、零依赖,带 CLI 和 Web UI。
curl -fsSL https://raw.githubusercontent.com/schovest/rproxy/main/scripts/install.sh | sh自动检测最新版本,下载对应平台的二进制到 ~/.local/bin/rproxy。再次运行即为升级——已是最新版则自动跳过。
前往 Releases 页面,选择对应平台的二进制文件:
| 文件 | 平台 |
|---|---|
rproxy-linux-amd64 | Linux x86_64 |
rproxy-linux-arm64 | Linux ARM64 |
rproxy-darwin-amd64 | macOS Intel |
rproxy-darwin-arm64 | macOS Apple Silicon |
rproxy-windows-amd64.exe | Windows x86_64 |
rproxy-windows-arm64.exe | Windows 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-servermake test# go test -count=1 ./...
make test-race # go test -race -count=1 ./...
make vet # go vet ./...复制示例配置:
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"./rproxy run -c config.toml输出:
rproxy daemon started, control: 0.0.0.0:9527
守护进程会在前台运行,监听所有配置的本地端口和 IPC 控制端口。按 Ctrl+C 发送 SIGINT 优雅关闭。
守护进程运行后,使用 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-sshCLI 通过读取 PID 文件自动发现守护进程的 IPC 地址。如果 PID 文件不可用,默认连接 127.0.0.1:9527。
# 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,包含:
- 规则管理 — 增删、暂停、恢复规则,支持搜索和协议过滤
- 监控面板 — 实时连接数、流量统计
- 日志查看 — 实时日志流,按级别/规则/关键词过滤
- 系统设置 — 守护进程信息、配置导入导出、主题切换
| 字段 | 默认值 | 说明 |
|---|---|---|
control_addr | 127.0.0.1:9527 | IPC 控制地址,CLI 和 UI 通过此地址与守护进程通信 |
pid_file | 空 | PID 文件路径,写入进程 PID 和控制地址,用于 CLI 自动发现 |
| 字段 | 必填 | 说明 |
|---|---|---|
name | 是 | 规则名称,全局唯一 |
local_addr | 是 | 本地监听地址,如 0.0.0.0:8080 |
protocol | 是 | 协议:tcp / udp / http / ws |
remote_addr | L4 必填 | 远端目标地址(TCP/UDP),如 192.168.1.1:22,支持域名 |
upstream | L7 必填 | 上游 URL(HTTP/WS),如 https://example.com 或 wss://ws.example.com |
验证规则:
- TCP/UDP:必须指定
remote_addr,不能指定upstream - HTTP/WS:必须指定
upstream(合法 URL + 正确 scheme),不能指定remote_addr mode字段已废弃(忽略并打印警告)
透明字节流转发。接受本地连接,建立到 remote_addr 的远端连接,双向 io.Copy 转发。remote_addr 中的域名由 Go net.Dial 自动解析。
数据包转发。每个客户端源地址对应一个独立的上游会话,上游响应按源地址路由回客户端。上游读取超时 60 秒,超时后清理会话。
基于 net/http/httputil.ReverseProxy 的反向代理。本地明文 HTTP 监听,转发到 upstream 指定的 URL(支持 http:// 和 https://)。自动重写 Host 头和请求路径。
基于 nhooyr.io/websocket 的反向代理。接受本地 ws:// 连接,代理到远端 ws:// 或 wss:// 端点,双向消息中继。
守护进程通过 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_addr 或 upstream |
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":[...]}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 | /ws | WebSocket 实时日志流 |
添加规则:
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
| 包 | 用途 |
|---|---|
github.com/BurntSushi/toml | TOML 配置解析 |
github.com/spf13/cobra | CLI 框架 |
nhooyr.io/websocket | WebSocket 代理 + UI 实时日志 |
github.com/wailsapp/wails/v3 | 桌面 UI 框架(间接依赖,仅桌面模式需要) |
| 包 | 用途 |
|---|---|
svelte ^5.55 | UI 框架 |
tailwindcss ^4.3 | CSS 框架 |
vite ^8.0 | 构建工具 |
@wailsio/runtime ^3.0 | Wails JS 运行时(桌面模式) |
| 目标 | 说明 |
|---|---|
make / make all | 交叉编译全部 6 个平台 |
make build | 编译当前平台 |
make linux | Linux amd64 + arm64 |
make windows | Windows amd64 + arm64 |
make darwin | macOS amd64 + arm64 |
make test | 运行测试 |
make test-race | 竞态检测测试 |
make vet | 静态分析 |
make build-frontend | 构建前端资源 |
make build-ui | Wails 桌面模式构建 |
make build-ui-server | Wails Web 模式构建 |
make dev-ui | Wails 桌面开发模式 |
make dev-ui-server | Wails Web 开发模式 |
make clean | 清理构建产物 |