对应源文件 easytier-cf-relay-release/docs/更新日志.md · 在 GitHub 查看原文
阅读模式

更新日志

本文件记录每个发布版本的变更。格式参考 Keep a Changelog, 版本号遵循语义化版本。 变更背后的协议细节与设计依据见《技术文档》, 配置项与部署说明见《部署手册》。

版本一览

版本日期重点花费
v1.6.12026-10-07修复 v1.6.0 趋势图不显示数据(Analytics SQL API 适配 + 新增 AE_DATASET)与两处管理页界面问题,无协议与额度开销变更—
v1.6.02026-10-06观测升级(Prometheus 文本输出、账号级真实额度、Analytics Engine 趋势图)、管理端体验翻新与资源滥用防线加固46 RMB
v1.5.02026-10-01防护与观测:单连接消息速率限制、每分组节点上限、总览额度估算卡片、房间满重连修复13 RMB
v1.4.22026-10-01安全加固:修复发往服务端 RPC 未绑定连接身份的盲区、黑名单粒度细化、常数时间 token 比较11 RMB
v1.4.12026-09-19修复 DO 内部端点鉴权绕过;单 IP 并发限流、未知路径 tar pit、站点图标、KV 键前缀更名15 RMB
v1.4.02026-09-13省额度优化:alarm 自适应排程、边缘黑名单缓存、管理页刷新节流、/health 路径自定义13 RMB
v1.3.02026-09-05管理页行内操作修复;记录/黑名单防刷屏;Worker 边缘层 IP 拦截不唤醒 DO9 RMB
v1.2.02026-08-31KV 审计(六类记录,每类一条键)+ 管理端黑名单 + 三个新管理页面15 RMB
v1.0.02026-08-26首个公开版本:协议全面对齐 easytier-core 2.6.4、全 Hibernation、Web 管理端、幽灵节点六重防线61 RMB

[1.6.1] - 2026-10-07

修复版本:修复 v1.6.0 趋势图不显示数据的问题与两处管理页界面问题,无协议 与免费额度开销变更。

修复

  • 趋势图无数据(v1.6.0 遗留):趋势查询适配 Cloudflare Analytics SQL API (显式 FORMAT JSON、按列名解析、schema 限定名 + accountTag 过滤按数据集 名自适应),新增 AE_DATASET 配置使数据集名与 AE 绑定的 dataset 对齐 (wrangler 省略 dataset 时默认取 Worker 名);横轴时间全部相同、悬停无 提示一并修复。
  • 额度卡遮挡:额度卡异步切至真实数据后自动重排瀑布流,不再被同列下方 卡片遮挡。

[1.6.0] - 2026-10-06

大花费,大升级(当然token找免费米饭或者报销,用花费量换算) 模型:GLM5.3-Flash/Deepseek-v4.1-Flash;本次花费:46 RMB;总花费:183 RMB; 数据与体验版本:观测升级(Prometheus 文本输出、账号级真实额度、Analytics Engine 趋势图)、管理端体验翻新与资源滥用防线加固。全部新能力均为可选或纯增量, 未配置任何新项时行为与 1.5.0 一致。

修复与安全加固

外部安全审查驱动的资源滥用防线:路由同步单帧条目数 / 单条体积 / 分组条目 总量 / 互联上报体积多维上限,全量互联响应与会话重推加每连接频率冷却, 落盘超预算自动降级——全部为处理途中同步检查,全部 env 可配置(0 = 关闭)。 正常使用零配置、官方客户端无感、免费额度零开销;被滥用时防御侧近乎零消耗, 总览页新增对应拦截计数。另含:

  • 出站单帧与入站同一上限(默认 128KB),异常状态不再产出超大帧;
  • 管理页拒绝 iframe 嵌套,管理 API 响应禁缓存;
  • 同网络名出现不同摘要(抢占 / 嗅探)时记录 squat-suspect 事件(含来源 IP,去重节流),管理端可见可处置;解锁路径不变(配置 NETWORK_SECRETS);
  • 同 peerId 重连顶替后立即恢复正常收发(修复旧版可能误删新连接注册的缺陷);
  • 空网络名 / 超长网络名握手拒绝;入站帧按协议头长度严格解析;
  • 服务端随机标识改用安全随机源;生产建议 npx wrangler secret put ADMIN_TOKEN 注入管理端 token(与 CF_API_TOKEN 同模式)。

新增

  • Prometheus 文本输出(/metrics?format=prometheus):25 个 easytier_ 命名空间指标(无 label 防高基数),可被 promtool / Grafana / 自托管 Prometheus 直接抓取;默认 JSON 输出不变。
  • 账号级真实额度(可选配置 CF_ACCOUNT_ID + CF_API_TOKEN + 可选 CF_SCRIPT_NAME):总览「额度观测」卡切换为 Cloudflare 账号级真实请求数 (GraphQL Analytics API,按小时桶聚合,大流量日不低估;服务端缓存 5 分钟), 含进度条 / 占比 / 距额度重置倒计时;未配置或查询失败自动回退自观测估算。 API Token 必须 wrangler secret put 注入(最小权限 Account Analytics: Read,可随时吊销),只在服务端使用,绝不下发浏览器 / 日志 / 审计。
  • Analytics Engine 趋势图(可选绑定 AE):总览新增「趋势」卡,近 24h / 7 天在线节点与收包速率折线(纯 SVG,零图表库);打点不占用 100k 请求 额度,未绑定 AE 时静默跳过。
  • 审计数据最小化(可选配置):AUDIT_IP_MASK(默认关)记录时对客户端 IP 打码;AUDIT_RETENTION_DAYS(默认 0 = 不限)alarm 每小时清理过期 记录(管理端硬审计豁免)。

变更

  • 管理端视觉翻新:白色浅色默认 + 明暗 / 主色 / 圆角可定制(侧栏设置 弹层,记忆在浏览器本地);侧栏可收缩,移动端专项优化;总览重构为瀑布流 (趋势卡全宽固定顶部,其余卡片可逐卡收起与显隐);「官方命令对照 + 术语速查 + 链接」移入侧栏帮助抽屉。
  • 管理端自动刷新重构:修复反复切换刷新间隔 / 页面前后台后同一时刻多次 请求的倍发问题;页面不可见按轮跳过、恢复后续跑;顶栏勾选改为与设置档位 双向联动的快捷开关。
  • 修复三处管理页遗留问题:节点在线 / 路由信息 / 全局互联三页 0 分组时分组 过滤下拉无限请求 /api/state 的潜伏 bug;设置弹层板块开关未按存储回填; 初始化预填圆点令牌被误保存导致后续请求失败。
  • 站点图标更换:官方占位图更换为项目自绘图标(沿用官方视觉语言), /favicon.ico 路由与返回不变;README 头图改用矢量版 assets/icon.svg。
  • /metrics JSON 输出的 config 白名单对齐管理端全部配置项,新增 sockets 连接概览与审计概览;/api/quota、/api/trends 为新增端点(复用 ADMIN_TOKEN 门禁)。
  • wrangler.toml 新增可选 [[analytics_engine_datasets]] 绑定与 CF_ACCOUNT_ID / CF_SCRIPT_NAME 占位说明;CF_API_TOKEN 仅允许 secret 注入,文件内只留说明注释。

说明

  • IPv6 宣告方向经官方 v2.6.4 源码核对后关闭:中继 DO 不具备真实 v6 端点 / 前缀,宣告反而误导官方客户端。
  • 真实额度与 AE 趋势查询共用同一个只读 API Token(Account Analytics: Read); 两者均未配置时,总览页显示与 1.5.0 完全一致(自观测估算口径)。

[1.5.0] - 2026-10-1

模型:GLM5.3-Flash;本次花费:13 RMB;总花费:137 RMB;

防护与观测版本:补齐事前限流的最后两块缺口,管理页总览补全全部运行参数与 限流计数,新增额度自观测卡片。(今天一次性更新两个版本)

新增

  • 单连接消息速率限制(MSG_RATE_LIMIT_PER_SEC,默认 50/秒,0 关闭): 单个连接的消息速率超限时先告警、持续超限断开(4008 rate limited),拦截次数 计入总览「速率限流」。EasyTier 心跳 8s 1 个、路由同步爆发每秒数十个, 默认阈值非常宽裕,正常使用零感知。
  • 每分组节点数上限(MAX_PEERS_PER_GROUP,默认 32,0 不限):单个网络 分组的在线节点数达到上限后,该网络的新节点握手被拒(4030 group full), 其它网络不受影响;同 peerId 重连顶替不受限。拦截次数计入总览「分组限流」。
  • 管理页总览补全:新增「额度估算」卡片(今日估算计费请求 ≈ 入站消息÷20 + 连接建立 + alarm 折算,相对 100,000/天进度条,标注为估算值);统计卡新增 「IP 限流 / 速率限流 / 分组限流」三个事前限流计数器;服务端卡补全此前 未展示的运行参数(服务端网络名、摘要策略、单分组/单 IP 上限、消息速率、 消息大小、握手/空闲超时、探活阈值、清扫周期与空闲退避)。
  • 房间满重连修复:房间满的拒绝统一移到握手层(4029)并对同 peerId 重连顶替豁免——此前升级层 HTTP 429 会把已有节点断线后的重连恢复也一并 挡死,旧连接半开后永远无法恢复。

变更

  • 管理端 API 的状态接口(/api/state)config 字段扩充(新增 9 个此前未下发 的运行参数),总览页据此渲染——纯增量,不影响既有消费者。

说明

  • 心跳自动应答方向经官方源码审查确认不可行(客户端严格校验 Pong 序号, 固定模板无法通过),已在迭代文档记录关闭;心跳消耗为客户端行为, 服务端无法消除。

[1.4.2] - 2026-10-1

模型:GLM5.3-Flash;本次花费:11 RMB;总花费:124 RMB;

安全加固修复版:修复路由投毒盲区与两处低危加固,一处管理操作语义变更。 与 1.4.1 完全兼容。

修复(重大)

  • 发往服务端的 RPC 未绑定连接身份(外部审查确认并复现):转发路径的源 身份校验未覆盖「包直接发往服务端」的分支——同网络内任一节点可冒充其它 在线节点自报路由(覆盖 direct 条目、篡改主机名)、覆盖他人 PeerCenter 直连 表、伪造 RPC 响应清空路由会话(引发全量重推的流量放大)。现所有 RPC (请求与响应)统一校验:未握手的连接不处理;包头来源身份必须与连接注册 身份一致,否则丢弃并计入「源伪造拦截」计数。官方客户端不受影响。
  • 未握手连接可触达路由会话逻辑:与上一条同一分支、同批修复——未完成 握手的连接发送 RPC 直接丢弃,与转发路径行为一致。

变更

  • 删除分组 / 删除摘要注册的黑名单粒度改为「网络名:摘要」(digest 类): 此前拉黑整个网络名——在被摘要抢占的场景下,管理员删除分组/摘要注册反而 会把同网络名的合法用户(正主)一并封锁。现按被删分组的完整 「网络名:摘要」精确拦截抢占者;存量黑名单数据(纯网络名格式)继续生效; 管理端手工添加的黑名单仍支持纯网络名格式。
  • token 比较改为常数时间全覆盖(长度差异折叠进比较结果,不再提前返回)。

文档

  • 部署手册:?token= 查询鉴权标注「会进 URL 日志,生产建议 Bearer 头」; 标注单 IP 并发上限与边缘 IP 黑名单依赖边缘注入的 CF-Connecting-IP (非 CF 前置链路或本地 dev 下自动跳过,DO 层黑名单仍生效)。

[1.4.1] - 2026-09-19

模型:GLM5.3-Flash;本次花费:15 RMB;总花费:113 RMB; 安全加固与运维小版本:修复一个管理端鉴权缺陷,补事前限流、KV 键前缀更名与站点图标。

修复(重大)

  • DO 内部端点的鉴权可达性缺陷:管理端内部端点(/internal/*)可能被 特制请求绕过 Worker 入口的 token 鉴权直达。现统一在 Durable Object 层 拦截此类请求(一律 404),内部端点只接受 Worker 入口鉴权后的调用。

新增

  • 事前限流:单 IP 并发连接上限(MAX_CONNS_PER_IP,默认 6,0 关闭): 同一 IP 的开放连接数达到上限后新连接请求返回 429 + Retry-After,拦截次数 计入总览页「IP 限流」(counters.ipLimited)。黑名单是事后拦截,此检查 补上事前缺口;客户端 IP 现随连接元数据持久化(顺带修复:DO 休眠重启后 连接列表丢 IP 的小问题)。
  • 未知路径挂起不响应(TARPIT_UNKNOWN,默认开,0 恢复 404):非 WebSocket 升级请求访问未知路径时挂起——不返回 404、不暴露行为指纹;EasyTier 客户端 只走升级、保留路径各有响应,均不受影响。
  • 站点图标:/favicon.ico 返回内嵌的 128×128 项目图标(用Easytier官方图标当占位图)(原为 404), 浏览器缓存 1 天;管理页 <head> 同步声明。

变更

  • KV 键前缀更名:et-relay: → easytier-cf-relay:。首次启动 自动一次性迁移旧键数据(新前缀完全为空才回读旧前缀,新旧绝不混用); 旧键保留不删,确认运行正常后可在 Cloudflare 控制台手动清理。
  • KV 镜像刷盘分批写(每批 ≤6 并发):对齐免费计划「单次调用同时打开 6 个 连接」的限制,避免多个脏键一次性并发写触发运行时排队。

[1.4.0] - 2026-09-13

模型:GLM5.3;本次花费:13 RMB;总花费:98 RMB; 面向免费额度的下一代省额度优化(v2 迭代第一弹):alarm 自适应排程、边缘黑名单 缓存、管理页刷新节流,以及 /health 路径自定义。协议层无变更,与 1.3.0 完全兼容。

修复(重大)

  • _markDirty() 闹钟抖动导致清扫饥饿:上一版版注释说"若当前无近期 alarm 才安排 短 alarm",代码却无条件 setAlarm(now+2000)。客户端持续抖动重连时(握手/清理 事件间隔 <2s),闹钟被不断推到"最新事件 +2s"——只要抖动持续,alarm 永远落在 未来,幽灵节点清理、路由老化、空分组删除、脏状态落盘全部停摆(事件停止后 2s 可恢复,非死锁);批量上线时还产生冗余 storage 写。现先 getAlarm(), 仅当无闹钟或已有闹钟比目标更晚时才设置,绝不推迟更早的闹钟。

变更

  • alarm 自适应排程(src/room.js):重挂间隔不再固定 15s,由 _nextAlarmDelay() 计算——有连接时取 min(SWEEP_INTERVAL_MS, 最近的 socket 事件时刻)(未握手 超时截止/探活触发/空闲超时截止,下限 1s);完全空闲(无连接且无脏数据/审计 待刷)退避到新配置 SWEEP_IDLE_INTERVAL_MS(默认 300000ms)。空房间 alarm 消耗从 5,760 请求/天降至 288;有连接时也不再无意义地固定 15s 一醒。
  • 边缘 IP 黑名单 isolate 缓存(src/index.js):WS 升级前的 bl:socket KV 读 加 TTL 缓存(新配置 IP_BLOCK_CACHE_MS,默认 30000ms,"0" 关闭),重连风暴 时 KV 读从每次连接 1 次降为每 TTL 1 次。只延后拦截、绝不漏放:缓存未命中 (含 KV 读失败)照旧放行走 DO 层权威黑名单检查,仅新拉黑 IP 的边缘拦截至多 延后「KV 最终一致窗口 + TTL」。
  • 管理页自动刷新省额度(src/admin_ui.js):间隔 10s → 30s,setInterval 改 递归 setTimeout,页面不可见(后台标签页/最小化)时暂停、可见时恢复。长开 页面请求量约 8.6k → 2.9k/天,后台挂页归零。

新增

  • /health 路径自定义(src/index.js):新配置 HEALTH_PATH(默认 /health, 行为不变)。配置后仅该路径返回 {"ok":true},原 /health 返回 404(防指纹 扫描,无需 token);WebSocket 保留路径同步纳入。

配置

  • 新增 SWEEP_IDLE_INTERVAL_MS(默认 300000,0 关闭退避)、 IP_BLOCK_CACHE_MS(默认 30000,0 关闭缓存)、HEALTH_PATH(默认 /health);SERVER_VERSION_STR 默认值更新为 easytier-cf-relay/1.4.0。

[1.3.0] - 2026-09-05

模型:GLM5.3;本次花费:9 RMB;总花费:85 RMB; 面向免费额度与可观测性的审计/黑名单优化,协议层无变更,与 1.2.0 完全兼容。

修复(重大)

  • 管理页所有列表的「操作」列按钮无实际效果:esc() 转义函数未处理双引号, data-payload="{"id":5}" 的 JSON 引号在 HTML 属性中被截断(按钮拿到的 payload 变成残缺 JSON,解析失败退化为空对象),点击后服务端收不到目标参数。 现将双引号一并转义为 &quot;(文本与属性双上下文安全),全部列表的 单行操作(踢出 / 删除分组 / 删除路由 / 删除互联 / 断开 / 删除摘要 / 删除记录 / 移除黑名单)真实生效——无需勾选复选框即可执行(勾选仅用于顶部批量按钮)。

改进 — 审计记录(防刷屏 + 省额度)

  • 黑名单拒绝事件不再写入「节点在线」记录:被拉黑客户端会不断重连, 逐条记录会刷爆记录列表并徒增 DO storage/KV 写入;拒绝改由总览页新增的 「黑名单拦截」计数器(counters.blRejected)观测,零写入成本。
  • 管理端「查看」事件不再记录:管理页 10s 自动刷新会持续产生查看记录 (原先按 5 分钟折叠计数),既刷屏又浪费写入;登录(IP/时间,10 分钟去重) 与操作明细仍为硬审计。

改进 — 黑名单拦截(双层,省 DO 额度)

  • 新增 Worker 入口边缘层 IP 拦截:WebSocket 升级前直接读 KV 的 bl:socket 一条键,命中立即 403(附 Retry-After: 60)——不唤醒 Durable Object,被拉黑客户端的重连风暴只消耗 Worker 请求额度, 不再消耗 DO 请求与时长计费。
  • DO 层(升级 / 握手)保留为权威兜底:覆盖 KV 最终一致窗口(约 1 分钟)内 新拉黑的 IP;KV 读失败时边缘层放行、DO 层拦截(边缘 fail-open、DO fail-closed)。
  • 解除封锁的生效时间 = KV 传播时间(通常数秒,最长约 1 分钟)。
  • 未绑定 AUDIT_KV 时边缘层自动跳过,行为与 1.2.0 一致。

新增 — 记录查询「全部」视图

  • 记录类型下拉首项新增**「全部」**:七类记录(六类数据 + 管理端审计)在内存 合并,按全局 id(= 时间序)倒序分页,附「类型」列——不引入任何新 KV 键。
  • 「全部」模式支持按 id 跨类型删除(单个 / 批量);admin 硬记录仅展示, 该行的勾选与删除按钮均禁用(服务端同样拒绝,双保险)。

其它

  • 403 拒绝响应附带 Retry-After: 60,建议客户端退避重试。
  • 文档:技术文档 §9 重写拦截层次与成本说明;部署手册新增 Q11(重连风暴与免费额度)、 更新成本核算与 KV 读额度说明;多房间分片下 KV 审计的共享键限制已注明。

验证

  • 语法与构建静态检查通过;协议行为(对齐 easytier-core 2.6.4 官方客户端)、 管理端全部页面的行内操作与批量操作、KV 审计/黑名单全链路(含边缘层拦截 不唤醒 DO、「全部」合并查询与跨类型删除)均经回归验证通过。

[1.2.0] - 2026-08-31

模型:GLM5.3;本次花费:15 RMB;总花费:76 RMB; 在 1.0.0 协议完备的基础上补齐「可观测 + 可管控」:新增 KV 审计记录与管理端黑名单, 管理控制台新增三个页面(记录查询 / 记录设置 / 黑名单)。协议层无变更,与 1.0.0 完全兼容。

新增 — KV 审计记录

  • 六类网络事件记录进 Workers KV:网络分组 / 节点在线 / 路由信息 / 全局互联 / 连接列表 / 摘要注册(每类只占一条 KV 键,定长环形缓冲;连同管理端审计与黑名单全生命周期共 11 条键)
  • 事件明细:分组 create / delete(含原因)、节点 join / leave / replace / reject(含 IP)、 路由 add / remove(direct / transit 与顶替记录)、互联 add / remove(含 TTL 过期)、 连接 open / close / error(含 socketId、IP)、摘要 register / delete
  • 管理端硬审计:管理员登录(IP / 时间)、查看(5 分钟折叠计数)、操作明细; ADMIN_AUDIT 为硬开关,管理页不可关闭,admin 类记录不可删除(防审计自擦除)
  • 三级写入路径控成本:事件先入内存数组 → alarm 周期落 DO storage(防休眠丢失)→ KV 镜像仅写脏键并按 RECORD_FLUSH_MS(默认 10 分钟)节流;管理操作完成后强制刷 KV (黑名单立即生效)。免费额度 1000 写/天下默认每键最多 144 写/天,典型小网络每天合计数十次
  • 未配置 AUDIT_KV 绑定时优雅降级为仅 DO storage 存储,管理页功能不受影响

新增 — 管理端黑名单

  • 四类黑名单各占一条 KV 键:节点 PeerId / 网络分组(网络名)/ 摘要注册 / 客户端 IP
  • 管理操作自动拉黑:踢出节点 → peer;删除分组 → group(网络名);删除摘要注册 → digest; 断开连接 → socket(已知客户端 IP)
  • 双拦截点:WebSocket 升级时按客户端 IP 403 拒绝;握手(摘要校验前)按 peer / group / digest 关闭连接(4013 blacklisted),拒绝事件记入节点记录
  • 黑名单页支持手工添加(含备注原因)、单个与批量移除(解除封锁)、整类清空; 上限 BLACKLIST_LIMIT(默认 1000)为硬设置

新增 — Web 管理端(三个新页面)

  • 记录查询:按类型筛选 + 分页浏览六类记录与管理端审计,支持单个与批量删除(admin 类不可删)
  • 记录设置:六类记录各自的开 / 关与条数上限(软设置,运行时生效,收紧上限时立即裁剪旧记录)
  • 黑名单:四类黑名单的查询 / 添加 / 移除 / 清空,含各类条数统计
  • 侧边栏新增「记录查询 / 记录设置 / 黑名单」功能块与统计徽标,总览页汇总审计统计

新增 — 配置项(wrangler.toml)

  • AUDIT_KV KV namespace 绑定(可选)
  • RECORD_FLUSH_MS(KV 镜像节流间隔,默认 600000)
  • RECORD_DEFAULT_LIMIT(各类记录默认上限,默认 100)
  • BLACKLIST_LIMIT(各黑名单上限,默认 1000)
  • ADMIN_AUDIT / ADMIN_AUDIT_LIMIT(管理端审计硬开关与上限,默认开 / 200)

修复

  • 运行时长在 DO 休眠或重启后重新计时的问题:首次启动时间持久化到 DO storage, 现按房间首次创建起累计(含休眠时间),管理页附说明提示
  • 管理端命名与统计口径统一:连接(sockets)与管理端审计纳入总览统计, 侧边栏徽标与总览汇总一致

文档

  • 技术文档新增 §9「KV 审计与管理端黑名单」;部署手册新增 5.6 节(KV 审计配置)并更新成本章节; README 同步功能清单

[1.0.0] - 2026-08-26

模型:GLM5.3;本次花费:61 RMB;总花费:61 RMB; 首个公开发布版本。协议行为以官方 easytier-core v2.6.4 源码为基准逐项对齐, 并使用官方客户端实测验证:握手、路由同步、双节点互见、数据中继、长稳运行全部通过。

新增 — 协议层(对标官方 easytier-core 2.6.4)

  • ZCPacket / PeerManagerHeader(16 字节小端头)解析与构造

  • WebSocket 隧道:接受任意路径的升级请求(与官方服务端行为一致)

  • 握手:magic / version / features 镜像 / 网络摘要校验 (SipHash-1-3,与官方同算法同密钥派生)

  • Ping/Pong 心跳:payload 原样回显(支持客户端自增 seq),liveness-echo flags 镜像

  • RPC 分发:RpcPacket / RpcRequest / RpcResponse,int64 transaction_id 全精度

  • OspfRouteRpc.SyncRouteInfo:请求处理 + 响应 + 主动推送(全量 / 增量)

  • 路由增量同步:version / peer_route_id / session 语义(peer_route_id 变化即无条件替换)

  • RoutePeerInfo 未知字段逐字节保留(wire 层重组,对标官方 raw_peer_infos 机制)

  • PeerCenterRpc.ReportPeers / GetGlobalPeerMap:官方 replace 语义 + digest 缓存

  • 包转发:forward_counter 每跳 +1、>7 丢弃、转发时清除 LATENCY_FIRST

  • 同 peerId 重连顶替:旧连接关闭 + 路由更新广播

  • 加密包(ENCRYPTED flag)透传不受影响

  • 网络分组隔离:网络名 + 摘要 → 独立分组,互不可见

新增 — 平台层(Cloudflare Workers)

  • Worker 入口:/health 零指纹;/metrics 与 Web 管理端为自定义安全路径 + token 双门禁(fail-closed,不配置即 404,零攻击面)

  • RelayRoom Durable Object:全 WebSocket Hibernation API,全程零 setInterval/setTimeout 常驻

  • Alarm 驱动周期清扫(DO 可休眠,duration 成本趋零,免费额度内稳定运行)

  • attachment 元数据:休眠唤醒后恢复 peerId / groupKey / lastSeen

  • 路由状态持久化:脏标记 + 节流落盘,损坏数据静默丢弃

  • 多房间分片(Header / Query 可配置)

新增 — Web 管理端

  • 侧边栏列表式导航:总览 / 网络分组 / 节点在线 / 路由信息 / 全局互联 / 连接列表 / 摘要注册表

  • 服务端分页 + 各列表独立滚动:节点数量大时打开管理页不卡不爆

  • 各功能块自带统计(侧边栏徽标 + 总览页汇总)

  • 全功能块批量操作(单个与批量均支持):踢出节点 / 删除分组 / 删除路由条目 / 删除互联条目 / 断开连接 / 删除摘要注册

  • 路由信息与摘要注册表支持单独删除

  • 官方 easytier-cli 命令对照表

  • 数据 API 全部经 token 鉴权(页面壳公开、数据不公开)

新增 — 稳定性与自动清理

  • 幽灵节点六重防线(详见技术文档 §6):

    • 连接级:握手超时(15s)/ 空闲超时(75s)/ 服务端主动探活(40s)

    • 路由级:direct/transit 来源标记(transit 永不覆盖 direct)+ reporter 追踪 / 路由老化(对齐官方 clear_expired_peer 两层语义:不可达 90s / TTL 3660s)/ 空分组自动删除(宽限 60s)

  • 空分组自动删除:分组内在线节点归零并持续超过宽限期 → 整组删除(含路由条目与摘要注册)

  • 摘要注册表自愈:孤儿摘要注册随分组删除一并解除,不留脏数据

新增 — 安全加固

  • STRICT_DIGEST:同一网络名出现不同摘要时拒绝(防网络名抢占)

  • NETWORK_SECRETS:服务端侧网络密钥校验(SipHash-1-3 摘要比对)

  • MAX_MESSAGE_BYTES / MAX_PEERS_PER_ROOM 资源限制

  • 转发前校验 from_peer_id 与连接注册身份一致(伪造源丢弃并计数)

  • 路由 transit 条目不覆盖 direct 条目(防路由投毒 / 防幽灵复活)

  • PeerCenter 上报以连接注册身份为准(防身份冒用)

修复(开发过程中定位并解决)

  • 幽灵节点(重大):客户端多 PeerId 竞争后,被放弃的 PeerId 作为 transit 条目 被其他节点转述上报,导致路由表出现"无在线连接的幽灵条目"(节点实际只有一个连接)。 通过 reporter 追踪(上报者断开即清除其上报的无主 transit 条目)+ direct 覆盖规则 + 路由老化三层机制根除,同类残留此后自动清理。

  • 管理端"官方 easytier-cli 命令对照"表格右侧溢出:容器改为允许横向滚动。

  • wrangler deploy 多环境警告:deploy / dry-run 脚本显式指定 --env="", 明确使用顶层环境,避免误部署到错误环境。

已知限制

  • 不支持 secure mode(Noise,v2.6.0+ 可选加密握手)——客户端使用默认模式即可

  • 不执行 P2P 打洞(Workers 无 UDP 出口),仅提供 rendezvous;双端严格 NAT 时走中继

  • 不做 KCP/QUIC 协议转换(相关包按 to_peer_id 原样转发,无功能影响)

  • 单房间为 DO 单线程串行(软限制 ~1000 req/s);更大规模使用房间分片

完整列表见技术文档 §11。