一个面板同时搞定翻墙协议(VLESS-Reality / Trojan / VMess / Hysteria2 / TUIC / AnyTLS)、转发中转、以及每用户限速 / 流量 / 到期。
- 🌐 博客 / 导航站:3yuedaohang.com
▶️ YouTube:@zhanzhang3yue
- 协议管理:一键在机器上搭全套翻墙协议(VLESS-Reality / Trojan / VMess / Hysteria2 / TUIC / AnyTLS),出订阅给用户
- 中转:前置机搭协议 + 落地出口(住宅 socks / 机场节点 / 你的节点),给用户干净出口 IP,自带在线测落地
- 端口转发 / 隧道转发:通用端口搬运、两级加密中转
- 限速 / 流量 / 到期:每个用户独立限速(TCP+UDP 都限)、流量配额、到期时间
- 订阅按线路:一个用户可有多条订阅,直连 / 各中转各自独立
- 中央管理:一台面板管所有转发机,节点一条命令上线
本项目基于 go-gost/gost 和 go-gost/x 两个开源库。
只有两条命令。先在一台机器装面板端,再到每台转发机装节点端。
面板端(中央管理面板,一台即可,全自动;需要 Docker,脚本会自动装):
curl -L https://raw.githubusercontent.com/TEAMO233/Tms/main/panel_install.sh -o panel_install.sh && chmod +x panel_install.sh && ./panel_install.sh节点端(转发机,每台要做转发的机器都装;裸二进制,不需要 Docker):
装好面板后,在面板里生成节点端命令,不用手敲——
登录面板 → 左侧「转发机监控」→「新增」填该机器的 IP → 保存 → 点该机器的「安装」→ 复制弹出的命令,到那台机器上执行即可。
弹出的命令已自动带上「面板地址 + 该机器专属密钥」,全自动、无需手输(密钥是新增转发机时才生成的,只有面板知道,所以节点端必须从面板生成)。
手动方式(不推荐)
也可直接在机器上跑下面裸命令,它会 交互式询问 面板地址和密钥(密钥同样得先在面板「转发机监控」新增该转发机才有):
curl -L https://raw.githubusercontent.com/TEAMO233/Tms/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh国内机器直连 GitHub 会超时(卡在下载那一步)。用 ghfast.top 镜像 + -c 参数(-c 强制内部下载 gost 也走国内镜像,不靠自动检测),把面板给你的「面板地址」「密钥」填进去:
curl -L https://ghfast.top/https://raw.githubusercontent.com/TEAMO233/Tms/main/install.sh -o install.sh && chmod +x install.sh && ./install.sh -c -a 面板地址:端口 -s 你的密钥- 面板地址、密钥从面板「转发机监控 → 新增该机器 → 点安装」弹出的命令里拿;
- 若
ghfast.top某天失效,换个镜像重试:把命令里的ghfast.top整体替换,并在前面加GH_MIRROR=https://新镜像/(让内部下 gost 也走它)。常见备选:gh-proxy.com、ghproxy.net、mirror.ghproxy.com。
- 账号: admin_user
- 密码: admin_user
⚠️ 首次登录后请立即修改默认密码!
装好面板后,服务器上会生成一个 tms 管理命令(类似 x-ui),随时输入即可打开管理菜单:
tms菜单里可以:更新 / 卸载 / 彻底清理(purge) / 查看运行状态 / 查看访问信息(地址、账号) / 配置域名。
也可以直接带参数用:
| 命令 | 作用 |
|---|---|
tms |
打开管理菜单 |
tms update |
更新面板到最新版 |
tms status |
查看运行状态 |
tms info |
查看访问地址 / 账号 |
tms domain 域名 |
给面板配域名 + HTTPS |
tms domain |
查看当前域名状态 |
tms domain off |
关闭域名,回到 IP:端口 |
tms export |
导出数据库备份 |
tms purge |
彻底清理(卸载并清空容器/镜像/卷/命令) |
面板和转发机的域名是两件独立的事,解决的问题也不一样。
默认只能 http://IP:6366 访问,浏览器会标"不安全"。配了域名之后走 HTTPS,订阅链接也会跟着变成域名。
tms domain panel.example.com背后用 Caddy 自动申请和续期 Let's Encrypt 证书,会依次检查:域名解析是否指向本机 → 80/443 有没有被占 → 写配置 → 起 Caddy → 等证书签发(最多 60 秒)。
前置条件:
- 域名已经解析(A 记录)到面板服务器
- 80 和 443 端口空闲(装了宝塔的话先停掉它的 nginx)
- 云服务器安全组放行 80、443
💡 原来的
IP:6366会保留作为备用入口,域名出问题时还能进得去。
⚠️ 配了域名后,已经发出去的旧订阅(IP 版)不会自动更新,要让车友重新拉一次。所以建议装好就配,人越少越好办。
车友拿到订阅后,能在客户端里看到每个节点的地址。默认显示的是转发机的真实 IP。
在「转发机」→ 编辑 → 连接域名(可选) 里填一个域名,车友看到的就变成域名了:
美国机 us.example.com → 解析到 203.0.113.10
香港机 hk.example.com → 解析到 203.0.113.20
国内机 cn.example.com → 解析到 203.0.113.30
一台转发机一个子域名(同一个域名下开子域名即可,不用买多个),填之前先去 DNS 加好 A 记录。留空则维持原样显示 IP。
好处除了不暴露 IP,还有:机器 IP 被墙时改条 DNS 解析就活了,不用通知车友重新拉订阅。
⚠️ 这只是"不直接显示",不是真正的隐藏。 对方ping一下域名照样拿到 IP。 要做到查都查不到,只有走 CDN(Cloudflare 橙云),而目前一键搭建的六个协议 (VLESS-Reality / Trojan-Reality / VMess / Hysteria2 / TUIC / AnyTLS)都过不了 CDN —— Reality 要跟真实服务端直接握手、Hysteria2 和 TUIC 走 UDP,CF 都不转发。 挡普通车友足够,防封锁不行。
先分清两种机器,卸载方式完全不同:
| 角色 | 装了什么 | 有 tms 命令吗 |
|---|---|---|
| 面板机(只有一台) | Docker:MySQL + 后端 + 前端 | ✅ 有 |
| 节点机 / 转发机(每台) | gost + sing-box(systemd 服务) | ❌ 没有 |
⚠️ tms purge和panel_install.sh purge只清面板,对节点机上的 gost 一点作用都没有。反过来,清节点也不会影响面板。两边要分别执行。
在面板安装目录下执行:
tms purge删除所有容器、镜像、数据卷、网络、配置文件和 tms 管理命令。也可以直接输入 tms 打开菜单选「彻底清理」。
如果 tms 命令不在了(比如当初就没装成功),用一次性脚本:
curl -L https://raw.githubusercontent.com/TEAMO233/Tms/main/panel_install.sh -o /tmp/tms.sh && bash /tmp/tms.sh purge💡 最好 cd 到当初安装面板的目录再执行。不在那个目录时,脚本会从
/usr/local/bin/tms里读回安装目录并自动切过去; 那个文件也没了的话,容器和镜像照样按名字清掉,只是安装目录里的docker-compose.yml/.env要你自己删。 脚本会检查当前目录的docker-compose.yml是不是 TMS 的,不是就跳过 compose 清理,避免误删你其它项目的容器和.env。
用 git clone + docker-compose-hybrid.yml 本地构建起来的面板,管理命令同样是 tms:
tms purge或者输入 tms 打开菜单选「7) 彻底卸载」。它会删掉容器、本地构建的镜像、数据卷(含数据库数据)、
网络和 tms 命令;源码目录会保留,确认不要了自己 rm -rf 即可。
🚨 面板机同时也当转发机用的话,千万别在它上面跑这段。 很多人把面板和第一台转发机装在同一台机器上,这段命令会把本机的节点服务一起停掉并 disable —— 所有协议瞬间全部失效,而面板里节点还显示「在线」(gost 是另一个服务,它还活着), 极难联想到是刚才那条命令干的。只想卸载其它转发机时,请 SSH 到那台机器上执行。
万一误跑了,恢复:
systemctl enable --now sing-box——必须带enable,因为它被disable过,只start的话重启机器又会消失。
每台转发机都要单独执行,直接复制这段:
systemctl stop gost sing-box 2>/dev/null
systemctl disable gost sing-box 2>/dev/null
rm -rf /etc/systemd/system/sing-box.service.d /etc/gost
find /etc/systemd /run/systemd \( -name 'gost.service' -o -name 'sing-box.service' \) -delete 2>/dev/null
systemctl daemon-reload
systemctl reset-failed 2>/dev/null
echo "✅ 节点已卸载(gost + sing-box + 配置 + 证书)"
⚠️ 别只删/etc/gost。搭过协议的机器上还有 sing-box,它的服务文件在/etc/systemd/system/,只删安装目录的话二进制没了、服务还注册着,systemd 会一直重启失败刷满日志。
💡 上面用
find ... -delete而不是直接rm服务文件,是为了连multi-user.target.wants/里的软链接一起清掉。正常情况systemctl disable会删它们,但服务已经异常时可能残留,结果systemctl list-units --all里一直挂着一条not-found,看着像没卸干净。
也可以重新下节点脚本走菜单(选 3 卸载):
curl -L https://raw.githubusercontent.com/TEAMO233/Tms/main/install.sh -o /tmp/n.sh && chmod +x /tmp/n.sh && /tmp/n.sh💡 国内机器(阿里云等)大概率下不动 GitHub,直接用上面那段命令。
面板机:
docker ps -a | grep -E 'gost-mysql|springboot-backend|vite-frontend'
command -v tms节点机:
systemctl list-units --all | grep -E 'gost|sing-box'
ls /etc/gost都没有输出就说明干净了。
卸载不会动防火墙规则,之前给转发开的端口还留着。不打算再装的话:
ufw status numbered # 看编号
ufw delete <编号> # 逐条删云服务器还要去控制台把安全组里对应的入方向规则删掉(阿里云、腾讯云、evoxt 等)。端口后面没服务在听,留着也不影响安全,看个人习惯。
本项目仅供个人学习与研究使用,基于开源项目进行二次开发。
使用本项目所带来的任何风险均由使用者自行承担,包括但不限于:
- 配置不当或使用错误导致的服务异常或不可用;
- 使用本项目引发的网络攻击、封禁、滥用等行为;
- 服务器因使用本项目被入侵、渗透、滥用导致的数据泄露、资源消耗或损失;
- 因违反当地法律法规所产生的任何法律责任。
本项目为开源的流量转发工具,仅限合法、合规用途。
使用者必须确保其使用行为符合所在国家或地区的法律法规。
作者不对因使用本项目导致的任何法律责任、经济损失或其他后果承担责任。
禁止将本项目用于任何违法或未经授权的行为,包括但不限于网络攻击、数据窃取、非法访问等。
如不同意上述条款,请立即停止使用本项目。
作者对因使用本项目所造成的任何直接或间接损失概不负责,亦不提供任何形式的担保、承诺或技术支持。
请务必在合法、合规、安全的前提下使用本项目。