EasyTier WebSocket for Cloudflare Workers
项目简介
该项目是 EasyTier 的第三方服务端实现。EasyTier 是一个去中心化 P2P 组网程序,官方代码使用 Rust 实现。本项目使用 Cloudflare Worker + Durable Object 实现了 JavaScript 版本的 WebSocket 服务端,支持网络转发与 P2P 打洞信息交换。
WARNING注意:本项目仅供学习交流使用
核心改进特性
优化幽灵节点出现
- 秒级断线检测:最快 25 秒检测到断线设备
- 实时设备列表刷新:断线设备立即从所有客户端消失
- 全局单调递增版本号:防止 P2P 交叉污染和版本回退
增强网络稳定性
- 延迟优先模式:特权标志位加速路由收敛
- 私有网络支持:通过环境变量配置私有模式
- 更好的客户端兼容性:修复 Protobuf 握手包问题
技术架构
- 基于 Cloudflare Workers 和 Durable Objects
- 使用 WebSocket 协议进行实时通信
- 采用 Protocol Buffers 进行高效序列化
- 支持消息加密与完整性保护
- 模块化设计,便于扩展和维护
开发环境搭建
前置要求
- Node.js (>= 16.0.0)
- pnpm (推荐) 或 npm
- Wrangler CLI (Cloudflare Workers 工具链)
安装步骤
方法一(使用命令行)
前置准备
- 打开项目地址:https://github.com/Teleseon/cf-workers-et-ws 克隆项目仓库:
git clone <your-repo-url>cd easytier-ws-relay- 安装依赖:
pnpm install# 或者使用 npmnpm install- 安装 Wrangler CLI:
npm install -g wrangler- 登录 Cloudflare:
wrangler login- 成功登录后会显示类似信息:
⛅️ wrangler 3.x.x You are logged in with an API Token, associated with the email '你的邮箱@xxx.com'!┌───────────────────┬──────────────────────────────────┐│ Account Name │ Account ID │├───────────────────┼──────────────────────────────────┤│ 你的账户名 │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ││ 你的账户名 │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │└───────────────────┴──────────────────────────────────┘启动开发服务器测试
# 启动本地开发服务器pnpm run dev# 或者wrangler dev --ip 0.0.0.0直接启动测试(不监听文件变化)
pnpm run start# 或者wrangler dev部署:部署到 Cloudflare
- 部署之前根据项目需求修改
wrangler.toml文件中的配置
纯P2P模式配置(可选):
[vars]EASYTIER_DISABLE_RELAY = "1" # 开启纯P2P,默认"0"EASYTIER_COMPRESS_RPC = "0" # 关闭RPC压缩(调试用),默认"1"Durable Object地区配置(可选):
[vars]LOCATION_HINT = "apac" # 亚太地区(默认),可选值见下Durable Object 地区配置部分表- 部署
# 部署到 Cloudflare Workerswrangler deploy方法二(github在线部署)
前置准备
-
Fork项目:
- 打开项目地址:https://github.com/Teleseon/cf-workers-et-ws
- 点击右上角的 “Fork” 按钮,将项目复制到你的GitHub账户
- Fork完成后,打开fork之后的项目页面
-
创建Codespace:

- 在项目页面点击 “Code” 按钮
- 选择 “Codespaces” 标签
- 点击 “Create codespace on master”
- 等待Codespace环境初始化完成
-
安装依赖:

- 在Codespace的终端中执行以下命令:
# 安装依赖pnpm install# 或者使用 npmnpm install# 如果遇到依赖冲突,可以尝试npm install --legacy-peer-deps -
配置wrangler.toml:
- 根据项目需求修改
wrangler.toml文件中的配置,与方法一相同
纯P2P模式配置(可选):
[vars]EASYTIER_DISABLE_RELAY = "1" # 开启纯P2P,默认"0"EASYTIER_COMPRESS_RPC = "0" # 关闭RPC压缩(调试用),默认"1"Durable Object地区配置(可选):
[vars]LOCATION_HINT = "apac" # 亚太地区(默认),可选值见下Durable Object 地区配置部分表 - 根据项目需求修改
-
获取Cloudflare Workers API令牌:
- 登录Cloudflare控制台
- 点击右上角个人资料图标
- 选择 “个人配置文件”
- 点击 “API 令牌” 标签

- 点击 “创建令牌”

- 选择 “Edit Cloudflare Workers” 模板
- 配置权限:

- Account Resources: 选择 “All accounts” 或你的账户
- Zone Resources: 选择 “All zones from an account” 并选择你的账户
- 点击 “继续以显示摘要”
- 点击 “创建令牌”
- 复制生成的API令牌(类似:
wVVHUH2XPE-V4NMZ2wiPnNVEsRRohIVTj_ZTJQ)
-
回到github终端:
- 终端输入
# 设置API令牌环境变量export CLOUDFLARE_API_TOKEN=你的API令牌# 验证登录状态npx wrangler whoamiy- 成功登录后会显示类似信息:
⛅️ wrangler 3.x.x You are logged in with an API Token, associated with the email '你的邮箱@xxx.com'!┌───────────────────┬──────────────────────────────────┐│ Account Name │ Account ID │├───────────────────┼──────────────────────────────────┤│ 你的账户名 │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │└───────────────────┴──────────────────────────────────┘ -
部署到Cloudflare:
- 确认
wrangler.toml等配置无误后
npx wrangler deploy等待部署完成后,在Cloudflare Workers控制台中即可看到带有EasyTier名称的Worker项目。
- 确认
配置说明
项目使用 wrangler.toml 文件进行配置,主要配置项包括:
name: Worker 名称main: 入口文件路径compatibility_date: 兼容性日期- Durable Objects 配置
- 环境变量配置
项目结构
easytier-ws-relay/├── protos/ # Protocol Buffers 定义│ ├── google│ │ └── protobuf│ │ └── timestamp.proto│ ├── common.proto # 通用协议定义│ ├── error.proto # 错误协议定义│ └── peer_rpc.proto # 对等节点 RPC 协议定义├── src/│ ├── worker/ # Worker 实现│ │ ├── core/ # Worker 核心功能│ │ │ ├── basic_handlers.js # 基础处理器│ │ │ ├── compress.js # 压缩功能│ │ │ ├── constants.js # 常量定义│ │ │ ├── crypto.js # 加密功能│ │ │ ├── packet.js # 数据包处理│ │ │ ├── peer_manager.js # 对等节点管理│ │ │ ├── protos.js # Protobuf 相关功能│ │ │ ├── protos_generated.js # Protobuf 生成的代码│ │ │ └── rpc_handler.js # RPC 处理器│ │ └── relay_room.js # 中继房间实现│ └── worker.js # Worker 入口文件├── package.json # 项目配置├── wrangler.toml # Cloudflare Workers 配置└── README.md # 项目说明功能特性
- WebSocket 双向通信中继
- 基于 Room 的连接管理
- 使用 Protobuf 进行高效序列化
- 消息加密与完整性保护
- 客户端状态管理与心跳维持
- RPC 请求/响应处理机制
环境变量配置
在 wrangler.toml 的 [vars] 中配置以下参数:
基础配置
EASYTIER_DISABLE_RELAY:"1"开启纯 P2P,默认"0"EASYTIER_COMPRESS_RPC:"0"关闭 RPC 压缩(调试用),默认"1"WS_PATH: WebSocket 路径,默认"ws"
心跳与超时配置(解决幽灵节点问题)
EASYTIER_HEARTBEAT_INTERVAL: 心跳间隔(毫秒),默认10000(10 秒)EASYTIER_CONNECTION_TIMEOUT: 连接超时(毫秒),默认25000(25 秒)
高级功能配置
EASYTIER_NETWORK_NAME: 私有网络名称,留空为公开服务器EASYTIER_LATENCY_FIRST:"1"开启延迟优先模式,默认"0"
修改完配置后按正常方式运行 wrangler dev 测试或 wrangler deploy 部署即可生效。
Durable Object 地区配置
Durable Object 默认会根据请求来源自动选择最近的地区部署。如需指定地区,可在 wrangler.toml 的 [vars] 中配置:
LOCATION_HINT: Durable Object 的位置提示,可选值如下:
| 参数 | 地区 |
|---|---|
| wnam | 西部地区(北美) |
| enam | 东部地区(北美) |
| sam | 南美洲 |
| weur | 西欧 |
| eeur | 东欧 |
| apac | 亚太地区(默认) |
| oc | 大洋洲 |
| afr | 非洲 |
| me | 中东 |
详细说明请参考 Cloudflare 官方文档
修改完配置后按正常方式运行 wrangler dev 或部署即可生效。
客户端连接说明
部署后,EasyTier 客户端连接地址需要添加路径 /ws。
默认情况下,WebSocket路径为/ws,该路径可以在wrangler.toml中通过WS_PATH变量进行自定义。
easytier中端口号使用0为使用协议默认端口,ws对应80,wss对应443。
开发模式:
ws://your-network-ip:0/ws部署后:
wss://your-deployment.workers.dev:0/ws效果图:
TIP这里延迟低是因为使用了优选,自行优选优化延迟。
技术实现亮点
幽灵节点问题优化
原版代码存在严重的”幽灵节点”问题:设备断线后仍然显示在列表中。本版本通过以下核心修复彻底解决了这个问题:
私有网络支持
- 网络名称校验:配置私有网络名后,客户端必须使用相同网络名才能连接
- 动态服务器标志:根据配置自动判断是否为公开服务器
- 更好的兼容性:移除
features字段,避免与官方客户端冲突
主要改进内容
- 修复幽灵节点问题
- 秒级断线检测和实时设备列表刷新
- 全局单调递增版本号机制
- 主动清理和防抖保护
- 增强网络稳定性
- 延迟优先模式
- 私有网络支持
- 更好的客户端兼容性
免责声明
WARNING注意:本项目仅供学习交流使用,请勿用于任何商业用途或非法用途。使用本项目代码造成的任何后果,原作者概不负责。
ps:本文档为转载文档,转载地址:https://blog.teleseon.cn/posts/3-29-1/
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时






