原文作者:WWSTA | 来源:GitHub EasyTier Discussion #2512

适用场景:家里有一台 Windows 电脑(或其他服务器)(无公网 IP、不折腾 Docker),想搭一个 EasyTier 节点:

  • 通过 Cloudflare Tunnel 绑定自己的域名,对外提供 wss:// 加密接入;
  • 节点以共享模式运行——服务端不绑定网络身份,每台客户端自带网络名称+密码,各自组建互相隔离的虚拟局域网;
  • 临时启动(双击脚本开两个窗口即上线),不注册系统服务;
  • 公网入站端口 0 个,无需端口映射。

适用建议:本教程搭建的节点一般由你自己或者你信任的人一起使用(可以减轻公益服务器压力),不建议大规模分享,除非你愿意折腾。


一、整体架构

  其他设备(EasyTier 客户端,各自带网络名/密码)
        │
        │  wss://et.example.com(TLS 1.3,CF 托管证书自动续期)
        ▼
  ┌─────────────────────────────────────────────┐
  │  Cloudflare 边缘网络(Zone 开启 WebSockets)  │
  │  加密隧道(cloudflared 主动出站 4 条冗余连接) │
  └──────────────────┬──────────────────────────┘
                     │ 回源 http://localhost:11011
                     ▼
  ┌─────────────────────────────────────────────┐
  │             你的 Windows 电脑                 │
  │  ┌──────────────────────────────────────┐   │
  │  │ 窗口① cloudflared.exe                │   │
  │  │   → 隧道出站,回源到 localhost:11011  │   │
  │  ├──────────────────────────────────────┤   │
  │  │ 窗口② easytier-core.exe              │   │
  │  │   --no-tun -l ws://127.0.0.1:11011  │   │
  │  │   → 纯协调与中继,不入网              │   │
  │  └──────────────────────────────────────┘   │
  └─────────────────────────────────────────────┘

要点:

  • P2P 优先:客户端之间打洞成功后直连,流量不经过 Cloudflare 和你的电脑;打洞失败才经本节点中继兜底。
  • 网络隔离:网络名+密码就是"虚拟局域网的身份证",不同网络互不可见;本节点只转发密文,无法解密任何网络的内容。
  • 零入站端口:EasyTier 只监听 127.0.0.1 回环,唯一入口是本机的 cloudflared,Windows 防火墙连放行的提示都不会弹。

二、前置条件

要求
操作系统 Windows 10/11 x64
网络 可访问互联网(出站 443),无需公网 IP
Cloudflare 账号 免费版即可
域名 已持有,且 NS 托管到 Cloudflare(仅 CNAME 接入无效)
软件 easytier-core(≥ 2.5.0)+ cloudflared(已装)

统一约定(下文按此编写,替换成自己的值):

示例值
域名 example.com
接入地址 wss://et.example.com
隧道名 et-tunnel
EasyTier 目录 D:\EasyTier\

三、部署步骤

步骤 0:Cloudflare Zone 检查

进入你的域名所在 Zone,确认三项:

  1. Network → WebSockets = On(默认开);
  2. SSL/TLS → 加密模式 = 完全(Full);
  3. Zone 状态 Active。

步骤 1:下载 EasyTier

Releases 下载 easytier-windows-x86_64-vX.Y.Z.zip(≥ 2.5.0,wss 地址无需写 :0),解压到 D:\EasyTier\(内含 easytier-core.exeeasytier-cli.exe)。解压后不要再移动目录。

步骤 2:启动共享节点(窗口②)

普通 PowerShell(无需管理员),执行:

cd D:\EasyTier
.\easytier-core.exe --no-tun -l ws://127.0.0.1:11011
参数 说明
(无网络身份参数) 公共共享节点模式:不带 --network-name / --network-secret / --private-mode 启动即为公共服务器,客户端各自带身份接入
--no-tun 不创建虚拟网卡:本机不入网、无虚拟 IP、免管理员权限,纯做协调与中继
-l ws://127.0.0.1:11011 仅本机回环监听,外部不可见

验证(另开窗口):

netstat -ano | findstr ":11011"
# 期望:TCP 127.0.0.1:11011 ... LISTENING(注意是 127.0.0.1 不是 0.0.0.0)

可选--relay-network-whitelist "team-a* team-b" 限定可中继的网络名(防滥用);置空 "" + --relay-all-peer-rpc 则只帮打洞、不中继。

保持窗口开着,关窗即下线。

步骤 3:cloudflared 登录(一次性)

cloudflared tunnel login

浏览器打开输出的 URL → 登录 Cloudflare → 选中你的域名 Zone → 授权。生成 C:\Users\<用户名>\.cloudflared\cert.pem(账号级凭证,勿外传)。

步骤 4:创建隧道(一次性)

cloudflared tunnel create et-tunnel
# 输出:Created tunnel et-tunnel with id <UUID>  ← 记下 UUID

同目录生成 <UUID>.json 凭证文件——不要重命名、不要移动(改名 = 鉴权失败)。

步骤 5:绑定域名(一次性)

cloudflared tunnel route dns et-tunnel et.example.com

自动创建 CNAME(et → <UUID>.cfargotunnel.com,橙云代理开启)并自动签发证书。若报 code:1003,说明 DNS 已有同名记录,删除后重试。

步骤 6:编写 config.yml

保存到 D:\EasyTier\config.yml(放自定义路径后,所有命令都要显式带 --config):

tunnel: <你的隧道UUID>
credentials-file: C:/Users/<你的用户名>/.cloudflared/<你的隧道UUID>.json
logfile: C:/Users/<你的用户名>/.cloudflared/cloudflared.log
# 国内网络强烈建议加以下两行(见步骤 7 排查说明)
protocol: http2
edge-ip-version: "4"

ingress:
  - hostname: et.example.com
    service: http://localhost:11011
  - service: http_status:404

注意事项:

  • 缩进用 2 空格,不能用 Tab;文件名不能是 config.yml.txt;
  • credentials-file 指向用户目录下的凭证 JSON(路径分隔符用 /),凭证文件不要移动;
  • Service 类型填 http://localhost:11011 即可,Cloudflare 会自动处理 WebSocket 协议升级;
  • 末尾 http_status:404 兜底规则必须存在。

校验:

cloudflared tunnel --config D:\EasyTier\config.yml ingress validate
# 期望:Validated rules, OK=2, Invalid=0

⚠️ --config 位置规则(高频报错):它是 tunnel 命令的标志,必须放在 tunnel 之后、子命令之前:

  • cloudflared tunnel --config D:\EasyTier\config.yml run et-tunnel
  • cloudflared tunnel run et-tunnel --config D:\EasyTier\config.yml(报 flag provided but not defined: -config)

步骤 7:启动隧道(窗口①)

cloudflared tunnel --config D:\EasyTier\config.yml run et-tunnel

期望出现 4 条:

INF Registered tunnel connection connIndex=0 ... protocol=http2
INF Registered tunnel connection connIndex=1 ...
INF Registered tunnel connection connIndex=2 ...
INF Registered tunnel connection connIndex=3 ...

国内网络排查实录(亲测):若反复刷 Failed to dial a quic connection / timeout: no recent network activity,且日志中拨号 ip= 均为 2606:4700:... 开头的 IPv6 地址——这是本机到 CF 边缘的 QUIC(UDP 7844)不通、IPv6 路由不稳所致,与 EasyTier 无关。

修复:在 config.yml 的 ingress: 前加 protocol: http2(弃 QUIC 走 TCP)和 edge-ip-version: "4"(强制 IPv4),重启隧道即可。改后即使只连上单个 region 也够用。

另外,偶发的 WRN Connection terminated ... context canceled 是冗余连接自愈重连(1 秒内自动重试注册),无需处理。

步骤 8:全链路验证

# 检查 1:DNS 解析到 CF 边缘
Resolve-DnsName et.example.com -Type A
# 期望:104.x / 172.6x / 188.114.x 等 CF IP 段

# 检查 2:边缘到源站贯通
curl.exe -i https://et.example.com
# 返回任何非 CF 错误页的响应(400/空回复等)即为通;502/521 = 链路断

# 检查 3:回环连接已建立
netstat -ano | findstr ":11011"
# 期望:LISTENING(easytier)+ ESTABLISHED(cloudflared 已回源)

步骤 9:客户端接入(自建虚拟局域网)

每台客户端自选网络名与密码(管理员 PowerShell,客户端需创建虚拟网卡):

# 客户端 A 自建 "alice-lan"
.\easytier-core.exe -d --network-name "alice-lan" --network-secret "alice的复杂密码" -p wss://et.example.com

# 客户端 B 自建 "bob-lan"(与 A 完全隔离,互不可见)
.\easytier-core.exe -d --network-name "bob-lan" --network-secret "bob的复杂密码" -p wss://et.example.com
  • -d:DHCP 自动分配虚拟 IP(默认 10.126.126.0/24,各网络独立分配);
  • -p 地址不带端口、不带 /ws 路径(≥ 2.5.0 也无需 :0);
  • 手机端:EasyTier App → 网络方式"手动" → 服务器地址填 wss://et.example.com

⚠️ 客户端务必设置网络名与密码,不要留空:两者都留空会落入"默认公共网络",与所有同样留空的陌生人节点同处一个局域网!另外官方提示网络名与他人冲突可能导致组网失败,建议名称加随机后缀。

步骤 10:组网验证

.\easytier-cli.exe peer    # 节点表:服务端节点 cost=1 表示 WSS 通道贯通
.\easytier-cli.exe route   # 路由表
.\easytier-cli.exe node    # 本机信息(虚拟IP、NAT类型)
ping <对端虚拟IP>

客户端之间连接的 tunnel_proto 列:udp = 打洞成功 P2P 直连(理想);ws/wss = 中继回退(对称 NAT 常见,流量走服务端家宽上行)。


四、日常一键启动

start-easytier.bat:

@echo off
cd /d D:\EasyTier
easytier-core.exe --no-tun -l ws://127.0.0.1:11011

start-tunnel.bat:

@echo off
cloudflared tunnel --config D:\EasyTier\config.yml run et-tunnel

双击两个脚本 = 服务上线;关窗/关机 = 下线。临时使用期间记得阻止电脑睡眠:powercfg /change standby-timeout-ac 0(管理员),并在设备管理器关闭网卡节能。


五、故障排查速查表

症状 原因 处置
客户端 connect timeout after ~20s 地址带了 :11011 端口(CF 边缘仅 443 对外) 客户端地址用 wss://et.example.com,不带端口、不带 /ws
反复刷 QUIC dial timeout QUIC(UDP 7844) 被拦 / IPv6 到 CF 路由不稳 config.yml 加 protocol: http2 + edge-ip-version: "4" 后重启
flag provided but not defined: -config --config 位置不对 放 tunnel 之后、子命令之前
route dns 报 code:1003 DNS 已有同名记录 删除旧记录重试,或换子域前缀
curl 返回 502 / 521 EasyTier 未运行 / 端口不对 查窗口②;netstat 确认 127.0.0.1:11011;核对 ingress URL
curl 返回 530 / 1001 DNS 未指向隧道 核对 CNAME → <UUID>.cfargotunnel.com 且橙云开启
WS 握手失败 Zone WebSockets 未开启 Network → WebSockets = On
客户端频繁掉线 服务端休眠 / 网卡节能 / CF 边缘发版重连(自动重连) 电源与网卡设置;偶发重连属正常
客户端之间一直中继 至少一端对称 NAT 预期回退;可试 IPv6 / 换网络

六、安全须知

  • 共享模式的代价:任何拿到 wss:// 地址的人都能用你的节点(中继消耗家宽上行带宽);数据安全无碍——各网络端到端加密,节点只见密文。控制手段:--relay-network-whitelist 限定网络名,或换隐蔽的子域前缀。
  • 凭证管理cert.pem(账号级)、<UUID>.json(隧道级)、各网络密码均为机密,不截图、不外传、不改名。
  • Cloudflare TOS:免费 CDN 条款不允许以视频流为主的用途;打洞成功后 P2P 直连可规避绝大部分中继流量。
  • Windows 侧无 fail2ban,靠"回环监听 + 零入站端口 + 客户端各自加密"保障。

七、参考资料


一句话总结easytier-core --no-tun -l ws://127.0.0.1:11011 + cloudflared tunnel run 两个窗口,配一条 CNAME,一个零公网端口、按需启停、客户端自由建网的 EasyTier 共享节点就上线了。

如对本教程有帮助,欢迎回复讨论;遇到文中未覆盖的问题也欢迎补充,我会持续更新排查表。

关键词:EasyTierCloudflare Tunnel虚拟局域网共享节点自建节点
所属分类:网站技术
本文地址:https://me.i-i.me/article/82.html



评论提示: 点击头像可以回复评论

提交取消回复
[face]@
[uname]  [add_time]
[content]
[reply]
加载更多评论