mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1640 字
5 分钟
在Cloudflare Workers上部署EasyTier WebSocket服务端
2026-04-14

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 工具链)

安装步骤#

方法一(使用命令行)#

前置准备#

  1. 打开项目地址:https://github.com/Teleseon/cf-workers-et-ws 克隆项目仓库:
git clone <your-repo-url>
cd easytier-ws-relay
  1. 安装依赖:
pnpm install
# 或者使用 npm
npm install
  1. 安装 Wrangler CLI:
npm install -g wrangler
  1. 登录 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 Workers
wrangler deploy

方法二(github在线部署)#

前置准备#

  1. Fork项目

  2. 创建CodespaceAlt text

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

    • 在Codespace的终端中执行以下命令:
    # 安装依赖
    pnpm install
    # 或者使用 npm
    npm install
    # 如果遇到依赖冲突,可以尝试
    npm install --legacy-peer-deps
  4. 配置wrangler.toml:

    • 根据项目需求修改 wrangler.toml 文件中的配置,与方法一相同Alt text
      纯P2P模式配置(可选):
    [vars]
    EASYTIER_DISABLE_RELAY = "1" # 开启纯P2P,默认"0"
    EASYTIER_COMPRESS_RPC = "0" # 关闭RPC压缩(调试用),默认"1"

    Durable Object地区配置(可选):

    [vars]
    LOCATION_HINT = "apac" # 亚太地区(默认),可选值见下Durable Object 地区配置部分表
  5. 获取Cloudflare Workers API令牌

    • 登录Cloudflare控制台
    • 点击右上角个人资料图标
    • 选择 “个人配置文件”
    • 点击 “API 令牌” 标签Alt text
    • 点击 “创建令牌”Alt text
    • 选择 “Edit Cloudflare Workers” 模板
    • 配置权限:Alt text
    • Account Resources: 选择 “All accounts” 或你的账户
    • Zone Resources: 选择 “All zones from an account” 并选择你的账户
    • 点击 “继续以显示摘要”
    • 点击 “创建令牌”
    • 复制生成的API令牌(类似:wVVHUH2XPE-V4NMZ2wiPnNVEsRRohIVTj_ZTJQ
  6. 回到github终端

    • 终端输入
    # 设置API令牌环境变量
    export CLOUDFLARE_API_TOKEN=你的API令牌
    # 验证登录状态
    npx wrangler whoami
    y
    • 成功登录后会显示类似信息:
    ⛅️ wrangler 3.x.x You are logged in with an API Token, associated with the email '你的邮箱@xxx.com'!
    ┌───────────────────┬──────────────────────────────────┐
    │ Account Name │ Account ID │
    ├───────────────────┼──────────────────────────────────┤
    │ 你的账户名 │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │
    └───────────────────┴──────────────────────────────────┘
  7. 部署到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

效果图:Alt text

TIP

这里延迟低是因为使用了优选,自行优选优化延迟。

技术实现亮点#

幽灵节点问题优化#

原版代码存在严重的”幽灵节点”问题:设备断线后仍然显示在列表中。本版本通过以下核心修复彻底解决了这个问题:

私有网络支持#

  • 网络名称校验:配置私有网络名后,客户端必须使用相同网络名才能连接
  • 动态服务器标志:根据配置自动判断是否为公开服务器
  • 更好的兼容性:移除 features 字段,避免与官方客户端冲突

主要改进内容#

  1. 修复幽灵节点问题
    • 秒级断线检测和实时设备列表刷新
    • 全局单调递增版本号机制
    • 主动清理和防抖保护
  2. 增强网络稳定性
    • 延迟优先模式
    • 私有网络支持
    • 更好的客户端兼容性

免责声明#

WARNING

注意:本项目仅供学习交流使用,请勿用于任何商业用途或非法用途。使用本项目代码造成的任何后果,原作者概不负责。
ps:本文档为转载文档,转载地址:https://blog.teleseon.cn/posts/3-29-1/

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

在Cloudflare Workers上部署EasyTier WebSocket服务端
https://blog.199010520.xyz/posts/cloudflareet/
作者
MagicSky
发布于
2026-04-14
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录