原文作者: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,确认三项:
- Network → WebSockets = On(默认开);
- SSL/TLS → 加密模式 = 完全(Full);
- Zone 状态 Active。
步骤 1:下载 EasyTier
从 Releases 下载 easytier-windows-x86_64-vX.Y.Z.zip(≥ 2.5.0,wss 地址无需写 :0),解压到 D:\EasyTier\(内含 easytier-core.exe 和 easytier-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 官方文档 · 搭建共享节点
- EasyTier 官方文档 · 无 TUN 模式(--no-tun)
- EasyTier 官方文档 · 快速组网
- Cloudflare · cloudflared 配置文件
- Cloudflare · WebSockets
- 通过 Cloudflare Tunnel 实现 EasyTier 无公网自建中转服务器
一句话总结: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
评论