基于 Cloudflare Workers + Durable Objects 的 Telegram WEB Proxy 独立实现。在 Worker 内完成 MTProxy 混淆流转换并直连 Telegram 数据中心,不需要 VPS、后端 MTProxy 或管理面板。
Telegram Android → HTTPS / WebSocket → Worker + Durable Object → Telegram DC:443
支持 WebSocket 多路复用、连接内保序、独立队列、流控与超时清理。仅连接代码内预设的 Telegram DC,不接受任意 TCP 目标。
本项目是 Worker,不是 Pages。仓库已包含入口、Durable Object 绑定及迁移配置,不需要填写
dist输出目录。
- 点击按钮,登录 Cloudflare,按提示连接 GitHub 并创建仓库。
- 保留默认 Worker 名称,或自行修改。
- 按提示填写
PROXY_SECRET,确认部署。所需 Durable Object 会自动创建。 - 部署完成后,记录 Worker 的
*.workers.dev地址。
如果部署页面未要求填写 Secret,进入:
Workers & Pages → 选择 Worker → Settings → Variables and Secrets → Add
添加名称为 PROXY_SECRET 的 Secret(机密),不要使用普通明文变量。值必须是 32 位小写十六进制字符串,也支持 dd 加 32 位小写十六进制字符串;不支持 ee / FakeTLS。请使用自己的密钥,不要照抄示例。
保存并按控制台提示部署,使配置生效。
- Fork 本仓库。
- 在 Cloudflare 的 Workers & Pages → Create application → Import a repository 中选择 Fork 后的仓库。
- 使用以下配置:
| 配置 | 值 |
|---|---|
| Production branch | main |
| Build command | 留空或 npm test |
| Deploy command | npx wrangler deploy |
| Root directory | / |
- 保存并部署,再按上一节添加
PROXY_SECRET并使其生效。
需要 Node.js 22.15+(推荐 24 LTS)、npm 和 Cloudflare 账户。
git clone https://github.com/coldboy404/cf-webproxy.git
cd cf-webproxy
npm ci
npx wrangler login
npx wrangler secret put PROXY_SECRET
npm test
npx wrangler deploy运行 secret put 时按提示输入自己的密钥。部署成功后,终端会显示 Worker 地址。
Windows PowerShell 如果提示禁止执行
npx.ps1,将命令中的npx改为npx.cmd;npm也可使用npm.cmd,无需修改系统执行策略。
如果 workers.dev 在你的网络中无法稳定访问,可绑定托管在 Cloudflare 的自定义域名:
- 打开 Worker → Settings → Domains & Routes → Add → Custom Domain。
- 填写域名,例如
proxy.example.com,等待证书签发完成。 - 在 Telegram 中使用这个域名作为入口。
无需修改 wrangler.toml:PUBLIC_HOSTNAME 默认留空,自动使用请求主机名。仅当需要限制入口域名时才填写它。不要将个人域名写入公共仓库的 [[routes]],以免其他账号 Fork 后部署失败。
在支持 WEB Proxy 的 Telegram Android 客户端打开:
https://t.me/webproxy?server=proxy.example.com&secret=你的PROXY_SECRET
- 将
proxy.example.com替换为你的 Worker 域名,不要添加https://或路径。 secret必须与 Cloudflare 中的PROXY_SECRET完全一致,包括可选的dd前缀。- 配置后实际测试消息收发;浏览器能打开域名不代表代理一定可用。
正常使用只需要配置 PROXY_SECRET,其他项保持默认即可。
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PROXY_SECRET |
Secret | 必填 | 32 位小写十六进制密钥,可加 dd 前缀。 |
PUBLIC_HOSTNAME |
环境变量 | 空 | 可选,限制入口主机名,不含协议或路径;为空时使用请求主机名。 |
MAX_STREAMS |
环境变量 | 64 |
每个会话允许的最大逻辑连接数。 |
SESSION_TTL_SECONDS |
环境变量 | 300 |
Bootstrap 凭证有效期(秒),不是已建立连接的最长时长。 |
DIAGNOSTICS |
环境变量 | 关闭 | 临时设置为 1 开启连接诊断,排障后删除或设为 0。 |
会话签名密钥由 PROXY_SECRET 域隔离派生,不需要手填 SESSION_SIGNING_KEY,也不会将派生密钥发给客户端。
访问 https://你的域名/healthz,正常返回:
{
"ok": true,
"carrier": "websocket",
"relay": "direct-telegram-dc"
}这只检查 Worker HTTP 入口,不验证 Durable Object 会话或 Telegram DC 连通性。根路径显示伪装页面是正常现象,只有通过 Bridge 鉴权的请求才会加载代理页面。
无法连接时,依次检查:
PROXY_SECRET是否已生效,是否与 Telegram 链接一致。- 自定义域名是否绑定到正确的 Worker,证书是否就绪。
- 若设置了
PUBLIC_HOSTNAME,是否与实际入口域名一致。 - 临时开启
DIAGNOSTICS=1,查看 Worker 日志;不要公开 Secret、会话 Token 或完整 Bridge URL。
延迟不是域名 Ping:Telegram 显示的延迟还包含 Worker / Durable Object 调度及到 Telegram DC 的链路耗时。连接稳定后再比较,并分别测试移动网络和宽带;代码优化无法保证所有网络都降到同一延迟。
- GitHub 自动部署:Fork 用户先同步上游;已连接 Workers Builds 的生产分支更新后会触发部署。
- 命令行部署:
git pull
npm ci
npm test
npx wrangler deploy更新成功后,在 Telegram 中关闭再开启代理,重建 Bridge 和会话。
npm ci
npm test
npx wrangler dev仅检查构建、不部署:
npx wrangler deploy --dry-run --outdir .wrangler-dry-run测试覆盖帧校验、连接内顺序、队列限额、流控、AES-CTR 转换及连接生命周期。模拟测试不能替代 Telegram 真机和 Cloudflare 生产网络验证。
- 协议参考 Telegram 官方 tproxy-server 的 PROTOCOL.md 和 ANDROID.md。本项目是独立实现,不是官方 Cloudflare 部署方案,也未实现全部载体模式。
- 不要提交
.dev.vars、真实 Secret、会话 Token 或带鉴权信息的 URL。 - 可用性受本地网络、Cloudflare TCP 出站限制及 Telegram 链路影响;使用时请遵守相关服务条款及所在地法律法规。