基于 Zero 内核的透明中转网关编排面板,用订阅节点池替代 IEPL 专线。
Zero Relay Panel 是一个面向中转运营场景的轻量面板,将代理协议订阅节点编排成隧道,对外提供无认证的 L4 入口端口(mixed / SOCKS5 / HTTP),实现"一个端口对应一组境外隧道"的透明转发。
客户端 ──→ 国内入口(本面板 + Zero 内核)──隧道──→ 境外节点 ──→ 互联网
↑
订阅节点池自动同步、测速、分组
- 订阅驱动:导入 Clash / V2Ray 订阅链接,自动解析节点、识别地区、同步更新
- 隧道编排:将节点组织为 selector / urltest / fallback / chain 隧道组,支持链式代理(中转 → 落地)
- 转发规则:每条规则 = 本地端口 + 监听协议 + 隧道链,匹配 gost / 极光面板心智模型
- 配置编译:面板模型 → Zero config.json,一键预览 / 应用 / 回滚,支持快照管理
- 流量计量:按转发规则和隧道统计双向流量、活跃连接
- 零外部依赖:无需数据库 / Redis / 消息队列,JSON 文件存储,单 Node 进程
- 暗色 UI:Vue 3 + Naive UI,响应式侧栏导航
- 不做用户系统、订阅链接分发、客户端导入
- 不做域名 / IP 分流规则集
- 不做 TUN / 系统代理 / GUI 客户端
- 不做入口协议层认证(mixed 入站无 user/pass)
Zero 是由 zerodenet 开发的 Rust 代理内核,定位于高性能、可编程的流量转发引擎。本面板通过 Zero 的控制面与其交互。
| 协议 | 入站 | 出站 | 备注 |
|---|---|---|---|
| Mixed (SOCKS5+HTTP) | ✅ | — | 面板默认入口 |
| SOCKS5 | ✅ | ✅ | |
| HTTP CONNECT | ✅ | ✅ | |
| VLESS | — | ✅ | 支持 XTLS Vision / Reality |
| VMess | — | ✅ | |
| Trojan | — | ✅ | |
| Shadowsocks | — | ✅ | |
| Hysteria2 | — | ✅ | |
| TUIC | — | ✅ |
面板通过两种通道与 Zero 内核交互(优先 IPC,HTTP 备选):
面板 (Node BFF)
↕ IPC: ~/.zero/control.sock(Unix Socket,JSON-line 协议)
↕ HTTP: 127.0.0.1:9090(REST + SSE)
Zero 内核 (Rust)
关键控制面操作:
| 面板动作 | 内核命令 |
|---|---|
| 下发配置 | config.apply |
| 切换 selector 节点 | policies.select |
| 触发节点探测 | policies.probe |
| 关闭活跃连接 | flows.close |
| 拉取运行时信息 | query('Runtime') |
| 拉取策略组 | query('Policies') |
面板支持三种内核管理模式:
| 模式 | 说明 | 适用 |
|---|---|---|
spawn |
面板 fork 内核子进程 | 单机简单部署 |
systemd |
调用 systemctl 管理 |
生产推荐 |
external |
仅通信,不管理生命周期 | 内核由外部工具管理 |
Zero 内核需要单独安装,面板不内置。获取方式:
# 从 GitHub Release 下载(推荐)
# https://github.com/zerodenet/zero/releases
# 解压后放入 PATH 或在面板设置中指定路径
mv zero /usr/local/bin/
chmod +x /usr/local/bin/zero安装后在面板「设置 → 内核状态」中确认内核已安装并运行。
- Node.js >= 20
- pnpm >= 9
- Zero 内核(可选,面板可独立运行于 API-only 模式)
# 克隆仓库
git clone git@github.com:zerodenet/relay.git
cd relay
# 安装依赖
pnpm install
# 构建
pnpm build
# 启动(生产模式)
NODE_ENV=production pnpm start
# 或开发模式(热重载)
pnpm dev首次启动时,面板会在 stderr 输出初始管理员密码,请登录后立即修改。
浏览器打开 http://<服务器IP>:8080,使用初始密码登录。
- 添加订阅:在「订阅」页面填入 Clash / V2Ray 订阅链接,点击同步
- 创建隧道:在「隧道」页面将节点组织为隧道组(selector / urltest / chain 等)
- 添加转发:在「转发」页面创建规则,指定本地端口 + 隧道链
- 应用配置:在「设置 → 配置管理」点击「应用并下发」,编译并推送到 Zero 内核
- 验证:客户端通过
socks5://服务器IP:端口连接测试
zero-tools/
├── docs/ 设计与开发文档
├── packages/
│ ├── shared/ 前后端共享 zod schema 与类型
│ ├── server/ Node BFF(Fastify)
│ └── web/ Vue 3 SPA
├── LICENSE
├── package.json
├── pnpm-workspace.yaml
└── tsconfig.base.json
所有数据存储在 ~/.zero-panel/(可通过 ZERO_PANEL_HOME 环境变量覆盖):
~/.zero-panel/
├── settings.json 面板设置(密码哈希、内核路径等)
├── data/
│ ├── subscriptions.json 订阅源
│ ├── nodes.json 节点池
│ ├── tunnels.json 隧道组
│ └── forwards.json 转发规则
├── snapshots/ 配置快照(自动保留最近 50 份)
├── stats/
│ └── current.json 实时流量统计
└── cache/ 订阅缓存
| 层 | 选型 |
|---|---|
| 内核 | Zero (Rust) |
| 运行时 | Node.js 20 LTS+ |
| 后端 | Fastify + zod + argon2 |
| 前端 | Vue 3 + Vite + Pinia + Naive UI |
| 存储 | JSON 文件(原子写入 + 文件锁) |
| 包管理 | pnpm workspace |
| 文档 | 内容 |
|---|---|
| 产品概览 | 定位与场景 |
| 总体架构 | 进程拓扑与技术栈 |
| 数据模型 | JSON schema |
| REST API | 接口规范 |
| 内核对接 | Zero 控制面通信 |
| 配置编译器 | 内存模型 → Zero config |
| 订阅与节点 | 订阅解析 / 节点池 |
| 计量与统计 | 流量聚合 |
| 前端规划 | UI 设计 |
| 部署运维 | systemd / 备份 |
| 路线图 | 版本规划 |
This repository now includes a Docker-first deployment path.
docker compose up --buildBefore starting, provide the Linux zero binary in one of these ways:
- copy it to
./runtime/zero/zero - or set
ZERO_BINARY_HOST_PATHin.env
The included docker-compose.yml starts a single panel container. The container copies the mounted zero binary into its own filesystem, marks it executable, and then the panel manages the kernel with ZERO_MANAGE_MODE=spawn. See docs/docker.md for the full environment and volume layout.
With the default ZERO_AUTO_START=1, container boot also compiles the current panel model to /etc/zero/config.json and starts zero automatically.
If no tunnels or forwards exist yet, the panel seeds a bootstrap local mixed proxy on 127.0.0.1:10808 backed by a direct tunnel, so the generated config is never empty on first boot.
Docker health only checks whether the panel API is alive. Kernel state is reported separately by GET /api/health and GET /api/system/kernel, so a kernel startup failure does not automatically mark the whole container unhealthy.