easytier-cf-relay

在 Cloudflare Workers 免费额度内运行 EasyTier 自建 WebSocket 节点——无需 VPS, 客户端 -p wss://<你的域名>/ 即可组网。纯 P2P 优先(中继仅兜底), 全 Hibernation API 空闲成本趋零。

v1.6.1 MIT License Cloudflare Workers + Durable Objects easytier-core 2.6.4 官方客户端实测兼容 JavaScript Wrangler v4
¥0
VPS 成本(免费额度内运行)
≈5%
典型小网络日请求占用
200~400ms
公网实测中继延迟(波动较大)
6 重
幽灵节点防线

功能特性

协议字节级对齐官方实现,在免费额度内把「幽灵节点」等第三方实现的痛点逐一解决。

协议兼容

字节级对齐官方实现:握手 / OSPF 路由同步 / PeerCenter / 包转发,已用 easytier-core 2.6.4 官方客户端实测验证。

协议实现详解 →

纯 P2P 优先

宣告 avoid_relay_data,客户端优先直连打洞,中继只做兜底——可配置为完全关闭数据面(严格纯 P2P)。

纯 P2P 模式 →

网络隔离

网络名 + 密钥摘要(SipHash-1-3,与官方同算法)分组隔离,支持 NETWORK_SECRETS 服务端密钥校验。

配置参考 →

幽灵节点六重防线

握手超时 / 空闲超时 / 主动探活 + direct 覆盖与 reporter 追踪 / 路由老化 / 空分组自动删除,彻底解决幽灵路由条目。

六重防线 →

安全加固

零指纹 /health、fail-closed 双门禁、三层事前限流、未知路径 tar pit、转发校验源身份、防路由投毒与摘要抢占。

拦截层次说明 →

Web 管理端

侧边栏九大功能页:总览 / 节点 / 路由 / 互联 / 连接 / 分组 / 摘要注册 / 记录 / 黑名单;服务端分页、各块统计、单个与批量操作。

管理端说明 →

KV 审计记录

六类事件记录进 Workers KV(每类只占一条键,全生命周期共 11 条),支持「全部」跨类型合并查询;管理员登录与操作为硬审计。v1.6 起可选 IP 打码(AUDIT_IP_MASK)与按天留存清理(AUDIT_RETENTION_DAYS)。

KV 审计设计 →

管理端黑名单

四类黑名单(节点 / 分组 / 摘要 / IP),操作自动拉黑;IP 拦截在 Worker 入口边缘层直接拒绝,重连风暴不唤醒 DO。

黑名单行为 →

免费额度内稳定运行

Hibernation + alarm 自适应排程,典型小网络日请求量约为限额的 5%,空房间低至 288 请求/天,空闲成本趋零。

成本与额度 →

观测升级(v1.6)

/metrics?format=prometheus 输出 25 个 easytier_ 指标可接 Grafana;可选配置账号级真实额度(GraphQL,token 只在服务端);绑定 Analytics Engine 后总览新增近 24h / 7 天趋势折线(纯 SVG,零图表库)。

额度观测与趋势 →

资源滥用防线(v1.6)

路由洪泛 / 请求放大 / 出站与状态总量多维上限(全部 env 可调,0 = 关闭),均为处理途中同步检查——正常用户免费额度零开销;管理端新增防线计数与摘要抢占嫌疑记录(含来源 IP)。

防线设计 →
Web 管理端「总览」页截图(深色主题)
Web 管理端「总览」页(v1.6):趋势折线(Analytics Engine)、账号级真实额度、运行参数与官方 easytier-cli 命令对照。

快速开始

免费 Cloudflare 账号 + Node ≥ 18 + Wrangler v4,5 分钟完成部署。

1. 部署节点

npm install
npx wrangler login        # 浏览器授权
npx wrangler deploy       # 部署
# 验证(把 <name> 替换为 wrangler 输出的 Worker 名)
curl https://easytier-cf-relay.<你的子域>.workers.dev/health
# 期望: {"ok":true}

配置项可先用 wrangler.toml 生成器 生成;不绑定自定义域名时使用默认 *.workers.dev 域名即可。

2. 客户端接入

easytier-core --network-name myteam --network-secret s3cret! \
  --hostname node-a -p wss://<你的域名>/

任意平台(Windows / macOS / Linux / 手机端)填相同的网络名与密钥即可互见; 节点地址填 wss://<你的域名>/(路径任意)。

easytier-core \
  --network-name myteam \
  --network-secret s3cret! \
  --hostname node-a \
  -p wss://et.example.com/
  • 网络名称:myteam
  • 网络密钥:s3cret!
  • 节点 / Peer:wss://et.example.com/(新建一个节点条目填入即可)
docker run --name easytier -d --network host --cap-add NET_ADMIN \
  easytier/easytier:latest \
  --network-name myteam --network-secret 's3cret!' \
  -p wss://et.example.com/

本地开发:npm run dev(wrangler dev,端口 8787),用官方客户端连接 ws://127.0.0.1:8787/ 验证。 完整步骤、域名绑定与 FAQ 见 部署手册。

架构

Worker 入口负责路由与边缘防护,Durable Object 负责协议会话与转发;纯 P2P 优先,中继仅兜底。

EasyTier 客户端 A
Windows / macOS / Linux / 手机端
EasyTier 客户端 B
任意平台,同一网络名 + 密钥
EasyTier 客户端 C
P2P 打洞成功后 A ↔ B 直连
wss://你的域名/ · 标准 WebSocket + EasyTier 二进制协议(任意路径)
Cloudflare Edge · Worker 入口(src/index.js)
健康检查 · 自定义 /metrics 与管理端(token 双门禁)· Prometheus 文本指标(v1.6)· 边缘层 IP 黑名单拦截(不唤醒 DO)· 按 URL / Header / Query 选择房间
RelayRoom Durable Object(src/room.js)
握手鉴权 → 路由同步(OSPF)→ 包转发 · 全 Hibernation API + alarm 驱动清扫 · 幽灵节点六重防线
同网络的其他客户端
P2P 打洞成功后直连、不再经过本节点;打洞失败才经中继兜底(可 RELAY_DATA=0 完全关闭)

成本与额度

免费计划即可运行(SQLite 后端 Durable Objects 已对免费计划开放)。10 客户端典型小网络估算约 5,400 请求/天,约为限额的 5%。

维度免费计划额度说明
请求100,000 / 天含 WS 连接建立、入站 WS 消息(20:1 折算)、alarm 唤醒
Duration13,000 GB-s / 天Hibernation 状态不计费——全用 Hibernation API,空闲时成本趋近零
存储5 GB / 账户仅存路由元数据(KB 级)
KV 写1,000 / 天启用 KV 审计后:事件按 RECORD_FLUSH_MS(默认 10 分钟)节流镜像,每键理论最大 144 写/天;拒绝/查看事件不产生写入
KV 读100,000 / 天冷启动且 DO storage 为空时读取(每键一次)+ WS 升级的边缘黑名单检查(v1.4.0 起 isolate 缓存,默认每 30s 至多 1 次读)
单 DO 吞吐~1,000 req/s(软限制)单房间 64 peer 远达不到

空房间经 alarm 空闲退避后仅 288 请求/天;被拉黑客户端的重连风暴在 Worker 入口即被 403,不唤醒 DO、零审计写入。 完整核算与升级选项见 部署手册 · 成本与额度。

已知限制

诚实说明与官方 easytier-core 的差异,避免踩坑。

限制说明影响
不支持 secure mode(Noise)v2.6.0+ 的可选加密握手。收到 NoiseHandshakeMsg 包会关闭连接(4003)客户端使用默认(非 secure)模式即可
不执行 P2P 打洞Workers 无 UDP 出口。打洞由客户端之间直接进行(本节点提供 rendezvous/路由信息)双端均严格 NAT 时只能走中继
不做 KCP / QUIC 协议转换KcpSrc/KcpDst/Quic* 包仅按 to_peer_id 转发无(这些包本来就是端到端的)
不压缩 RPC出站 algo=None微量带宽差异,无功能影响
单房间串行(DO 单线程)单 DO 软限制 ~1000 req/s;更大规模需房间分片(ROOM_HEADER/QUERY)64 peer 默认上限内无感知
同组内 peerId 可被顶替EasyTier 协议固有语义(重连顶替),组内成员互信(共享网络密钥)顶替路径状态一致性已修复(先清后注);组间风险由分组隔离与 NETWORK_SECRETS 防守
未配置 NETWORK_SECRETS 的抢占风险先到者注册摘要后,不同密钥的后来者被拒(STRICT_DIGEST 隔离语义的另一面)squat-suspect 审计可见攻击 IP;删除分组/摘要注册可解锁;配置 NETWORK_SECRETS 即免疫(注册表自愈)
IPv6 子网信息RoutePeerInfo 原样透传(raw 字节路径保留官方字段),但服务端自身不宣告 v6客户端间 v6 组网不受影响

完整列表与实现细节见 技术文档 · 已知限制。

致谢

本项目站在前人肩膀上。

  • EasyTier — 官方去中心化 mesh VPN。本实现的协议行为全部以官方源码(tag v2.6.4)为基准逐项对齐,并以官方客户端实测验证兼容性。
  • IceSoulHanxi/easytier-ws-relay — 最早的 Cloudflare Workers 版 EasyTier WS 中继之一。其「幽灵节点」痛点直接催生了本项目的六重防线设计。
  • Teleseon/cf-workers-et-ws — 其 DO 计费与 protobuf 兼容性经验直接影响了本项目「全 Hibernation + pbjs 静态代码生成」的技术路线。
  • 21paradox/easytier-wsrelay 与 PIKACHUIM/easytier-worker — 踩过的协议细节坑为本项目「逐字段对照官方源码修正」提供了前车之鉴。

另一种选择:【教程】Cloudflare Tunnel 自建 EasyTier 共享节点(无 Docker,自定义域名 wss:// 接入)。

免责声明

本项目仅供学习交流使用,请勿用于任何商业用途或非法用途。使用本项目代码造成的任何后果,原作者概不负责。