loopy-iri/RatholeEngine

GitHub: loopy-iri/RatholeEngine

基于 rathole 与 Nginx 的多位置反向隧道编排系统,以单端口、单域名、单证书通过 URL 路径路由多个反向回连节点,专为抗审查场景设计。

Stars: 97 | Forks: 20

RatholeEngine # RatholeEngine **基于 rathole + Nginx 的多位置反向隧道系统** _一个端口 · 一个域名 · 一个证书 · 通过 URL 路径路由多个海外节点。_ _专为伊朗的抗审查隧道而构建。_ [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/loopy-iri/RatholeEngine/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/loopy-iri/RatholeEngine?sort=semver&color=7c3aed)](https://github.com/loopy-iri/RatholeEngine/releases/latest) [![License](https://img.shields.io/github/license/loopy-iri/RatholeEngine?color=blue)](LICENSE) [![Stars](https://img.shields.io/github/stars/loopy-iri/RatholeEngine?style=flat&color=16a34a)](https://github.com/loopy-iri/RatholeEngine/stargazers)
![shell](https://img.shields.io/badge/shell-bash-4EAA25?logo=gnubash&logoColor=white) ![python](https://img.shields.io/badge/python-stdlib%20only-3776AB?logo=python&logoColor=white) ![tunnel](https://img.shields.io/badge/tunnel-rathole%20%2B%20nginx-7c3aed) [**English**](#what-is-this) · [**فارسی**](docs/README.fa.md) · [**完整 Wiki**](https://github.com/loopy-iri/RatholeEngine/wiki) · [快速开始](#quick-start) · [文档](#documentation) · [Telegram](https://t.me/l8PY4NET)
## 目录 - [这是什么](#what-is-this) - [三种角色](#three-roles) - [传输模式](#transport-modes) - [快速开始](#quick-start) - [更新与回滚](#update--rollback) - [文档](#documentation) - [仓库结构](#repository-layout) - [خلاصه‌ی فارسی](#خلاصهی-فارسی) ## 这是什么 一台 **伊朗服务器** —— 在一个域名、一个 Let's Encrypt 证书、一个公共端口 `443` 之后 —— 作为多个通过反向隧道连接回来的**海外节点**的前端。用户流量**根据 URL 路径**路由到相应节点(在 nginx 中使用 `map $uri $backend_port`)。伊朗服务器上仅暴露 `:443` 端口;海外节点不使用任何公共端口。 ![架构](https://raw.githubusercontent.com/loopy-iri/RatholeEngine/main/docs/assets/architecture.svg) ## 三种角色 | 角色 | 程序 | 职责 | |------|---------|----------------| | **伊朗面板** | [`rathole-manager/ratholectl`](rathole-manager/ratholectl) (bash) | rathole **server** + nginx。管理节点清单。生成 `server.toml` + `rathole.conf`。 | | **海外节点** | [`rathole-manager/ratholenode`](rathole-manager/ratholenode) (bash) | rathole **client**。生成 `client.toml`。 | | **Hub** | [`rathole-manager/ratholehub/hub.py`](rathole-manager/ratholehub/hub.py) (Python, 仅使用标准库) | 通过 SSH 驱动多台服务器的中央 Web 面板。 | 所有地方的核心设计原则:**变更状态 → 重新生成配置 → 验证 → 热重载**。配置绝不手动编辑;它们会在原处重写(保留 inode),因此 rathole 可以在不中断活动隧道的情况下进行热重载,并且在 `nginx -t` 失败时会自动回滚。 ## 传输模式 同一隧道可以通过**五种**方式(外加一种游戏/SNI L4 模式)进行承载——切换传输方式永远不会改变用户服务、token 或路径,只会改变载体。每个节点的载体是**独占**的:hub 将其公开为单个选项(`ws`/`kcp`/`plain`/`noise`/`backhaul`),以此来协调两端。 ![传输模式](https://raw.githubusercontent.com/loopy-iri/RatholeEngine/main/docs/assets/transport-modes.svg) - **websocket + TLS**(默认)—— `wss://domain:443`,TLS 由 nginx 终结。 - **kcp** —— 用于丢包链路的并行 UDP+FEC 路径(看起来像 UDP/443 上的 QUIC)。 - **plain** —— 连接到独立 HTTP 监听器的无 TLS websocket(更轻量,未加密)。 - **noise** —— 在第二个 rathole 实例上的加密传输(Noise/X25519),无 TLS/证书。 - **backhaul** *(v1.6)* —— rathole 旁边的一个独立的 Go 核心(`Musixal/Backhaul`),它通过 **SMUX** 将许多用户连接多路复用到一个流上;nginx 将硬编码的 `/channel` + `/tunnel` 路径代理到同一个 443 端口,从而保持单端口/单域名。 - **游戏 / SNI** —— 443 端口上的 L4 直通;TLS 在节点上终结(VLESS+TLS+Vision)。 - **自适应故障转移** *(v1.5.0)* —— 定时探测器对每个载体进行分类(`healthy / tls_failed / tcp_timeout / …`),并在 ws 和 kcp 之间自动切换,带有迟滞和冷却机制;使用 plain 需要显式设置 `ALLOW_INSECURE=1`。 - **秘密控制路径** *(v1.5.0)* —— WebSocket 控制路径从 `/` 升级为 `/_rh/<32 hex>`;nginx 仅将该确切路径路由到 rathole;所有其他路径保留伪装网站行为。 详情:[`docs/transport-modes.md`](docs/transport-modes.md)。 ## 快速开始 **GitHub 上的一条命令**(下载最新的发布包,然后运行安装程序)。默认使用 `loopy-iri/RatholeEngine` —— 使用 `RATHOLE_GH` 覆盖以使用其分支: ``` # 完全交互式(询问 panel/node 及详细信息) curl -fsSL https://raw.githubusercontent.com/loopy-iri/RatholeEngine/main/install.sh | sudo bash # Iran 服务器 (panel),非交互式: curl -fsSL https://raw.githubusercontent.com/loopy-iri/RatholeEngine/main/install.sh | sudo bash -s -- --panel \ --domain panel.example.ir \ --fullchain /root/cert/panel.example.ir/fullchain.pem \ --key /root/cert/panel.example.ir/privkey.pem # 外部 node,非交互式: curl -fsSL https://raw.githubusercontent.com/loopy-iri/RatholeEngine/main/install.sh | sudo bash -s -- --node -- \ --server panel.example.ir:443 --name trk01 --token --inbound-port 2087 ``` 离线 / 本地包(无需下载)依然可以通过直接运行 `bootstrap.sh` 来使用 —— 参见 [`docs/README.fa.md`](docs/README.fa.md)。 然后从伊朗面板添加节点: ``` ratholectl hub on # enable hub on port ratholectl add trk01 2087 # → path /trk01 routed to that node ratholectl proxy add mysvc http://127.0.0.1:9000 # /mysvc/ → any upstream, no rathole involved ratholectl ls # list nodes + user paths ratholectl status # full dashboard: domain, ports, cert, services, nodes (--json for the hub) ratholectl paths # every config/file path with a ✓/✗ ratholectl version # manager_version + rathole_version ratholectl doctor # health check ``` `ratholectl add` 还会打印一条可直接粘贴的 `curl … | sudo bash -s -- --node -- …` 单行命令,用于海外节点,其中已自动填充 token/inbound。 **从 hub 中**,您可以无需 CLI 即可驱动所有这些操作:**全部更新** 会逐一在每台服务器上执行更新(带有进度条和每台服务器的状态,并在每台服务器上显示绿色/黄色的版本徽章),**添加到节点** 会将一个伊朗节点(名称/token/inbound)桥接到海外节点或上游,而 **设置主隧道** 会将节点连接到其伊朗服务器。 ## 更新与回滚 更新在改动任何内容之前,会将**完整快照**(CLI + 配置 + systemd 单元)存入 `/var/backups/rathole-manager/`,随后运行基于角色的**健康检查**,如果服务未能启动或 `nginx -t` 中断,则会**自动回滚**到快照。 ``` # 原地更新(自动检测 panel/node/hub;快照 + health-check + 自动回滚) curl -fsSL https://raw.githubusercontent.com/loopy-iri/RatholeEngine/main/install.sh | sudo bash -s -- --update # 或者,从已安装的目录树: sudo bash /opt/rathole-manager/update.sh sudo bash update.sh --list-backups # list snapshots sudo bash update.sh --rollback # revert to the latest snapshot sudo bash update.sh --rollback 20260713-2210 # revert to a specific one sudo bash update.sh --no-rollback # update but never auto-revert (snapshot only) ``` 完整的 CLI 参考及安装流程(波斯语):[`docs/README.fa.md`](docs/README.fa.md)。 ## 卸载 `bootstrap.sh` 会自动检测已安装的角色(面板 / 节点 / hub),并为每个角色运行匹配的卸载程序: ``` sudo bash bootstrap.sh --uninstall # remove installed roles (asks to confirm) sudo bash bootstrap.sh --purge --yes # + rathole binary and hub config, no prompt # 或直接按角色执行: sudo bash uninstall-panel.sh [--purge] [--yes] ``` TLS 证书永远不会被移除。只有当主机上没有其他角色存在时,共享的 `common.sh` 才会被移除。相同的选项是交互式 `bootstrap.sh` 菜单中的第 7 项。 ## 文档 | 文档 | 内容 | |-----|----------| | [**GitHub Wiki**](https://github.com/loopy-iri/RatholeEngine/wiki) | **完整的 GitHub Wiki**(入门、CLI 参考、自适应过滤、Hub、故障排除)。 | | [`docs/architecture.md`](docs/architecture.md) | 三种角色,状态→重新生成→重载原则,path==name==map==inbound 不变量。 | | [`docs/transport-modes.md`](docs/transport-modes.md) | 四种传输载体 + 游戏/SNI,附带图表。 | | [`docs/traffic-flow.md`](docs/traffic-flow.md) | 逐层数据包路径(Mermaid + SVG 图表)。 | | [`docs/hub.md`](docs/hub.md) | 中央 Web 面板(`hub.py` + `hubcmds.py` + `ui/`):REST API、安全模型、白名单操作。 | | [`docs/performance.md`](docs/performance.md) | 超越隧道的调优(BBR、kcp 配置、非隧道瓶颈)。 | | [`docs/amneziawg-reverse.md`](docs/amneziawg-reverse.md) | 独立的 AmneziaWG 反向隧道设计(不属于 rathole 流程的一部分)。 | | [`docs/README.fa.md`](docs/README.fa.md) | **完整的波斯语 CLI 参考 + 安装/卸载流程。** | | [`docs/install-manual.md`](docs/install-manual.md) | **完整的手动安装指南(英语):** 伊朗面板 + Pasargad 配置 + 海外节点 + hub,分步说明。 | | [`docs/install-manual.fa.md`](docs/install-manual.fa.md) | 相同的手动安装指南,**波斯语**。 | | [`rathole-multilocation-pasargad.md`](rathole-multilocation-pasargad.md) | 原始详细的设计与故障排除文档(波斯语)。 | ## 仓库结构 ``` install.sh one-command installer from GitHub (curl | sudo bash) bootstrap.sh env prep + unpack + hand-off to installer (local or --url) package.sh build the distributable rathole-manager.zip .github/workflows/ release.yml (build+publish on tag v*) · ci.yml (lint) rathole-manager/ ratholectl Iran panel CLI (rathole server + nginx) ratholenode foreign node CLI (rathole client) common.sh shared bash helpers ratholehub/hub.py central web panel (stdlib Python) — router/state/SSH/parsers ratholehub/hubcmds.py security-critical action→argv allow-list (RE_* regexes) ratholehub/ui/ web UI assets (index.html, app.css, app.js, i18n.js) install-*.sh per-role installers (panel/node/hub) update.sh safe update: snapshot + health-check + rollback uninstall-*.sh docs/ documentation + assets/ (SVG/PNG diagrams) ``` ## 波斯语摘要 `RatholeEngine` یک سیستم تونل معکوس **چند-موقعیتی** روی **rathole + Nginx** است: یک سرور ایران (پشت یک دامنه، یک گواهی، یک پورت ۴۴۳) جلوی چند نود خارجی قرار می‌گیرد که با تونل معکوس به آن وصل می‌شوند و ترافیک با **path** به هر نود مسیریابی می‌شود. فقط پورت ۴۴۳ روی سرور ایران عمومی است. **سه نقش:** پنل ایران (`ratholectl` — rathole server + nginx)، نود خارج (`ratholenode` — rathole client)، و هاب مرکزی (`hub.py` — پنل وب مدیریت چند سرور از طریق SSH). **اصل مرکزی:** تغییر state → بازتولید کانفیگ → `nginx -t` → hot-reload (با حفظ inode و بازگشت خودکار در صورت خطا). **دستورهای مفید CLI:** `ratholectl status` (داشبورد کامل: دامنه، پورت‌ها، گواهی، سرویس‌ها، نودها — با `--json` برای هاب)، `ratholectl paths` (مسیر همه‌ی فایل‌ها با ✓/✗)، `ratholectl version` (نسخه‌ی مدیر + rathole). `ratholectl add` یک دستور آماده‌ی `curl … | sudo bash -s -- --node -- …` هم برای نصب نود چاپ می‌کند. **از هاب:** دکمه‌ی **«آپدیت همه»** همه‌ی سرورها را یکی‌یکی آپدیت می‌کند (progress bar + وضعیت هر سرور + badge نسخه سبز/زرد)، **«افزودن به نود»** یک نود ایران را روی نود/آپ‌استریم خارج سیم‌کشی می‌کند، و **«تنظیم تونل اصلی»** نود را به سرور ایرانش وصل می‌کند. **شروع سریع و مرجع کامل CLI (فارسی):** [`docs/README.fa.md`](docs/README.fa.md) **فهرست مستندات فارسی:** - [معماری](docs/architecture.md) · [حالت‌های transport](docs/transport-modes.md) · [مسیر ترافیک](docs/traffic-flow.md) - [هاب](docs/hub.md) · [پرفورمنس](docs/performance.md) · [AmneziaWG معکوس](docs/amneziawg-reverse.md) - [سند طراحی تفصیلی اصلی](rathole-multilocation-pasargad.md)
标签:Bash, Nginx, Python, Rathole, 内网穿透, 反向代理, 应用安全, 抗审查网络, 无后门, 网络隧道, 逆向工具