{"id":35304346,"url":"https://github.com/iamlinhui/rpt","last_synced_at":"2026-05-30T11:31:01.173Z","repository":{"id":37238300,"uuid":"465404410","full_name":"iamlinhui/rpt","owner":"iamlinhui","description":"内网穿透\u0026反向代理 (支持TCP/UDP上层协议，支持HTTP/HTTPS端口复用)","archived":false,"fork":false,"pushed_at":"2026-05-29T14:14:18.000Z","size":44418,"stargazers_count":92,"open_issues_count":0,"forks_count":28,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-05-29T16:09:19.563Z","etag":null,"topics":["dockerfile","frp","golang","gui","http2","java","javafx","netty","ngrok","openssl","protobuf","proxy","rdp","reverse-proxy","ssl","tcp","tunnel","udp","vnc","websocket"],"latest_commit_sha":null,"homepage":"https://holmes.cn","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iamlinhui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-03-02T17:28:26.000Z","updated_at":"2026-05-29T14:15:10.000Z","dependencies_parsed_at":"2025-09-25T22:18:21.596Z","dependency_job_id":null,"html_url":"https://github.com/iamlinhui/rpt","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/iamlinhui/rpt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamlinhui%2Frpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamlinhui%2Frpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamlinhui%2Frpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamlinhui%2Frpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iamlinhui","download_url":"https://codeload.github.com/iamlinhui/rpt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamlinhui%2Frpt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33691312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dockerfile","frp","golang","gui","http2","java","javafx","netty","ngrok","openssl","protobuf","proxy","rdp","reverse-proxy","ssl","tcp","tunnel","udp","vnc","websocket"],"created_at":"2025-12-30T17:00:49.807Z","updated_at":"2026-05-30T11:31:01.160Z","avatar_url":"https://github.com/iamlinhui.png","language":"Java","funding_links":[],"categories":["网络编程"],"sub_categories":["Spring Cloud框架"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"rpt\" height=\"120\" src=\"doc/rpt.png\" width=\"120\"/\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eRPT - Reverse Proxy Tool\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e一个高性能的内网穿透工具，将局域网个人电脑、服务器代理映射到公网\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/version-2.6.1-blue.svg\" alt=\"version\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-green.svg\" alt=\"license\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Java-8+-orange.svg\" alt=\"java\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Go-1.20+-00ADD8.svg\" alt=\"go\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Netty-4.1-red.svg\" alt=\"netty\"/\u003e\n\u003c/p\u003e\n\n---\n\n## 📖 目录\n\n- [项目简介](#-项目简介)\n- [功能特性](#-功能特性)\n- [项目架构](#-项目架构)\n- [使用场景](#-使用场景)\n- [快速开始](#-快速开始)\n- [GUI 桌面客户端](#-gui-桌面客户端)\n- [配置详解](#-配置详解)\n- [部署指南](#-部署指南)\n- [Dashboard 管理面板](#-dashboard-管理面板)\n- [Go 客户端](#-go-客户端)\n- [SSL 证书](#-ssl-证书)\n- [常见问题](#-常见问题)\n- [Star History](#-star-history)\n\n---\n\n## 🚀 项目简介\n\n**RPT (Reverse Proxy Tool)** 是一款基于 Netty 的内网穿透工具，通过在公网服务器与内网客户端之间建立安全隧道，将内网服务暴露到公网，实现外部访问。\n\n### 工作原理\n\n```mermaid\nsequenceDiagram\n    participant U as 🌐 外部用户\n    participant S as 🖥️ rpt-server (公网)\n    participant C as 💻 rpt-client (内网)\n    participant L as 🏠 内网服务\n\n    Note over C,S: 1️⃣ 建立连接阶段\n    C-\u003e\u003eS: SSL 双向认证握手\n    S-\u003e\u003eS: 验证客户端证书 + Token\n    S--\u003e\u003eC: 认证通过，隧道建立\n    C-\u003e\u003eS: 上报端口映射配置 (TCP/UDP/HTTP)\n    S-\u003e\u003eS: 绑定公网端口 \u0026 注册域名路由\n\n    Note over U,L: 2️⃣ TCP/UDP 代理流程\n    U-\u003e\u003eS: 连接公网 remotePort (如 4389)\n    S-\u003e\u003eS: 匹配端口映射规则 \u0026 IP地域过滤\n    S-\u003e\u003eC: 通过 SSL 隧道转发请求\n    C-\u003e\u003eL: 连接本地服务 localIp:localPort (如 127.0.0.1:3389)\n    L--\u003e\u003eC: 返回响应数据\n    C--\u003e\u003eS: 通过 SSL 隧道回传\n    S--\u003e\u003eU: 返回给外部用户\n\n    Note over U,L: 3️⃣ HTTP 代理流程 (端口复用)\n    U-\u003e\u003eS: HTTP 请求 test.domain.com:80\n    S-\u003e\u003eS: 解析 Host 域名路由 \u0026 Basic Auth 验证\n    S-\u003e\u003eC: 通过 SSL 隧道转发 HTTP 请求\n    C-\u003e\u003eL: 转发到本地 Web 服务 (如 127.0.0.1:8080)\n    L--\u003e\u003eC: 返回 HTTP 响应\n    C--\u003e\u003eS: 通过 SSL 隧道回传\n    S--\u003e\u003eU: 返回 HTTP 响应\n\n    Note over U,L: 4️⃣ 连接保活\n    loop 心跳检测\n        C-\u003e\u003eS: 心跳包\n        S--\u003e\u003eC: 心跳响应\n    end\n```\n\n```mermaid\ngraph TB\n    subgraph \"公网服务器 rpt-server\"\n        S[\"rpt-server\u003cbr/\u003eNetty 服务端\"]\n        S --\u003e TCP_BIND[\"TCP 端口监听\u003cbr/\u003eremotePort: 4389, 7379...\"]\n        S --\u003e UDP_BIND[\"UDP 端口监听\u003cbr/\u003eremotePort: 4389...\"]\n        S --\u003e HTTP_BIND[\"HTTP/HTTPS 端口复用\u003cbr/\u003e80 / 443\"]\n        HTTP_BIND --\u003e ROUTE[\"域名路由\u003cbr/\u003eHost → 客户端映射\"]\n        S --\u003e AUTH[\"Token 授权\u003cbr/\u003e端口范围限制\"]\n        S --\u003e GEO[\"IP 地域过滤\u003cbr/\u003eMaxMind GeoIP\"]\n        S --\u003e DASH[\"Dashboard 管理面板\u003cbr/\u003e流量统计 / 流速监控\"]\n        S --\u003e SSL_S[\"SSL 双向认证\"]\n    end\n\n    subgraph \"SSL 加密隧道\"\n        TUNNEL[\"🔒 加密数据通道\u003cbr/\u003eProtostuff 序列化\"]\n    end\n\n    subgraph \"内网环境 rpt-client\"\n        C[\"rpt-client\u003cbr/\u003eNetty / Go 客户端\"]\n        C --\u003e P1[\"代理连接池\"]\n        P1 --\u003e RDP[\"远程桌面\u003cbr/\u003e127.0.0.1:3389\"]\n        P1 --\u003e SSH[\"SSH 服务\u003cbr/\u003e127.0.0.1:22\"]\n        P1 --\u003e WEB[\"Web 应用\u003cbr/\u003e127.0.0.1:8080\"]\n        P1 --\u003e DB[\"数据库\u003cbr/\u003e127.0.0.1:3306\"]\n        P1 --\u003e OTHER[\"其他服务\u003cbr/\u003eFTP/SMTP/打印机...\"]\n    end\n\n    SSL_S \u003c--\u003e TUNNEL\n    TUNNEL \u003c--\u003e C\n```\n\n---\n\n## ✨ 功能特性\n\n| 特性 | 说明 |\n|------|------|\n| 🔌 **TCP 代理** | 支持任何 TCP 上层协议：RDP远程桌面、SSH、FTP、数据库连接等 |\n| 📡 **UDP 代理** | 支持任何 UDP 上层协议：DNS转发、游戏服务器代理等 |\n| 🌐 **HTTP 端口复用** | 多个客户端共用服务端 80/443 端口，通过域名区分路由 |\n| 🔒 **SSL 双向认证** | 客户端与服务端双向 SSL 验证，数据加密传输 |\n| 🌍 **IP 地域过滤** | 基于 MaxMind GeoIP 数据库限制访问来源国家 |\n| 🔑 **Token 授权** | 每个客户端独立密钥，可限制端口绑定范围 |\n| ⬆️ **协议升级** | HTTP 请求支持升级为 WebSocket、HTTP/2 |\n| 📊 **Dashboard** | 内置 Web 管理面板，实时监控在线客户端、流量统计、流速监控 |\n| ⚡ **零拷贝传输** | 基于 Netty ByteBuf retainedSlice 全链路零拷贝，堆外内存直接转发 |\n| 🔄 **断线自动重连** | 客户端指数退避自动重连 + 心跳保活，网络波动后自动恢复隧道 |\n| 🖥️ **桌面客户端** | 提供 GUI 桌面客户端，开箱即用 |\n| 🐳 **Docker 部署** | 提供 Docker 镜像，一键启动 |\n| 🐹 **Go 客户端** | 轻量级 Go 实现，无需 JVM 环境 |\n\n---\n\n## 🏗️ 项目架构\n\n```\nrpt/\n├── rpt-base/          # 基础模块 - 公共协议、编解码、工具类\n├── rpt-server/        # 服务端 (Java) - 部署在公网服务器\n├── rpt-client/        # 客户端 (Java) - 部署在内网机器\n├── rpt-client-go/     # 客户端 (Go) - 轻量级Go实现\n├── rpt-desktop/       # 桌面客户端 (JavaFX)\n├── rpt-desktop-go/    # 桌面客户端 (Wails + Go)\n└── doc/               # 文档资源\n```\n\n### 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 服务端 | Java 8+, Netty 4.1, Protostuff |\n| Java 客户端 | Java 8+, Netty 4.1 |\n| Go 客户端 | Go 1.20+ |\n| 桌面客户端 | Wails (Go + Web前端) |\n| 序列化 | Protostuff |\n| 配置文件 | YAML (SnakeYAML / Jackson) |\n| 日志 | Logback |\n| IP 地域库 | MaxMind GeoIP2 |\n| 构建工具 | Maven / Go Modules |\n\n---\n\n## 🎯 使用场景\n\n- **远程桌面** — 在外网通过 RDP 远程连接公司/家中电脑\n- **Web 开发调试** — 本地支付接口回调调试、微信公众号/小程序本地调试\n- **SSH 远程访问** — 远程连接内网 Linux 服务器\n- **数据库连接** — 远程连接内网 MySQL、Redis 等数据库\n- **HTTP 反向代理** — 共享 80/443 端口为多个内网 Web 服务提供公网访问\n- **DNS 转发** — UDP 代理实现 DNS 请求转发\n- **游戏联机** — 代理游戏服务器实现公网联机\n- **打印机共享** — 远程连接内网打印机\n\n---\n\n## ⚡ 快速开始\n\n### 前置条件\n\n| 组件 | 要求 |\n|------|------|\n| 公网服务器 | 一台具有公网 IP 的服务器 |\n| Java 客户端 | JDK/JRE 8+ |\n| Go 客户端 | 无需额外运行环境 (独立二进制) |\n| 服务端 | JDK/JRE 8+ |\n\n### 第一步：编译构建\n\n```bash\n# 克隆项目\ngit clone https://github.com/iamlinhui/rpt.git\ncd rpt\n\n# 构建 Java 服务端和客户端\nmvn clean package -Dmaven.test.skip=true\n\n# 构建 Go 客户端 (可选)\ncd rpt-client-go\ngo build -o rpt-client-go\n```\n\n### 第二步：部署服务端\n\n将 `rpt-server/target/rpt-server-*.jar` 和 `server.yml` 上传到公网服务器：\n\n```bash\njava -jar rpt-server-2.6.1.jar -c server.yml\n```\n\n### 第三步：启动客户端\n\n**Java 客户端：**\n\n```bash\njava -jar rpt-client-2.6.1.jar -c client.yml\n```\n\n**Go 客户端：**\n\n```bash\n./rpt-client-go -config client.yml\n```\n\n### 第四步：验证连接\n\n客户端启动后会自动连接服务端并注册端口映射。例如配置了 `localPort: 3389 → remotePort: 4389`，则可以通过 `公网IP:4389` 访问内网的 3389 端口服务。\n\n---\n\n## 🖥️ GUI 桌面客户端\n\n提供基于 Wails 的图形界面客户端，无需手动编辑配置文件。\n\n| 界面 | 截图 |\n|------|------|\n| 主界面 | ![main](doc/desktop/go/main.png) |\n| 系统配置 | ![config](doc/desktop/go/config.png) |\n| TCP 映射配置 | ![tcp](doc/desktop/go/tcp.png) |\n| HTTP 映射配置 | ![http](doc/desktop/go/http.png) |\n| 删除映射配置 | ![delete](doc/desktop/go/delete.png) |\n| 控制台输出 | ![start](doc/desktop/go/start.png) |\n\n### 编译桌面客户端\n\n```bash\ncd rpt-desktop-go\nwails build\n```\n\n编译后的可执行文件在 `build/bin/` 目录下。\n\n---\n\n## 📝 配置详解\n\n### 服务端配置 `server.yml`\n\n```yaml\n# 服务端绑定IP (0.0.0.0表示监听所有网卡)\nserverIp: 0.0.0.0\n\n# 服务端与客户端通讯端口\nserverPort: 6167\n\n# 服务端CA证书路径 (默认ca.crt)\nserverCaPath: ca.crt\n\n# 服务端证书路径 (默认server.crt)\nserverCertPath: server.crt\n\n# 服务端私钥路径 (默认pkcs8_server.key)\nserverKeyPath: pkcs8_server.key\n\n# HTTP重定向端口 (为0则不开启，默认0)\nhttpPort: 80\n\n# HTTPS复用端口 (为0则不开启，默认0)\nhttpsPort: 443\n\n# 域名证书公钥 (httpsPort为0时不生效)\ndomainCert: domain.crt\n\n# 域名证书私钥 (httpsPort为0时不生效)\ndomainKey: pkcs8_domain.key\n\n# 是否限制连接暴露端口的IP必须在当前地区国家 (默认false)\nipFilter: true\n\n# Dashboard管理面板端口 (为0则不开启，默认0)\ndashboardPort: 8000\n\n# Dashboard登录账号\ndashboardUser: admin\n\n# Dashboard登录密码\ndashboardPassword: admin\n\n# 客户端授权Token列表\ntoken:\n  - clientKey: b0cc39c7-1b78-4ff6-9486-020399f569e9\n    minPort: 4000    # 允许绑定的最小端口 (默认1024)\n    maxPort: 8000    # 允许绑定的最大端口 (默认65535)\n  - clientKey: 4befea7e-a61c-4979-b012-47659bab6f21\n    minPort: 9000\n    maxPort: 9999\n```\n\n#### 服务端配置参数说明\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `serverIp` | String | `0.0.0.0` | 服务端绑定的IP地址 |\n| `serverPort` | int | `6167` | 服务端与客户端通讯端口 |\n| `serverCaPath` | String | `ca.crt` | 服务端CA证书路径 |\n| `serverCertPath` | String | `server.crt` | 服务端证书路径 |\n| `serverKeyPath` | String | `pkcs8_server.key` | 服务端私钥路径 |\n| `httpPort` | int | `0` | HTTP重定向端口，为0不开启 |\n| `httpsPort` | int | `0` | HTTPS复用端口，为0不开启 |\n| `domainCert` | String | `server.crt` | 域名证书公钥路径 |\n| `domainKey` | String | `pkcs8_server.key` | 域名证书私钥路径 |\n| `ipFilter` | boolean | `false` | 是否启用IP地域过滤 |\n| `dashboardPort` | int | `0` | Dashboard管理面板端口，为0不开启 |\n| `dashboardUser` | String | - | Dashboard登录账号 |\n| `dashboardPassword` | String | - | Dashboard登录密码 |\n| `token[].clientKey` | String | - | 客户端授权密钥 (UUID) |\n| `token[].minPort` | int | `1024` | 允许绑定的最小端口号 |\n| `token[].maxPort` | int | `65535` | 允许绑定的最大端口号 |\n\n### 客户端配置 `client.yml`\n\n```yaml\n# 服务端IP (公网服务器IP或域名)\nserverIp: 123.45.67.89\n\n# 服务端通讯端口 (与server.yml的serverPort一致)\nserverPort: 6167\n\n# 客户端CA证书路径 (默认ca.crt)\nclientCaPath: ca.crt\n\n# 客户端证书路径 (默认client.crt)\nclientCertPath: client.crt\n\n# 客户端私钥路径 (默认pkcs8_client.key)\nclientKeyPath: pkcs8_client.key\n\n# 授权密钥 (与server.yml中token列表对应)\nclientKey: b0cc39c7-1b78-4ff6-9486-020399f569e9\n\n# 端口映射配置列表\nconfig:\n  # TCP代理示例：远程桌面\n  - proxyType: TCP\n    localIp: 127.0.0.1\n    localPort: 3389\n    remotePort: 4389\n    description: rdp-tcp\n\n  # UDP代理示例：远程桌面UDP\n  - proxyType: UDP\n    localIp: 127.0.0.1\n    localPort: 3389\n    remotePort: 4389\n    description: rdp-udp\n\n  # TCP代理示例：Redis\n  - proxyType: TCP\n    localIp: 127.0.0.1\n    localPort: 6379\n    remotePort: 7379\n    description: redis\n\n  # HTTP代理示例：Web应用\n  - proxyType: HTTP\n    localIp: 127.0.0.1\n    localPort: 8080\n    domain: test.domain.com       # 访问域名\n    token: admin:admin            # Basic认证 (可选)\n    description: tomcat\n```\n\n#### 客户端配置参数说明\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `serverIp` | String | 服务端公网IP或域名 |\n| `serverPort` | int | 服务端通讯端口 |\n| `clientCaPath` | String | 客户端CA证书路径（默认 `ca.crt`） |\n| `clientCertPath` | String | 客户端证书路径（默认 `client.crt`） |\n| `clientKeyPath` | String | 客户端私钥路径（默认 `pkcs8_client.key`） |\n| `clientKey` | String | 客户端授权密钥 |\n| `config[].proxyType` | String | 代理类型：`TCP` / `UDP` / `HTTP` |\n| `config[].localIp` | String | 内网目标服务IP |\n| `config[].localPort` | int | 内网目标服务端口 |\n| `config[].remotePort` | int | 服务端暴露端口 (TCP/UDP模式) |\n| `config[].domain` | String | 访问域名 (HTTP模式，支持 `*.domain.com` 通配符) |\n| `config[].token` | String | HTTP Basic 认证 `用户名:密码` (可选) |\n| `config[].description` | String | 映射描述信息 |\n\n### 三种代理类型对比\n\n| 类型 | 协议 | 端口 | 域名 | 适用场景 |\n|------|------|------|------|----------|\n| **TCP** | TCP | 需要指定 `remotePort` | 不需要 | RDP、SSH、数据库、FTP 等 |\n| **UDP** | UDP | 需要指定 `remotePort` | 不需要 | DNS转发、游戏服务器 等 |\n| **HTTP** | HTTP/HTTPS | 复用服务端 80/443 端口 | 需要配置 `domain` | Web应用、API接口 等 |\n\n---\n\n## 📦 部署指南\n\n### 方式一：直接运行 (推荐快速体验)\n\n```bash\n# 服务端\njava -jar rpt-server-2.6.1.jar -c server.yml\n\n# 客户端\njava -jar rpt-client-2.6.1.jar -c client.yml\n```\n\n### 方式二：生产环境部署 (Java)\n\n\u003e 在 jar 包的当前目录下，新建 `conf` 文件夹，将配置文件和证书放入其中。\n\n#### 目录结构\n\n```\n/opt/rpt-server/\n├── rpt-server-2.6.1.jar\n├── conf/\n│   ├── server.yml\n│   ├── ca.crt\n│   ├── server.crt\n│   ├── pkcs8_server.key\n│   ├── domain.crt          # HTTPS域名证书 (可选)\n│   ├── pkcs8_domain.key    # HTTPS域名私钥 (可选)\n│   └── Country.mmdb        # GeoIP数据库 (可选)\n└── logs/\n\n/opt/rpt-client/\n├── rpt-client-2.6.1.jar\n├── conf/\n│   ├── client.yml\n│   ├── ca.crt\n│   ├── client.crt\n│   └── pkcs8_client.key\n└── logs/\n```\n\n#### 启动脚本 `start.sh`\n\n```bash\njava -server -d64 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600 \\\n     -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Duser.country=CN \\\n     -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xbootclasspath/a:./conf \\\n     -jar rpt*.jar \u003e /dev/null 2\u003e\u00261 \u0026 echo $! \u003e pid.file \u0026\n```\n\n#### 停止脚本 `stop.sh`\n\n```bash\nkill $(cat pid.file)\n```\n\n### 方式三：Docker 部署\n\n#### rpt-server\n\n```bash\n# 1. 构建镜像\ncd rpt-server\nmvn clean package -Dmaven.test.skip=true\ndocker build -f Dockerfile -t rpt-server .\n\n# 2. 准备配置文件目录\nmkdir -p /opt/rpt/conf\n# 将 server.yml、ca.crt、server.crt、pkcs8_server.key 放入 /opt/rpt/conf/\n# 如需 HTTPS: 放入 domain.crt、pkcs8_domain.key\n# 如需 IP 过滤: 放入 Country.mmdb\n\n# 3. 启动容器 (host 网络模式，直接暴露所有端口)\ndocker run -d \\\n  --network host \\\n  -v /opt/rpt/conf:/home/rpt/conf \\\n  --restart=always \\\n  --name rpt-server \\\n  rpt-server\n\n# 或者指定端口映射\ndocker run -d \\\n  -p 6167:6167 \\\n  -p 80:80 \\\n  -p 443:443 \\\n  -p 8000:8000 \\\n  -p 4000-9999:4000-9999 \\\n  -v /opt/rpt/conf:/home/rpt/conf \\\n  --restart=always \\\n  --name rpt-server \\\n  rpt-server\n```\n\n#### rpt-client (Java)\n\n```bash\n# 1. 构建镜像\ncd rpt-client\nmvn clean package -Dmaven.test.skip=true\ndocker build -f Dockerfile -t rpt-client .\n\n# 2. 准备配置文件目录\nmkdir -p /opt/rpt/conf\n# 将 client.yml、ca.crt、client.crt、pkcs8_client.key 放入 /opt/rpt/conf/\n\n# 3. 启动容器\ndocker run -d \\\n  --network host \\\n  -v /opt/rpt/conf:/home/rpt/conf \\\n  --restart=always \\\n  --name rpt-client \\\n  rpt-client\n```\n\n#### rpt-client-go\n\n```bash\n# 1. 构建镜像\ncd rpt-client-go\ndocker build -f Dockerfile -t rpt-client-go .\n\n# 2. 准备配置文件目录\nmkdir -p /opt/rpt/conf\n# 将 client.yml、ca.crt、client.crt、pkcs8_client.key 放入 /opt/rpt/conf/\n\n# 3. 启动容器\ndocker run -d \\\n  --network host \\\n  -v /opt/rpt/conf:/home/rpt/conf \\\n  --restart=always \\\n  --name rpt-client-go \\\n  rpt-client-go\n```\n\n\u003e **提示**：客户端使用 `--network host` 模式时可直接访问宿主机的本地服务（如 127.0.0.1:3389）。若不使用 host 模式，`localIp` 需改为宿主机的 Docker 网桥 IP（通常为 `172.17.0.1`）或使用 `host.docker.internal`。\n\n#### 使用 Docker Hub 镜像（免构建）\n\n```bash\n# rpt-server\ndocker run -d --network host -v /opt/rpt/conf:/home/rpt/conf --restart=always --name rpt-server promptness/rpt-server:2.6.1\n\n# rpt-client (Java)\ndocker run -d --network host -v /opt/rpt/conf:/home/rpt/conf --restart=always --name rpt-client promptness/rpt-client:2.6.1\n\n# rpt-client-go\ndocker run -d --network host -v /opt/rpt/conf:/home/rpt/conf --restart=always --name rpt-client-go promptness/rpt-client-go:2.6.1\n```\n\nDocker Hub 镜像地址：\n- https://hub.docker.com/r/promptness/rpt-server\n- https://hub.docker.com/r/promptness/rpt-client\n- https://hub.docker.com/r/promptness/rpt-client-go\n\n### 方式四：注册 Linux 系统服务\n\n#### Go 客户端 systemd 服务\n\n创建 `/etc/systemd/system/rpt-client-go.service`：\n\n```ini\n[Unit]\nDescription=RPT Client Go\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=/opt/rpt\nExecStart=/opt/rpt/rpt-client-go -config client.yml\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n```\n\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable rpt-client-go\nsudo systemctl start rpt-client-go\nsudo systemctl status rpt-client-go\n```\n\n#### Java 客户端 systemd 服务\n\n创建 `/etc/systemd/system/rpt-client.service`：\n\n```ini\n[Unit]\nDescription=RPT Client Java\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=/opt/rpt-client\nExecStart=/usr/bin/java -server -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600 -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xbootclasspath/a:./conf -jar rpt-client-2.6.1.jar\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n```\n\n### 方式五：注册 Windows 服务\n\n1. 下载 [WinSW](https://github.com/winsw/winsw/releases)，将 `WinSW-x64.exe` 重命名为 `rpt-client.exe`\n2. 与 `rpt-client.jar` 放在同一目录\n3. 创建 `rpt-client.xml`：\n\n```xml\n\u003cservice\u003e\n    \u003cid\u003erpt-client\u003c/id\u003e\n    \u003cname\u003erpt-client\u003c/name\u003e\n    \u003cdescription\u003eRPT Client - Reverse Proxy Tool\u003c/description\u003e\n    \u003cexecutable\u003ejava\u003c/executable\u003e\n    \u003carguments\u003e-server -d64 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600 -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Duser.country=CN -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xbootclasspath/a:./conf -jar rpt-client.jar\u003c/arguments\u003e\n\u003c/service\u003e\n```\n\n4. 执行注册：\n\n```cmd\nrpt-client.exe install\nrpt-client.exe start\n```\n\n---\n\n## 📊 Dashboard 管理面板\n\n服务端内置 Web Dashboard，提供实时监控和管理功能。\n\n### 开启方式\n\n在 `server.yml` 中配置 `dashboardPort` 为非零端口即可：\n\n```yaml\ndashboardPort: 8000\ndashboardUser: admin\ndashboardPassword: admin\n```\n\n启动服务端后访问 `http://服务器IP:8000`，输入账号密码即可进入。\n\n### 功能\n\n| 功能 | 说明 |\n|------|------|\n| **服务状态** | 运行时间、在线客户端数、历史连接数 |\n| **客户端列表** | 查看所有在线客户端的 ClientKey、远程地址、连接时间、代理端口 |\n| **流量统计** | 每个客户端的入站/出站总流量 |\n| **实时流速** | 基于 5 秒滑动窗口的入站/出站实时流速 |\n| **域名绑定** | 查看 HTTP 代理的域名路由和在线状态 |\n| **踢出客户端** | 一键断开指定客户端连接 |\n| **自动刷新** | 页面每 5 秒自动刷新数据 |\n| **响应式布局** | 支持 PC 和移动端访问 |\n\n### REST API\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| GET | `/api/status` | 服务状态 |\n| GET | `/api/clients` | 在线客户端列表 |\n| DELETE | `/api/clients/{id}` | 踢出指定客户端 |\n| GET | `/api/domains` | HTTP 域名绑定列表 |\n\n---\n\n## 🐹 Go 客户端\n\n使用 Go 语言实现的轻量级客户端，功能与 Java 客户端一致，适合不便安装 JVM 的环境。\n\n### 命令行参数\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `-config` | `client.yml` | 客户端配置文件路径 |\n\n\u003e 证书路径已移至 `client.yml` 配置文件中（`clientCaPath`、`clientCertPath`、`clientKeyPath`），不配置则使用默认值。\n\n### 编译\n\n```bash\ncd rpt-client-go\ngo build -o rpt-client-go\n```\n\n### 交叉编译\n\n```bash\n# Linux amd64\nGOOS=linux GOARCH=amd64 go build -o rpt-client-go\n\n# Linux arm64 (树莓派等)\nGOOS=linux GOARCH=arm64 go build -o rpt-client-go\n\n# Windows\nGOOS=windows GOARCH=amd64 go build -o rpt-client-go.exe\n\n# macOS (Intel)\nGOOS=darwin GOARCH=amd64 go build -o rpt-client-go\n\n# macOS (Apple Silicon)\nGOOS=darwin GOARCH=arm64 go build -o rpt-client-go\n```\n\n---\n\n## 🔐 SSL 证书\n\nRPT 使用 SSL 双向认证确保通讯安全。项目自带测试用证书，**生产环境请务必替换**。\n\n### 证书生成流程\n\n\u003e 自建CA → 生成服务端/客户端私钥 → 生成CSR → 签发x509证书 → PKCS#8编码\n\n#### 1. 安装 OpenSSL\n\n- Linux: `apt install openssl` 或 `yum install openssl`\n- Windows: 下载 [Win32OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)\n- macOS: `brew install openssl`\n\n#### 2. 建立 CA\n\n```bash\nopenssl req -new -x509 -keyout ca.key -out ca.crt -days 36500\n```\n\n#### 3. 生成私钥\n\n```bash\n# 服务端\nopenssl genrsa -des3 -out server.key 1024\n\n# 客户端\nopenssl genrsa -des3 -out client.key 1024\n```\n\n#### 4. 生成 CSR\n\n```bash\n# 服务端\nopenssl req -new -key server.key -out server.csr\n\n# 客户端\nopenssl req -new -key client.key -out client.csr\n```\n\n\u003e ⚠️ 如果生成 `server.csr` 后再生成 `client.csr` 提示错误，请关闭当前终端重新打开执行。\n\n#### 5. 签发证书\n\n```bash\n# 服务端\nopenssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt\n\n# 客户端\nopenssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt\n```\n\n#### 6. PKCS#8 编码\n\n```bash\n# 服务端\nopenssl pkcs8 -topk8 -in server.key -out pkcs8_server.key -nocrypt\n\n# 客户端\nopenssl pkcs8 -topk8 -in client.key -out pkcs8_client.key -nocrypt\n```\n\n### 证书分发\n\n| 端 | 所需文件 |\n|----|----------|\n| **Server** | `ca.crt`、`server.crt`、`pkcs8_server.key` |\n| **Client** | `ca.crt`、`client.crt`、`pkcs8_client.key` |\n\n\u003e ⚠️ Server 和 Client 使用同一个 `ca.crt`，即由同一 CA 签发。\n\n---\n\n## 🔄 更新 IP 地域库\n\n服务端支持基于 MaxMind GeoIP 数据库的 IP 地域过滤功能。\n\n下载地址：\n- [MaxMind GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data)\n- [Loyalsoldier/geoip](https://github.com/Loyalsoldier/geoip/releases)\n- [Dreamacro/maxmind-geoip](https://github.com/Dreamacro/maxmind-geoip/releases)\n\n将下载的 `Country.mmdb` 放入服务端的 `conf` 文件夹中。\n\n---\n\n## ❓ 常见问题\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 客户端连接不上服务端？\u003c/b\u003e\u003c/summary\u003e\n\n1. 检查服务端防火墙是否开放 `serverPort` 端口（默认 6167）\n2. 检查 `client.yml` 中 `serverIp` 和 `serverPort` 是否正确\n3. 检查 `clientKey` 是否与服务端 `token` 列表匹配\n4. 检查 SSL 证书是否由同一 CA 签发\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: TCP 端口映射后无法访问？\u003c/b\u003e\u003c/summary\u003e\n\n1. 检查服务端防火墙是否开放 `remotePort` 对应端口\n2. 检查 `remotePort` 是否在服务端 token 配置的 `minPort` ~ `maxPort` 范围内\n3. 检查内网目标服务是否正常运行\n4. 如果启用了 `ipFilter`，确认访问者 IP 所在国家是否匹配\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: HTTP 代理如何配置域名？\u003c/b\u003e\u003c/summary\u003e\n\n1. 将域名 DNS 解析到公网服务器 IP（A 记录）\n2. 支持通配符域名 `*.domain.com`，例如 `test.domain.com`\n3. 客户端 `client.yml` 中 `domain` 字段填写完整域名\n4. 服务端需开启 `httpPort` 或 `httpsPort`\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: JavaFX 桌面客户端界面变黑？\u003c/b\u003e\u003c/summary\u003e\n\nJavaFX 硬件渲染在屏幕分辨率变化时可能出现控件变黑问题，添加 JVM 参数启用软件渲染：\n\n```bash\n-Dprism.order=sw\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eQ: 如何使用 HTTPS？\u003c/b\u003e\u003c/summary\u003e\n\n1. 申请域名 SSL 证书（如 Let's Encrypt）\n2. 将证书公钥和私钥（PKCS#8 格式）放入服务端 `conf` 目录\n3. 在 `server.yml` 中配置 `httpsPort`、`domainCert`、`domainKey`\n\u003c/details\u003e\n\n---\n\n## 📋 支持的 TCP 上层协议\n\n| 协议 | 用途 |\n|------|------|\n| HTTP/HTTPS | Web 浏览 |\n| FTP | 文件传输 |\n| SSH | 安全远程登录 |\n| RDP | 远程桌面 |\n| SMTP/POP3 | 邮件收发 |\n| Telnet | 远程登录 |\n| SOCKS | 代理协议 |\n\n---\n\n## 📋 TODO\n\n- [x] Dashboard 管理面板（流量统计、流速监控、客户端管理）\n- [ ] 集群运维版本\n\n---\n\n## ⭐ Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=iamlinhui/rpt\u0026type=Date)](https://star-history.com/#iamlinhui/rpt\u0026Date)\n\n---\n\n## 📄 License\n\n[MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamlinhui%2Frpt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiamlinhui%2Frpt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamlinhui%2Frpt/lists"}