Skip to content

RosPanel

RosPanel

基于 Xray-core 的自托管 VPN 管理面板——从一台个人服务器到一整套节点网络。

Release Downloads Go Xray-core React Platform Deploy

English · Русский · 简体中文 · العربية · فارسی · 文档

简介 · 获取服务器 · 快速开始 · 功能 · CLI · 架构 · 免责声明 · 开发 · 支持项目


简介

RosPanel 是基于 Xray-core 的自托管 VPN 管理面板。一个进程同时提供多种协议, 面板则通过 Web 界面管理用户、订阅、套餐与支付、路由、统计、备份和品牌外观——无需手动编辑任何配置文件。 当一台服务器不够用时,同一个面板可以扩展为服务器网络:添加节点后,每个用户都可以使用所有节点。

开箱即用、自成一体:只有一个静态二进制文件——不需要 nginx、certbot 或任何第三方脚本。面板通过 ACME 自行签发 TLS 证书,而且域名是可选的:没有域名时也能为纯 IP 签发证书。安装完成后即可通过面板自身的地址访问—— 无需配置 DNS、反向代理或 SSH 隧道。Xray 配置由面板状态自动生成(无需手动编辑 JSON),用户的添加和删除即时生效, 不会中断其他人的连接;如果数据库损坏,面板会自动从最近一次备份恢复。

Note

这是一个控制面,而不是 VPN 客户端。它用于配置和运行你自己的服务器。 本项目仅供教育和研究用途(参见免责声明)。


🖥️ 获取服务器

最便宜的 VPS 就够用:1 vCPU、1 GB 内存、任意 Linux——足以同时运行面板和 Xray,服务数十个用户。

如果你还没选好服务商,欢迎通过下面的链接注册。这是支持项目的免费方式:你支付的价格不变, 而一部分租金会用于面板的开发。

VDSina · Aeza · NetGrid · Serv.host · u1Host · Waicore

感谢每一位通过这些链接注册的朋友 🙏


🚀 快速开始

方式一——安装脚本(推荐)

一条命令:下载发布版本,安装 systemd 服务和 nftables(如未安装),启动服务并打印登录信息。

curl -Ls https://raw.githubusercontent.com/AppsGanin/rospanel/main/install.sh | sudo bash

域名是可选的。脚本会询问域名:有域名就输入;没有的话直接按 Enter,面板将在服务器 IP 上运行。 两种情况都会获得 Let's Encrypt 证书——IP 地址同样可以签发证书,因此浏览器不会出现警告。

也可以预先指定域名,跳过询问: curl -Ls … | sudo ROSPANEL_HOST=vpn.example.com bash。

方式二——手动安装二进制 + systemd

# 下载最新发布版本(ARM 服务器请将 amd64 替换为 arm64)
curl -fsSL -o rospanel \
  https://github.com/AppsGanin/rospanel/releases/latest/download/rospanel-linux-amd64
chmod +x rospanel

# 安装为服务(将二进制复制到 /usr/local/bin,写入 systemd unit 并启动)
sudo ./rospanel install
#   直接指定域名:  sudo ROSPANEL_HOST=vpn.example.com ./rospanel install

# 登录信息和秘密路径只打印一次:
journalctl -u rospanel | grep -A6 FIRST-RUN

方式三——Docker

docker run -d --name rospanel \
  --network host \
  --cap-add NET_ADMIN \
  --device /dev/net/tun \
  -v rospanel-data:/data \
  ghcr.io/appsganin/rospanel:latest

docker logs rospanel | grep -A6 FIRST-RUN

Note

需要 --network host,这样 Xray 才能直接监听 443/TCP、80/TCP 和 Hysteria2 的 UDP 端口; NET_ADMIN 让面板可以管理防火墙规则:端口跳跃、连接数限制和暴力破解封禁(nftables)。 --device /dev/net/tun 是 AmneziaWG 通道创建隧道所必需的——没有它容器拿不到 TUN 设备, 仅有 capability 是不够的。只有在你从不启用该通道时才可以去掉这个参数。

🔑 默认登录信息

字段 值
用户名 admin
密码 admin
面板路径 /rospanel/

安装完成后,面板地址为 https://<domain-or-IP>/rospanel/。准确的链接也会写入日志 (journalctl -u rospanel | grep -A6 FIRST-RUN 或 docker logs rospanel | grep -A6 FIRST-RUN)。

首次登录时,设置向导会强制修改密码,并建议将面板路径替换为随机的秘密路径——默认的 admin/admin 和 /rospanel/ 只在这一步之前有效。

Important

修改后,面板只能通过秘密路径访问——根路径显示的是伪装页面。不知道 /<secret>/, 就根本找不到登录表单。

🌐 添加节点

节点是一台干净的 Ubuntu 服务器,以节点模式运行同一个二进制文件:其配置由面板生成,无需单独设置。 一切从界面开始:服务器 → 添加节点,输入名称以及节点的域名或 IP。之后有两种方式。

方式一——安装命令。面板会给出现成的一行命令,在节点服务器上以 root 身份运行:

curl -Ls https://raw.githubusercontent.com/AppsGanin/rospanel/main/install.sh \
  | sudo bash -s -- --join 'https://<panel>/<node-api-path>/v1/join#<token>'

请从对话框中完整复制这条命令——地址和令牌都已自动填好。令牌只显示一次,有效期 24 小时; <node-api-path> 是专用于节点同步的独立、不可猜测的路径段(既不是面板路径,也不是 REST API 路径: 修改这两者都不会使节点脱离)。如果面板运行在纯 IP 上(证书并非来自公共 CA),面板会自动在命令中加上 --insecure。

方式一 b——Docker。与面板使用同一镜像,以节点模式运行。node install 需要写入 systemd unit, 而容器里没有地方放它,因此加入信息改为通过环境变量传递:只有当数据卷中还没有 node.json 时才会使用它, 所以容器可以随意重建,compose 文件里已用过的令牌也不会产生任何影响。

services:
  node:
    image: ghcr.io/appsganin/rospanel:latest
    command: node run
    network_mode: host          # Xray 绑定 443/TCP、80/TCP 和 Hysteria2 的 UDP 端口
    cap_add: [NET_ADMIN]        # nftables:按 IP 限制、端口跳跃
    devices: [/dev/net/tun]     # AmneziaWG 的隧道;如果不启用该通道可省略
    environment:
      ROSPANEL_JOIN: 'https://<panel>/<node-api-path>/v1/join#<token>'
      # ROSPANEL_JOIN_INSECURE: "1"   # 仅当面板仍在使用自签名证书时
    volumes: [rospanel-node:/data]
    restart: unless-stopped
volumes:
  rospanel-node:

面板的更新节点按钮会替换容器内的二进制并退出,而重启后又会回到镜像中的版本——因此 Docker 节点请改用 docker pull 和新建容器来更新。数据卷保存着节点身份,所以不需要重新加入。

方式二——通过 SSH 安装。同一对话框中的“通过 SSH 安装”选项卡:面板自行登录服务器(地址、端口、 用户名 + 密码或 PEM 私钥),上传自己的二进制并安装代理程序——同时显示实时安装日志。 节点版本保证与面板一致。SSH 凭据从不保存。

安装完成几秒后,节点就会以在线状态出现在列表中:它通过出站 HTTPS 主动连接面板,因此面板无需入站访问节点, 也不需要任何端口转发。

systemctl status rospanel-node        # 节点服务
journalctl -u rospanel-node -f        # 代理程序日志
rospanel node status                  # 本地状态

Note

一台服务器要么是面板,要么是节点:两者共用 443 端口。如果机器上已有面板服务, node install 会将其禁用。


✨ 功能

🔐 协议、伪装与 TLS

一份配置、一套凭据:VLESS-Vision(TCP/443 + uTLS)、VLESS-XHTTP-REALITY (伪装成他人站点的 TLS)、Hysteria2(UDP + 端口跳跃)。此外,每台服务器还支持自定义入站: VLESS / Trojan / Hysteria2,可搭配任意传输方式(TCP、WebSocket、XHTTP、gRPC、HTTPUpgrade),以及 Shadowsocks-2022(raw TCP),拥有独立的端口、 REALITY 密钥、跳跃范围以及细粒度的传输参数调整(XHTTP extra、HTTP 伪装、sockopt、额外的 TLS 字段)—— 可逐项填写,也可直接写原始 JSON;保存前会在目标机器上校验配置(xray -test + 端口绑定), 客户端无法处理的组合会被自动排除在 Clash/sing-box 订阅之外。连接编辑器中的“恢复出厂默认”按钮可将协议、 端口、指纹和反 DPI 设置还原为全新安装时的状态,并删除该服务器的自定义入站(REALITY/AmneziaWG 密钥以及 REALITY 伪装目标和端口会保留;主服务器会先为配置创建快照)。面板隐藏在秘密路径之后; 其他任何路径都返回伪装站点(12 种模板)。探测检测会识别扫描隐藏面板的 IP——即请求了大量伪装站点中不存在的路径的 IP—— 并记录下来供管理员查看;响应本身不会改变,因此扫描器看到的始终只是伪装站点,伪装不会暴露。 还可以选择在防火墙上丢弃该 IP(nftables)和/或发送新扫描器的每日摘要——两者默认关闭,仅记录是安全的基线。 TLS 开箱即用——ACME(Let's Encrypt / ZeroSSL)自动续期;证书也可以为纯 IP 签发,无需域名和 DNS。

扫描器看到了什么。伪装站点也通过 HTTP/3 响应:Hysteria2 在 UDP 上提供与 TCP 相同的站点。 但站点不会用 Alt-Svc 声明它——浏览器一旦得知,会把面板和 /sub/ 的请求也发到 HTTP/3 上,而那里只回答伪装站点。全新安装会随机选取自己的 REALITY 伪装目标,并把通道放在 443 上——这是最不容易被封的端口。 前置服务同时承载两个监听:ClientHello 中带有任一伪装域名的连接交给 REALITY,其余(本服务器域名、 不带名字的地址)交给诱饵站点,因此 REALITY 伪装成伪装域名,而不是本服务器域名。 放在独立端口上的通道则以其自身域名为 SNI,探测者得到的是服务器的真实证书。 诊断会提示可能暴露服务器的因素:自签名证书,以及包含 vpn、proxy 等字样的域名—— 域名会出现在公开的证书透明度日志中。

Hysteria2 混淆(Salamander)。Hysteria2 基于 QUIC,而 QUIC 握手是 DPI 设备在任何流量出现之前 唯一能识别该通道的特征。启用后,每个数据报都会与预共享密钥进行异或运算,线路上就看不到任何像握手的东西了。 密钥由面板生成,无需手动输入——与 REALITY 参数一样——并会写入面板下发的每个链接和配置文件, 客户端在下次刷新订阅时即可获取。内置通道和任意自定义 Hysteria2 入站均可使用,各自拥有独立的密钥。

AmneziaWG 3.1 是第四条内置通道:握手隐藏在垃圾数据包和看似随机的报头之后的 WireGuard, 适用于 AmneziaVPN 和 AmneziaWG 应用。3.1 增加了报头保护——此前报头中以明文保留的部分是一种静态指纹, DPI 设备无需看到握手即可匹配——同时为全部四种消息类型添加填充,报头从一个区间中随机选取而不再固定, 计时器也被打散而非恒定,使会话没有可供锁定的周期。每次握手之前,客户端还会先发送一小串诱饵数据报 (I1/I2),其形态模仿普通的 UDP 协议——QUIC Initial、DNS 查询或 STUN 绑定请求,每台服务器随机选择一种—— 因此新流的第一个数据包是 DPI 设备能识别的东西,而不是一团未知数据。这些都由面板生成,无需粘贴任何内容; 协议中可自由取值的部分(连接 ID、查询名称、事务 ID)在每个数据包中都会重新生成,而不是只采集一次。 需要 Amnezia VPN 5.0.1.5 或更高版本;参数在 3.1 之前生成的服务器会继续原样运行,直到你重新生成; 而重新生成会使该服务器已下发的配置失效,这一点一如既往。协议引擎(amneziawg-go)运行在面板进程内部—— 没有守护进程,也没有额外的二进制——每台服务器(主服务器和每个节点)一条隧道,各自拥有由面板生成的 密钥对和混淆参数;用户在其被允许使用的每台服务器上都是一个 peer,所有服务器上使用同一对密钥和同一个隧道地址。 像其他通道一样在连接中启用即可(UDP 端口会随机选择一个较高的端口,而不是 51820——后者无需握手就能被识别); 用户可以在订阅页面和自己的卡片中以文件或 QR 码形式获取配置,访问组、设备数限制、流量统计和在线状态对它的处理 与 Xray 通道完全相同。需要 /dev/net/tun 和 CAP_NET_ADMIN,安装后的服务已具备;在 Docker 中需要自行传入 (--device /dev/net/tun --cap-add NET_ADMIN),因为容器默认没有 TUN 设备。隧道的 NAT 需要 nftables。

NaiveProxy 是位于 VLESS-TCP-TLS 端口上的内置通道:使用 Chrome 网络栈的客户端,由 :443 后的伪装站点 以同一张证书提供服务。路由、流量统计、限制和断开与其他通道一致。登录名为 u<id>,密码为用户的 UUID。 当证书受信任时(域名或 Let's Encrypt IP 证书),订阅会将其下发给支持导入的客户端——Shadowrocket(作为 http2://)、 v2rayN、Karing、Throne、Exclave。

mieru 是一条使用独立 TCP 端口的内置通道,端口自动选择。登录名为 u<id>, 密码为用户的 UUID;路由、流量统计、限制和断开与其他通道一致。订阅会将其下发给支持导入的客户端—— 对于版本表明其内核已支持 mieru 的客户端,下发 Clash 配置(mihomo 本身、FlClash、FlClashX、Koala Clash、 Clash Verge Rev、Mihomo Party、Sparkle、ClashMetaForAndroid、ClashMi);对于 Shadowrocket、Throne、Exclave 和 Karing, 下发 mierus:// 链接。

AnyTLS 是位于 VLESS-TCP-TLS 端口上的内置通道,与其共用证书和伪装站点;密码为用户的 UUID。 当证书受信任时,它会下发给 sing-box 客户端、Clash 配置(已支持它的 mihomo 内核)、v2rayN、Shadowrocket、 Throne、Exclave、Karing 和 NekoBox。

MTProto(Telegram 代理) 是一条使用独立 TCP端口的内置通道,端口自动选择,默认开启:Telegram 本身通过服务器连接,无需 VPN 应用。采用 fakeTLS,每个用户的密钥由其 UUID 派生——被停用的用户随之失去,重置 UUID 即更换。密钥中写的是服务器的域名(其SNI 或主机名),没有域名时使用指向其地址的名称(<ip>.sslip.io)——不用其他网站的名称,DPI 会拦截那样的 SNI;该名称在首次启动时保存,只能在“连接”中更改,因为用户添加的每个代理都带有它。不是代理客户端的连接会被转交给该网 站。流量经由 Xray发出,路由、计量、限制和断开与其他通道相同。订阅页面为每台服务器提供代理:二维码、“添加到 Telegram”和t.me 链接。

TURN-VK(通过通话传输的 WireGuard) (实验性功能:可能在未来版本中变更或移除) 是一种自定义入站协议, 适用于只放行白名单流量的移动网络。在网络看来,它就是一通通话。中继使用 Free Turn Proxy 的掩码线路格式——每个数据报都被封装成 WebRTC 通话的 RTP/Opus 音频(rtpopus3,密钥由面板生成)——因为 VK 会对看起来不像通话媒体的 TURN 流量限速; 同一端口上仍然提供普通的 vk-turn-proxy DTLS。中继由面板自行运行(在进程内,主服务器和节点上都是), 并将数据包交给本地回环上的 Xray 原生 WireGuard 入站,因此这条通道和其他 Xray 入站一样:用户即时添加和删除, 不影响其他人的会话,支持访问组、路由(WARP、代理通道、屏蔽)、按用户统计流量和在线状态。用户以其在 AmneziaWG 上相同的密钥和隧道地址作为 peer——无需额外下发任何东西。在连接 → 自定义入站中创建(协议选 TURN-VK, UDP 端口默认 56000,可选填一个下发给用户的 VK 通话链接);在订阅页面上,用户可获得一键导入链接, 将整台服务器添加到内置 WireGuard 的应用中——iOS 上的 VK Turn Proxy (TestFlight)使用 vkturnproxy://,Android 上的 Free Turn Proxy (以及电脑上的命令行客户端)使用 freeturn://,Android 上的 WINGS V 和 Windows、Linux 上的 WINGS V DeX 使用 wingsv://(它不支持掩码,以无掩码方式连接); 在手动设置中,还提供中继地址、通话链接以及一份指向 TURN 客户端的普通 WireGuard 配置。

👤 用户

流量和时间限额,支持自动禁用以及按日/周/月/年自动重置流量。被禁用或流量用尽的用户,其已建立的连接也会被断开; 主服务器和节点每 10 秒检查一次流量限额。此外,除了固定的到期日,还可以使用从首次连接开始计算的期限: N 天,密钥闲置期间不计时,从首次连接起开始计算(续期会向此类期限追加天数,套餐则以其自身期限替换), 还有设备数限制(具体统计方式见下文设备绑定)和按用户的限速。流量统计基于 Xray Stats,支持在线状态和连接列表; 到期用户可自动删除。每个用户都可以有一条管理员备注(来源、约定事项——仅在面板和 API 中可见,从不向客户展示) 和若干标签(vip、reseller-a),列表可按标签筛选,搜索也会覆盖标签;名称旁还会显示 Xray 客户端 ID(u12), 看到日志就能立刻对应到账户。导入与导出:用户页面可读取 Marzban 数据库或 GET /api/users 导出、 Marzneshin、Rebecca、Remnawave、3x-ui 的 x-ui.db,以及本面板自己的导出文件——并可一键生成该导出。导入的用户保留相同的 UUID 和密码 (Marzneshin 除外:会重新生成 UUID,密钥作为订阅令牌保留,客户端会自动刷新)、 限额、到期时间(包括从首次连接开始计算的期限——Marzban 的 on_hold、3x-ui 的“首次使用后开始”)、已用流量、 备注和标签,因此没有人需要在应用中重新添加服务器;只要来源中有订阅令牌,令牌也会一并迁移(3x-ui 的 subId、 Marzban 导出,以及本面板自己的导出总是包含),因此把域名迁移到新安装后,所有现有订阅链接依然可用。 已存在的用户(相同 UUID)会被跳过,所以同一文件导入两次也不会产生重复用户;与其他用户冲突的令牌会被替换而不是拒绝; 上传的文件在读取完毕后立即删除。即使有数百个用户,搜索和筛选依然很快,批量操作(启用/禁用/重置/续期/删除) 只需一次 Xray 重载。仪表盘实时显示 CPU / 内存 / swap / 磁盘和 VPN 流量。连接地图展示客户端的连接来源—— 按国家(使用 Xray 路由所用的同一个 geoip 数据库)和按网络运营商 / ASN(使用面板自行下载的免费 iptoasn 表)统计不同的源 IP;不依赖任何外部服务。

设备数限制——统计的是什么。用户的设备数限制(或其套餐设定的限制)是一个数字,以两种方式执行。 单独使用时,它限制同时在线的不同源 IP 数量:在在线窗口内,从超过限制数量的不同地址连接的用户会被 从隧道中断开,直到回落到限制以内——统计范围是所有服务器(主服务器和节点),而非单台服务器。 0 表示不限制 IP 数。

断开不是立即发生的。超限状态必须持续两分半钟,略长于在线窗口;面板每 30 秒检查一次设备数限制, 因此断开会在多出的设备出现后两分半到三分半钟内发生。这是因为最常见的两种超限情况根本不是共享账号: 手机切换网络后会放弃旧地址,而旧地址在被窗口移出之前仍保持着最新的记录;移动运营商也会在自己的地址池内轮换公网地址, 完全不需要用户做任何操作(某个真实账户一个月内在同一个 176.15.0.0/16 中出现了七个地址)。 要把这两种情况与第二台设备区分开,唯一的办法是观察旧地址是否仍在被使用——这意味着不能断开用户,因为断开会导致 无法再判断流量。所以限制会等待,被放弃的地址会自行离开窗口。真正同时使用的地址在等待结束时依然都在, 断开照常执行。

设置 → 订阅 → 设备统计方式 → 仅 HWID 会完全取消按地址计数——代价是失去唯一能限制同一链接同时在多少地方使用的手段, 因为 HWID 限制的是谁可以获取订阅,而不是谁可以连接。默认两者都统计。

设备绑定(HWID)。启用后,同一个数字也会限制不同安装实例的数量。遵循订阅头约定的客户端(Happ、v2RayTun) 会发送稳定的安装 ID;面板在首次获取时将其绑定到账户并计入限制。限制满额后,新的安装实例将被拒绝获取订阅, 而已绑定的实例仍可正常更新——检查和写入在同一个事务中完成,因此两个客户端不可能同时占用最后一个名额。 (当用户自身的限制为 0 时,HWID 改用面板全局的后备限制。)设备列表显示在用户卡片中、客户端机器人中 (两种方式都适用时分为按 IP 和按 HWID 两行),以及订阅页面上,账户所有者可以自行释放设备,无需联系客服; 闲置设备会在可配置的 TTL 之后释放名额,轮换订阅链接则会释放全部设备。默认关闭(设置 → 订阅); 启用后,不发送 ID 的客户端将完全无法获取订阅——如果换一个“安静”的应用就能绕过,这种限制就形同虚设—— 如果你的部分用户在使用这类客户端,可以通过开关继续为它们提供服务(与以前一样按地址计数)。

限速。按用户设置的上限,单位为 kbit/s,可手动设置或由套餐设定。Xray 没有按用户的带宽限制,因此在其下层执行—— 使用内核自身的调度器(HTB),以该用户当前连接所用的地址为键,双向生效。这意味着它一次覆盖所有协议; 同一个 NAT 地址后面的所有人共享一个上限;对于 Hysteria2(其拥塞控制在设计上忽略丢包),触及上限的表现是丢包, 而不是平滑降速。节点根据自己看到的连接情况对自身流量进行整形。

访问组决定用户能获得哪些连接:内置通道和自定义入站按服务器勾选,不属于任何组的用户获得全部连接, 属于多个组的用户获得这些组连接的并集。限制在服务器端执行——账户根本不会被添加到禁止的 Xray 入站中 (而不只是在界面上隐藏),因此无论是订阅还是手工构造的链接,都只能拿到被允许的内容。成员关系可以从两边编辑—— 在用户卡片中和在组本身中——用户所属的组在其卡片和列表中均可见。组还可以设置限速:设置后,它优先于成员的套餐限速 和个人限速(属于多个组的成员取最高值),但不会解除针对可疑流量的限速。授予此类组的套餐会让其用户获得该速度。 保存时未勾选任何连接的组不限制访问——相当于只用一个字段定义的速度档位。如果组的连接是自行消失的 (删除了入站或节点),该组仍会限制其成员,而不是向他们开放全部连接。

📲 订阅

/<path>/<token>——一份 base64 列表,外加一个带 QR 码、深度链接和一键导入主流客户端功能的页面 (为 Happ / INCY / Mihomo 提供自动路由头),节点名称可自定义。链接可以重置(轮换令牌),而不改变 UUID 和密码。 客户端内的公告(Happ、v2RayTun)可以直接在应用里显示一段短文本。Happ 加密链接(设置 → 订阅): Happ 按钮通过 happ://crypt4/… 添加订阅,应用不会显示订阅地址;同一链接也可以从用户卡片中复制。

三步完成的连接向导:自动识别平台,然后是 Happ 的官方下载(iPhone 单独提供俄罗斯 App Store 链接), 最后一键添加订阅。添加到主屏幕后,页面会像应用一样打开。在 Telegram 内打开时,它看起来就是 Telegram 的一部分: 标题栏颜色、系统返回按钮、触感反馈。期限选项会显示每日价格和节省金额。

固定地址上的 Mini App(每个安装随机生成,显示在设置 → Telegram 中)——链接中不含令牌:Telegram 对用户数据签名, 面板据此找到用户的账户并打开其页面。机器人的菜单按钮指向这里。在 @BotFather 中设置该地址后(Configure Mini App), t.me/<bot>?startapp=ref_… 和 ?startapp=<tag> 链接可以携带邀请和来源标签;注册开放期间,新用户会被当场注册。

连接名称中的变量。通道或自定义入站的名称可以包含 {server}、{user}、{used}、{left}、{total}、 {expire} 和 {days};面板在生成订阅时会按用户展开这些变量,因此客户端可以显示“Amsterdam · 剩余 75 GB”, 而管理员无需为每个人单独维护名称。名称中如果自行放置了 {server},它会替代自动添加的“服务器 · 通道”前缀, 而不是在其前面再加一层前缀。使用 {left} 或 {days} 之前需要知道:对客户端而言,每次订阅更新时名称变化 都意味着一个新的服务器名称,这会重置用户已选中的服务器——稳定的只有 {server}。

页面上提供账户持有人需要的内容,而不包含他们不应外传的东西:按通道的单独配置卡片可以关闭;启用设备绑定后, 页面会列出他们自己已绑定的设备并提供释放按钮——完整的设备管理变成自助操作,而不是工单。

配置模板(设置 → 订阅)允许你用自己的文档替换为 mihomo/Clash、sing-box 和 Xray JSON 生成的配置—— 你的 DNS、你的分组、你的规则集——面板的服务器会插入到你标记的位置({{proxies}}、{{tags}}、sing-box 用的 {{group}}、 Xray JSON 用的 {{outbounds}} 和 {{remarks}},mihomo 用熟悉的 # LEAVE THIS LINE! 标记)。服务器条目仍由面板构建, 因此模板不会产生客户端拒绝的条目。模板在保存时会被检查;如果渲染时出错,面板会改为提供自动生成的配置—— 客户端一旦无法解析配置,就会丢弃其中所有服务器,所以损坏的配置绝不能送到客户端。自动生成的 sing-box 配置面向 sing-box 1.12 及以上版本(带类型的 type/server DNS 服务器,服务器名称通过 route.default_domain_resolver 解析)。 使用了 1.13/1.14 已不再支持的字段(dns.servers[].address、dns/wireguard 出站、入站 sniff、geosite/geoip 等)的 sing-box 模板在保存时会被拒绝;之前已保存的此类模板会被自动生成的配置替换,并在日志中留下一行记录。

响应规则用于改变匹配客户端收到的订阅:一组有序的管理员规则,与请求进行匹配(User-Agent 或 HWID 头; 包含、等于、前缀、正则)。规则可以强制指定格式,提供或隐藏个别协议(内置通道、自定义入站、VLESS Encryption), 或屏蔽该客户端(返回伪装站点)。第一条匹配的规则生效;没有匹配时按 User-Agent 自动识别。编辑器会显示 某个客户端将得到的内容。

按服务器的流量限额(在服务器卡片上,容量旁边)对应主机商卖给你的流量:以 GB 计的月度或每日额度。 月度周期从主机商开始计费的那一天起算(没有这一天的月份从该月最后一天开始)。面板统计它归属到该服务器的流量—— 略低于主机商的计费值,这在阈值上是偏安全的一侧——额度用尽时通知你一次,新周期开始时再通知一次, 并可在此期间将该服务器从订阅中移除。但绝不会移除全部服务器:如果所有服务器都超额,它们会继续提供服务。

停止响应的服务器默认仍保留在订阅中:节点每次更新都会短暂掉线,而恰好在那一分钟刷新的客户端会丢失该服务器, 直到下一次刷新。要隐藏此类服务器以及 Xray 已停止的服务器,请开启设置 → 订阅 → 离线时隐藏服务器。

故障通道——无法占用其端口的 AmneziaWG、mieru、MTProto 或 TURN 中继——会在两分钟后从订阅中移除,恢复后立即重新加入。 服务器每分钟重试一次,通道移除和恢复时都会通知管理员。

服务器顺序(设置 → 订阅)决定客户端首先看到哪台服务器——以及满载的服务器是否显示。每台服务器都有手动设置的 权重和以用户数计的容量,在服务器页面的卡片上设置。三种模式:手动(先按权重,再按列表顺序)、 负载最低优先(在线用户数相对容量)以及随机——每次刷新都是新的顺序,这样连接第一台服务器的客户端会分散到所有服务器。 标记为满载时隐藏的服务器在达到容量时会从订阅中移除——但绝不会是最后一台,因为空订阅会让所有客户端无法使用。 负载按服务器统计,数据来源与设备数限制相同;服务器页面会在每个容量旁显示实时数字。

客户端 DPI 规避(设置 → 订阅)是订阅告诉应用在 DPI 设备看到 TLS 握手之前如何处理它——服务器端不做任何改动。 对于基于 Xray-core 的应用(Happ、v2rayNG、v2rayN、Streisand),提供 Xray JSON 订阅格式:每条通道一份完整配置, 由面板已经生成的分享链接派生而来,代理通过一个 freedom 出站拨号,该出站带有 fragment(拆分 ClientHello: tlshello / 首批数据包、分片长度、间隔)和 noise(在数据之前发送随机、字符串或 base64 数据包)。 开启后会自动提供给这些应用,并且始终可以通过 ?format=xray-json 或响应规则获取。对于 sing-box, record fragment 会在连接设置中的数据包级分片之上,再将 ClientHello 拆分为多个 TLS 记录。

维护模式——一个开关即可将公开页面(订阅页面、状态页面、伪装站点)切换为“暂时不可用”页面, 而面板、API、节点同步和隧道本身照常运行,因此现有连接不受影响,管理员也仍然可以登录。

🧭 路由与出口

带优先级的 block / direct / WARP / Opera 分类,geosite/geoip 预设并自动下载数据库,可通过 Cloudflare WARP(WireGuard)和免费的 Opera VPN(可选地区)作为出口。WARP 通道同时使用多个 Cloudflare 端点—— 不同的地址段和不同的 UDP 端口,并进行健康探测,因此即使服务商屏蔽了某个地址段或某个端口,通道也不受影响。 其 peer 以地址而非主机名写入:Xray 通过自己的 DNS 服务器解析 WireGuard 端点,而依赖这些 DNS 的通道 在 DNS 被过滤的地方会无声地失效。代理通道是相互独立的出口,每条都有自己的上游和区域规则, 在所有存活的上游之间负载均衡(Observatory)。上游可以是 socks5/http 代理,也可以是别人的 VPN 服务器: vless:// / trojan:// / ss:// / vmess:// / hysteria2:// 链接,或者一整份订阅(https://…、happ://crypt…、base64)—— 面板会将其解密并持续重新读取。当通道无法承载流量时——所有上游探测失败、一个上游都没有解析出来、Opera 的辅助程序不可达、 启用了 WARP 却没有账户——这些流量默认回退到直连,从服务器自身的地址出去,从而保持畅通。 “通道故障时绝不回退到直连”(按服务器设置,位于路由顺序下方)则会直接丢弃这些流量,适用于那些正是为了 不让流量从该地址出去才被路由到通道的客户端。已关闭的通道不受影响。主机刷新失败的代理列表会保留上次返回的代理, 而不是清空通道——这些代理是否仍然可用,由针对代理本身的健康探测来判断。

级联。通道的上游可以是我们自己的服务器(“服务器”来源):用户连接到本服务器,并通过选定的服务器访问互联网。 这就是白名单环境下某个国家的入口:本地服务器可以访问,国外服务器则不行。到每个出口的连接方式可自选: VLESS-XHTTP-REALITY、VLESS-TCP-TLS 或 Hysteria2。桥接密钥由面板自行生成,出口只接受来自入口地址的连接。 流量在入口统计,且绝不会从入口的地址访问互联网。有级联经过的出口无法被关闭或删除。谁能使用入口由访问组决定。

配置快照(服务器设置中的快照选项卡)为整台服务器的配置提供撤销历史——协议、端口、REALITY、路由、出口、 DNS、伪装站点和入站:手动保存还原点,如果某次修改出了问题即可回滚。回滚会重新经过 xray -test 校验, 并先自动为当前状态创建快照(因此回滚本身也可以撤销);它会刻意保留证书和域名不变,所以撤销永远不会危及当前的访问。

外部订阅(服务器页面上的一张卡片)是同一枚硬币的另一面:其他服务商的服务器,从其订阅中读取, 与你自己的服务器一起下发给你的用户。来源可以是链接、happ://crypt… 链接或粘贴的列表;链接每小时重新读取一次, 每台服务器可单独开关,谁能使用由与你自己通道相同的访问组决定。订阅可以经由你的服务器中转——任意几台,各按勾选的协议: 用户连接到你的 VLESS TCP-TLS 或 REALITY 通道(每台服务器、每个协议对应合作方每台服务器各一份配置,名称可用带 {name}、{proto}、{server} 等变量的模板),由服务器将流量转发给合作方, 限速、流量限额、设备数限制和断开与你自己的通道效果相同。中转的订阅有自己的路由:规则把一部分流量送往别处 (geoip:ru 从你的服务器直连,某个网站走 WARP 或线路),其余发往合作方;当无法直连合作方时,你的服务器还可以 经 WARP 或级联线路连接合作方。合作方的 WireGuard 服务器(.conf 文件或 wireguard:// 链接)只由你的服务器连接 ——一份配置就是一台设备——用户拿到的是你的 VLESS 配置。要求设备绑定的服务商会拒绝无法标识设备的调用方,因此面板会提供一个设备身份: 由来源派生的 ID——每次读取都相同,因此对方只会绑定一个名额,而不是每次刷新都占用一个新名额—— 加上当前版本号和一个普通的 User-Agent。这些都是可编辑的默认值,以应对对方期望特定值的情况。

🌐 服务器网络(多节点)

一个面板即可管理主服务器和任意数量的远程节点。在界面中添加服务器:为一台干净的 Ubuntu 服务器复制一条命令, 或者让面板通过 SSH 登录并安装代理程序——同时显示实时安装日志。节点会主动连接面板(出站 HTTPS 长轮询), 因此面板无需访问节点,迁移面板也不会使节点脱离。用户、限额和套餐会同步到每个节点;流量和设备计入共享限额, 而统计和用户卡片会显示每台服务器各走了多少流量,统计中还会按协议细分。每个节点还有一个流量倍率—— 用于调整经由该节点的流量消耗用户额度的速度(昂贵的地区设为 2×,促销地区设为 0.5×);它只影响额度, 从不改变按节点统计的字节数。

每台服务器单独配置(协议、出口、DNS、REALITY 密钥、域名和 TLS、geo 数据库、伪装站点)。节点就是以节点模式运行的 同一个二进制:配置由面板生成,本地 xray -test 和回滚机制防止版本不匹配,更新可从界面执行并经过 SHA256 校验。

💳 套餐与支付(可选)

套餐:价格、时长、流量和设备数限制;价格为 0 即为免费套餐。套餐可以有自己的流量重置周期 (每日 / 每周 / 每月 / 每年),用于“每月 100 GB,按年付费”这类资费;留空时,付费套餐的流量额度覆盖整个期限, 免费套餐则每个期限重置一次。支持试用期、到期用户的免费后备套餐、续期以及用户在套餐之间迁移。 收款——选择支付服务商:YooKassa、PayPalych、RioPay、RollyPay、SeverPay、Platega、PayPear、 AuraPay(银行卡、SBP、₽)、YooMoney(转账到个人钱包——无需公司或合同)、CryptoBot 和 Heleket(加密货币)、 Telegram Stars(在机器人中,₽ 价格按你设定的汇率换算)。客户在机器人或订阅页面上付款,套餐会自动激活。 由 Webhook 确认支付(校验签名),轮询覆盖 Webhook 始终未到达的情况;处理是幂等的,并会核对金额与订单是否一致。 手动支付是与之并列的独立方式:在支付 → 收款中开启后,会显示你自己的收款信息——文字加一张图片,二维码或收款信息截图——由管理员确认转账。

  • 灵活套餐——套餐可以出售额外设备(按每台设备每周期定价,有上限):随套餐一起选择,续期时保留并付费, 期中追加则按剩余天数计费。额度之外的流量包有效期至下一次流量重置。用户可以在套餐有效期内切换套餐: 换成更贵的——按剩余天数补差价,到期日不变;换成更便宜的——免费,剩余天数按新套餐价格重新折算。
  • 余额——在机器人和订阅页面上充值,可全额或部分用余额支付套餐,并可从余额自动续期(可关闭)。
  • 优惠码——百分比或 ₽ 折扣、订阅天数、余额赠送;可设置使用次数上限、有效期、限定套餐以及仅限首次购买。
  • 邀请——个人专属的机器人链接;被邀请者付款后,邀请人可获得一定比例的余额或订阅天数。
  • 长期折扣——一次购买多个周期的套餐,价格更低,每个周期重置流量。
  • 挽回(默认关闭)——付费订阅结束若干天后,用户会在机器人中收到一个一次性的个人优惠码,并已自动应用于下一次付款。
  • 流失用户调查(默认关闭)——付费订阅结束一天后,机器人会询问原因(太贵、效果不好、不再需要、换了其他服务、自行填写);订阅页面也会提出同样的问题。回答显示在漏斗中,并通过 user.churn_answer webhook 发送。
  • 面板中——用户卡片中的余额和历史记录、邀请关系、优惠码使用情况、邀请排行、退款到余额、销售漏斗。 支付系统发起的退款或拒付会被自动识别:该订单从收入中扣除,并收回其购买的内容。
  • 来源标签——机器人链接 t.me/<bot>?start=<tag> 标记用户来自哪里(广告、帖子、合作伙伴);漏斗按标签显示注册、 付款和收入。自有机器人通过 API 设置。
  • 共享黑名单(默认关闭)——被其他 VPN 服务因转卖、扫描、共享或欺诈而封禁的 Telegram 账户 (BEDOLAGA-DEV/VPN-BLACKLIST 或你自己的列表): 它们无法在机器人中注册;已注册的账户会在其卡片中标记。
  • 可疑活动——同一地址反复领取试用、同一设备用于多个账户、自我邀请、优惠码和支付的突发、银行卡反复失败、拒付; 每一行都列出相关账户。
  • 自动消息——当有人打开了机器人却没有注册、注册了却从未连接、领取了试用却从未付款、不再使用仍有效的订阅, 或付费期限到期时,机器人会主动发送消息;每次事件只发一次,在你设定的延迟之后发送,并可附带已自动应用于下一次付款的 个人优惠码。每条规则都会显示发送给了多少人,以及其中多少人在 30 天内付款。
  • 回调日志——支付系统发送的每一条通知,包括其内容以及面板的处理结果(已入账、重复、金额不符、订单不存在、 签名校验失败);保留 30 天。

Warning

支付服务商尚未在真实账户上验证。如果你已经接入其中某一家,请 提交 issue 告诉我们是否可用(哪家服务商、哪些正常、哪些出了问题)。 这样才能将已验证的服务商标记出来,并修复其余的问题。

👥 访问、角色与审计

角色是所有者自建的权限集合(管理员 → 角色):按板块——用户、组、套餐、服务器、路由、设置、安全—— 各有“读取”和“写入”两个勾选框,另外还有若干比其他操作风险更高的独立权限:删除和导出用户、支付服务商密钥、群发、 Webhook、API 密钥、更新、日志以及面板日志。没有“写入”权限时板块以只读方式打开;没有“读取”权限时板块不会出现在菜单中。 Webhook 权限包含读取用户和支付信息。内置两个角色:管理员(除面板日志外的全部权限)和运营(用户、组、统计)。 唯一的所有者拥有全部权限,并且只有所有者能触及比任何角色都更高的内容:管理员和角色、Telegram 机器人 (管理员机器人的聊天会收到登录提醒,并可结束任意管理员的会话)、备份、恢复和出厂重置,以及完全访问权限的 API 密钥。 每次请求都会在服务器端检查权限,角色的修改会在其持有者的下一次请求时生效。API 密钥被授予确切的 API 方法, 按板块勾选——REST 和 MCP 只能执行这些操作,任何人都无法授予密钥超出自身权限的能力。新管理员会获得一个临时密码, 首次登录时必须修改。双因素认证(TOTP):每位管理员自行开启——在密码之外再输入认证器应用(Google Authenticator、 Aegis、1Password)中的验证码,密钥在数据库中加密存储,设置完成后不会再返回;手机丢失时,在服务器上执行 rospanel totp reset <login>;功能更完整的 rospanel rescue 可以重置遗忘的密码、清除第二因素,或在没有任何管理员 能登录时重新创建所有者。两项无法撤销的操作——出厂重置和删除服务器——需要输入密码,对于已开启双因素的管理员, 还需要一个新的验证码:登录时用过的验证码已经失效,因此被人偷看到的单个验证码只能换来一次操作,而不是所有操作。 每位管理员还能在账户对话框中看到自己的活动会话——浏览器和操作系统、最后使用的地址、登录时间——可以结束其中任意一个, 或一键退出其他所有会话;以这种方式结束的会话在下一次请求时即失效,面板日志会记录谁结束了什么。 管理员从未使用过的地址登录时,会推送到 Telegram(机器人设置中的“从新地址登录”类别):谁、从哪里(IP、国家、网络)、 用的什么浏览器。消息下方有一个“不是我”按钮——一键结束该管理员的所有会话,之后只需修改密码。 用户日志记录对用户做了什么以及由谁执行(管理员、API 密钥、机器人、用户本人、系统),用户删除后依然保留。 面板日志(所有者可见)涵盖登录和带 IP 的失败尝试、第二因素的开启和关闭、设置变更以及备份; 只记录成功的操作,从不记录请求内容。面板日志支持搜索(对操作、对象、管理员和 IP 进行全文搜索), 可按类别和日期范围筛选,当前视图可一键导出为 CSV。两种日志均保留一年。

🤖 集成

Telegram 中的管理员机器人:用户管理、套餐、订阅 QR 码、定时备份、事件通知(注册、到期、Xray 故障、支付、证书)。

客户端机器人:自助注册、包含订阅和统计信息的个人菜单、购买套餐——以及发给用户的个人通知:订阅即将到期、 流量即将用尽、已收到付款。

客服机器人——第三个机器人:用户私信它,对话会进入你的论坛群组,每人一个话题;你直接在群里回复, 回复会通过机器人发回给对方。

群发——九种受众划分(所有人、有账户和无账户的、活跃的、已到期的、即将到期的、长期不活跃的、从未连接过的), 可附带图片和按钮。投递由收件人表驱动,因此中断的群发会继续而不是重新开始,也不会有人收到两次。 群发可以定时发送,收件人在发送时确定。

月度总结——每月 1 日管理员机器人发送上月总结:收入、用户、流量、服务器可用率和故障。

用户自行更换链接——在允许时(设置 → 订阅,每小时到每 30 天一次),用户可在订阅页面为泄露的链接换一个新链接,旧链接立即失效。从该页面将账户转移到另一个 Telegram 也可以同样限制频率(设置 → Telegram)。

带命名密钥(Authorization: Bearer)的 REST API,由代码生成的 OpenAPI 以及 Swagger UI。它覆盖面板的两半: 你所运营的用户、套餐、订单和服务器,以及其背后的配置——设置、按服务器的路由和 DNS、带回滚的配置还原点。 管理员、API 密钥和面板的秘密路径刻意不对外开放。Webhook 发送经 HMAC-SHA256 签名的事件并支持重试。 Prometheus 指标位于 /<api-path>/v1/metrics,使用同一个密钥——用户、流量、吞吐量、主机状态以及每个节点一个序列; 现成的 Grafana 仪表盘见 docs/grafana/rospanel.json(Dashboards → New → Import)。 MCP 服务器将同一套 API 提供给 AI 助手,工具列表由该 OpenAPI 文档生成:把 …/v1/mcp/<key> 粘贴到支持 URL 的助手中即可, 无需在任何地方安装任何东西。密钥的方法决定助手能获得哪些工具:如果只想让助手查看,请勾选“只读”。详见 docs/api/。

从外部系统注册——POST /v1/signup 按客户在外部系统中的 ID(邮箱、账号)注册客户,遵循机器人的规则: 关闭注册、邀请码、审核、频率限制、每个 ID 一个账户和一次试用。请为外部系统的密钥勾选此方法,而不是创建用户的方法。 已有账户的客户通过 PATCH /v1/users/{id} 获得该 ID。你自己的机器人按 telegram_id 注册,遵循内置机器人的规则: 每个 Telegram 一次试用、共享黑名单、立即绑定 Telegram。

你自己的订阅页面——GET /v1/users/{id}/subscription 以数据形式提供整个页面:各项数字、应用导入、配置、设备、 优惠以及 Telegram 绑定链接(tg_link)。设置设置 → 订阅 → 自有订阅页面(https://example.com/cabinet?sub={token})后, 用浏览器打开订阅链接就会跳转到那里;应用则照常获取订阅。

接入助手只需一个 URL,无需本地安装。在设置 → API 中创建密钥(勾选其可执行的操作),从同一页面获取基础地址,然后粘贴:

https://vpn.example.com/<api-path>/v1/mcp/<key>

这个地址本身就是凭据——与其中的密钥同等机密,密钥一旦被撤销,地址立即失效。助手只会获得该密钥允许的工具。

状态页面——可选的公开页面(设置 → 常规),显示哪些服务器在线以及 90 天的可用性历史。 只显示名称和可用性:没有地址、没有用户、没有流量;在你开启之前,页面根本不存在。 在同一界面发布故障和计划维护:标题、说明、受影响的服务器以及维护时间段,并可通过机器人发送给所有订阅有效的用户。 每条记录都有事件进展(调查中、已找到原因、观察中、结论);当前及三天内的记录也显示在订阅页面上;可通过 /v1/incidents 管理,并有 incident.* 事件。计划维护可在维护期间将相关服务器从订阅中移除。 记录结束后,一个按钮即可补偿其时长:为开始时订阅有效且可使用相关服务器的每位用户增加相应小时数,并在机器人中通知。

🧩 插件(beta)

在面板内运行的社区代码:通知、集成、基于面板事件和定时任务的自定义逻辑。插件可以添加支付方式、用户卡片上的字段和按钮、 仪表盘小组件、订阅页面上的区块、机器人中的按钮和命令,可以参与注册、设备绑定和定价的决策,或者重新设计订阅页面的样式。 插件是一个带有清单的 JavaScript 文件;面板在 WebAssembly 沙箱中运行它,提供独立的数据库以及内存和时间限制, 因此出问题的插件会被暂停,而面板不受影响。安装前,管理员可以看到它请求的权限——面板 API 权限和可访问的互联网主机—— 并可以阅读其代码;除此之外它什么都访问不到。在设置 → 插件中通过 zip 文件或链接安装。也可以直接在这里编写插件: 规则构建器(“当这个事件到来且满足这个条件时,执行那个操作”——Telegram、Discord、HTTP、续期、打标签)或代码编辑器, 并可在沙箱中测试和试运行。插件作者可以使用 rospanel plugin new | test | dev | pack,无需 Node; 参见 docs/plugins 和 examples/plugins。

🌍 语言(RU / EN / 中文 / العربية / فارسی)

界面 语言来源
面板 管理员自己的选择(按浏览器),否则使用浏览器语言
订阅页面 Accept-Language
客户端机器人和客服机器人 每个人的 Telegram 语言
管理员机器人 面板全局设置(设置 → Telegram)
CLI 英语

🎨 品牌与主题

用你自己的名称和 Logo 替换“RosPanel”——在面板和订阅页面中均生效。强调色会重新渲染整个界面, 深色模式会自动适配文本、状态和图表。

🛡️ 滥用检测

面板将 Xray 访问日志中的目标 IP 地址与恶意网络列表进行比对,并只记录命中项——普通流量从不保存。 它只有一个目的:当收到针对服务器地址的滥用投诉时,你能查出那是谁的流量。

列表为 FireHOL level 1:僵尸网络的命令与控制服务器、攻击者和垃圾邮件网络。这是一个经过筛选、误报极少的级别, 不包含 CDN 和共享主机。此外还有你自己的列表(IP/CIDR),会优先检查。命中项会显示在统计和用户卡片中, 并归属到流量出去的那台服务器;超过每日阈值时会发送 Telegram 通知。类别、自定义列表、阈值和更新都在 设置 → 屏蔽列表中配置。

通知并不是唯一的响应方式。同一选项卡中还可以配置自动措施——三级阶梯,每级都有自己的每日命中阈值(0 表示关闭该级): 通过用户的 Telegram 机器人警告用户(每天一次)、将其限速到指定值、关闭访问。限速和关闭会持续设定的时间 (一小时到 30 天),之后面板会自动恢复原来的速度或重新开启访问,并通知用户;每一步用户和管理员都会收到通知, 并记录到日志中。手动启用用户或修改其速度会覆盖该措施——管理员的决定不会在之后被面板“撤销”。节点流量同样计入: 命中项在主服务器上汇总,限速和用户状态通过常规同步下发到节点。

检查基于地址而非域名,这并不是一种简化。现代客户端在隧道外解析 DNS,并对 SNI 加密(ECH), 因此到达服务器的只有一个裸 IP。

命中记录保留 30 天——足以处理投诉。

允许客户端从哪里连接(设置 → 常规)。国家规则——只允许这些国家,或除这些国家外都允许——与面板已为每个连接记录的信息进行比对, 在主服务器和每个节点上都生效,因此该规则覆盖所有协议,包括不经过 Xray 的协议。被丢弃的是地址,而不是账户: 违规者的 IP 会被加入每台服务器上的 nftables 集合(时长由管理员设定,自动过期),而账户在策略允许的地方仍可正常使用。 在开启强制执行之前,违规只会被记录——写入用户日志和一个列表,管理员可以在让规则真正断开任何连接之前先查看—— 任何封禁都可以手动解除。geo 表无法定位的地址从不会被拒绝:该表并不完整,而把真实用户从正常服务中切断, 是这个功能绝不能出现的一种故障。

受信任地址(设置 → 常规 → 防护与容错)是面板从不自动封禁的 IP 和网段:不会因猜测 SOCKS/HTTP 密码而封禁, 不会因扫描面板而封禁,也不受来源策略约束(策略拒绝对它们只做记录)。适用于办公室或位于共享地址之后的你自己的服务器; 保存时,已针对它们的封禁会被解除。

封禁地址(用户卡片 → 设备(IP))——该 IP 会在主服务器和每个节点的防火墙上被丢弃,直到解封。 所有封禁(手动或自动)以及解封,都在用户 → 统计中。

🧰 运维与安全

诊断一键完成:Xray 进程、AmneziaWG 隧道、配置应用情况、TLS 到期时间、磁盘空间、geo 数据库的新旧程度、 出口健康状态——每项检查都附有提示。另有独立的连接自检,以真实客户端的身份连接每种协议,确认流量确实能出去—— 在用户发现之前就能捕获凭据、TLS 或 ALPN 的偏差。备份 / 恢复和重置可以在面板和 CLI 中执行。 从面板恢复时需要输入密码,开启 2FA 时还需要一个新的验证码——如果备份中的所有者或管理员开启了 2FA, 还需要该备份对应认证器的验证码,首次运行向导中也是如此,因此仅持有文件而没有认证器的人无法恢复受 2FA 保护的面板备份。

跨国可访问性:从您选择的国家(俄罗斯、中国、伊朗等)的 Globalping 探针对每台服务器的主端口进行 TCP ping——可在服务器卡片中手动检查,也可按计划运行。某国连续两轮无法连通时,管理员会收到 Telegram 通知,恢复时也会收到。

告警规则(服务器 → 告警):为 CPU、内存、磁盘、网络速度或在线用户数设置阈值——适用于所有服务器或某一台,并可设定持续时间。规则触发时,管理员会收到 Telegram 通知和 alert.fired webhook;恢复时会附上峰值和持续时长。历史记录保留 30 天。

更新只需一条命令:面板校验 SHA256,试运行二进制,创建备份,然后才替换自身,并将上一个版本保留在旁边。 定时自动更新(设置 → 常规):面板自行安装新版本,然后更新各服务器(systemd 安装方式;Docker 随镜像更新); 管理员机器人会报告执行了哪些操作。个人资料菜单中的“更新内容”显示内置于二进制中的版本历史,并标出当前运行的版本。 Xray 内核固定为某个确切版本,并随面板更新一起分发:下次启动时,面板和每个节点会将已有的 Xray 与固定版本进行比较, 不一致时进行替换——先校验校验和;无法访问 GitHub 的机器会继续运行当前版本。Xray 崩溃时由监管进程重启。 看门狗则处理崩溃处理程序看不到的更棘手的情况——进程仍然存活但已停止服务:它会探测 Xray 的 API,如果连续多次检查 都无响应,就重启 Xray(带冷却时间,防止重启风暴)并通知管理员。在主服务器和每个节点上运行。

订阅页面自身的操作(取消套餐、付款、释放设备)只接受来自该页面的请求:链接中的令牌证明的是账户,而不是请求者是谁, 因此泄露的链接无法被其他网站用来执行操作。

数据库中的机密信息经过加密(AES-GCM)。会话令牌和 API 密钥只存储哈希值——即使能访问数据表,也无法冒用他人的会话。 更换密钥时,面板会重新加密它保存的所有机密:用户密码和密钥、节点密钥(REALITY、WARP、AmneziaWG)、Webhook 密钥、 自定义入站密钥、系统代理密码、管理员第二因素、支付服务商配置以及插件设置。确认支付和管理管理员需要重新输入密码。 出站请求有 SSRF 防护,入站暴力破解通过 nftables 封禁(带时限的集合条目,由内核自动过期),每个 IP 的连接数也通过 nftables 限制。


🛠️ CLI

rospanel                     运行面板(通常通过 systemd)
rospanel install             安装 systemd 服务并启动(需 root)
rospanel uninstall [-y]      删除服务(保留数据)
rospanel start|stop|restart  服务控制
rospanel status              服务状态
rospanel update [-y]         更新到 GitHub 上的最新版本
rospanel backup [file]       .tar.gz 快照(数据库 + 加密密钥 + 证书 + Xray 配置)
rospanel restore [-y] <file> 从快照恢复(在启动时应用)
rospanel host [-y] [domain|IP] 查看/修改地址(重新签发 TLS 证书)
rospanel path                显示面板 URL 并检查 secrets.key / 数据库
rospanel totp reset <login>  移除管理员的双因素认证(手机丢失);仅输入 totp 则列出
rospanel rescue <sub>        恢复被锁定的访问:list | password | unlock | owner
rospanel reset [-y]          恢复出厂设置(清空数据库)
rospanel plugin <sub>        插件作者工具:new、validate、pack、test、dev
rospanel version             版本
rospanel help                完整帮助

破坏性命令(reset、restore、host、uninstall)会要求确认;-y 参数可跳过确认。

节点模式

同一个二进制也可以作为受面板管理的节点运行。install 命令由面板中的“添加节点”对话框生成——通常无需手动输入。

rospanel node install --join '<url>'   加入面板并安装服务(需 root)
rospanel node run                       节点代理程序(systemd 入口)
rospanel node set-panel <url>           将节点指向新的面板地址
rospanel node status                    本地节点状态
rospanel node uninstall [-y]            删除节点服务(保留数据)

--join 来自添加节点对话框;其中的令牌只能使用一次,有效期 24 小时。 完整步骤请参见 🌐 添加节点。


🧱 架构

唯一的数据来源是 SQLite;Xray 配置始终由它生成,并由监管进程应用。Web 面板内嵌在二进制中。

技术栈:Go 1.26 · Xray-core · SQLite(modernc,无需 CGO)· React + Vite + Tailwind。


⚠️ 免责声明

本软件按“原样”提供,不附带任何形式的保证。

本项目仅供教育和研究用途:学习网络协议、TLS 和代理技术,CTF 和网络安全实验,经授权的渗透测试, 以及管理你自己的基础设施。本项目不得用于规避合法限制或任何其他违法活动;伪装机制的存在是为了研究相关技术, 以及在经批准的测试范围内检验服务的韧性。

安装、配置和运行本软件以及遵守所在司法管辖区法律的责任由服务器运营者承担。作者和贡献者不对第三方如何使用本项目负责。


💻 开发

# 前端(修改 web/ 之后)
npm --prefix web install
npm --prefix web run build      # → web/dist(嵌入二进制)

# 二进制
go build -o rospanel ./cmd/rospanel
./rospanel

本地化。面板的词典是 web/src/i18n/{ru,en,zh,ar,fa}.ts,均以 ru.ts 为类型基准:任何一个缺失的键都会导致构建错误, 而不是悄悄回退。由 Go 自行渲染的部分——机器人和订阅页面——位于 internal/i18n/;后端只向面板传递键和参数, 从不传递渲染好的文本。再增加一种语言,只需在两侧各增加一个词典。

常用的环境变量(均为可选):ROSPANEL_DATA(数据目录)、ROSPANEL_ADMIN_ADDR(面板的回环地址,默认 127.0.0.1:8080)、 XRAY_BIN、ROSPANEL_HOST、ROSPANEL_ACME_EMAIL、GOMEMLIMIT。未设置 GOMEMLIMIT 时,面板会将 Go 堆保持在一个软限制之下: 机器内存的一半(节点上为四分之一),如果 cgroup 限制更低则以其为准;启动日志会显示该数值。

主机防火墙。如果服务器上使用 ufw、firewalld 或带丢弃策略的 iptables INPUT/FORWARD,面板(以及每个节点)会在其中为正在运行的通道 开放端口,并允许 AmneziaWG 隧道通过 FORWARD——使用自己的 ROSPANEL-IN/ROSPANEL-FWD 链,或作为 firewalld 运行时规则—— 并在通道关闭时撤销这些规则。ROSPANEL_HOSTFW=off 可关闭此功能。

防洪保护(公共 TCP 端口上的 nftables 限制,参见“运维”)同样通过环境变量配置——当整个办公室或某个 CGNAT 运营商 位于同一个 IP 之后、客户端触及默认限制时,这很有用:

变量 作用
ROSPANEL_CONNLIMIT=off 完全禁用限制(删除 nftables 规则)
ROSPANEL_CONNLIMIT_MAX 单个 IP 的最大并发 TCP 连接数
ROSPANEL_CONNLIMIT_RATE 单个 IP 每秒最大新建连接数

当前状态可在仪表盘 → 管理 → 诊断中查看:如果未安装 nftables 或面板未以 root 身份运行,规则会悄无声息地不生效—— 诊断会提示这一点。

欢迎提交 PR 和 issue。提交信息遵循 Conventional Commits: release-please 依据它们发布版本,并将二进制和 Docker 镜像发布到 GHCR。


💝 支持项目

RosPanel 利用业余时间开发并免费发布。如果这个面板对你有帮助,最简单的支持方式是 DonationAlerts 或 Boosty(俄罗斯银行卡,一次性或定期)。谢谢!🙏

加密货币

USDT。选择网络并仔细复制地址——发送方和接收方的网络必须一致。只发送 USDT,并且只使用所列的网络: 在错误网络上的转账无法找回。TRON(TRC20) 和 TON 的手续费最低。

网络 代币 地址
TRC20 (Tron) USDT TJwyrPVEZVZ1YrcmDiZTyFjLo3Q2DmEGzs
ERC20 (Ethereum) USDT 0xf9d663146ce902da91911b214c71cc73a5269d1d
Solana USDT 2qAZRTbaUMTfYuZbD1dCYHjkYgxkw4dUYE9XY3JhC2Cs
TON USDT UQDoat731MLYuIw8ayL3Vhhw7zTBbLvRaQFmDvab--CNNI7e

Bybit。如果你也在使用 Bybit——转账到 UID 136462734:即时到账且免费。

无法在经济上支持?你仍然可以提供帮助——通过获取服务器中的推荐链接租用服务器。 这不会让你多花一分钱,却能帮助项目。


📄 许可证

GNU Affero General Public License v3.0(AGPL-3.0)。

本项目可以自由使用、修改和自托管。如果你通过网络提供面板修改版本的访问(包括作为服务提供), 则必须以相同的条款公开你所做修改的源代码。