EasyTier 自建公网中继节点部署文档
EasyTier 自建公网中继节点部署文档(命令行版)
本版本改为直接用命令行配置
easytier-core来搭建中继节点。不再需要
easytier-web-embedWeb 管理后台,也不需要 Nginx / OpenResty 反代。中继节点作为一个公共共享节点运行:它本身不加入任何具体网络(不写网络名称 / 网络密钥、不分配虚拟 IP),只用
--relay-network-whitelist指定“为哪些网络转发”。监听端口、转发白名单、节点标识全部写死在命令行里,节点在easytier-cli里显示的类型(Local / p2p / relay)和监听端口一目了然,彻底避免了旧方案里“客户端连接端口以 Web 后台事件日志中显示的监听端口为准”这种端口和节点类型显示不确定的问题。
1. 为什么去掉 Web 管理后台
旧方案的结构是:easytier-web-embed(Web 后台 + 配置下发服务)→ 下发配置给 easytier-core。easytier-core 通过 --config-server tcp://127.0.0.1:26020/admin 去 Web 后台“领配置”,再参与中继。
问题在于:
- 多了一层间接。真正干活的只有
easytier-core,转发白名单、监听端口这些参数它本来就能直接从命令行接收,Web 后台只是把参数换个地方填一遍再下发。 - 端口 / 节点类型显示不可控。核心节点最终监听哪个端口、在网络里以什么“类型”出现,取决于 Web 后台下发的配置,于是旧文档里到处是“实际端口以 Web 后台事件日志为准”“如果 Web 端实际监听的是 11010……”这类不确定描述。
- 多装一堆东西。Web 后台还要配 SQLite、
--api-host、Nginx/OpenResty 反代、80/443 证书,任何一处配错都会导致验证码不显示、接口 Mixed Content 等一连串问题。
而 EasyTier 本身是去中心化的,不区分服务器和客户端。不带任何网络参数启动的 easytier-core 就是一个公共共享节点,默认会为经过它的虚拟网转发流量、帮助节点互相发现和打洞。要限定“只给自己的网络用”,加一个 --relay-network-whitelist 白名单即可。
所以中继节点只需要一条 easytier-core 命令,Web 管理后台纯属多余。
| 对比项 | 旧方案(Web 后台) | 新方案(命令行公共共享节点) |
|---|---|---|
| 需要的程序 | easytier-web-embed + easytier-core |
仅 easytier-core(外加 easytier-cli 查看状态) |
| 中继归属 | Web 后台建网络、下发配置 | 中继不加入网络,用 --relay-network-whitelist 指定服务哪些网络 |
| 监听端口 | 由 Web 后台下发,需看事件日志确认 | -l 参数显式指定,确定不变 |
| 节点类型显示 | 取决于下发配置,容易对不上 | easytier-cli 里直接可见,明确 |
| Nginx / 80 / 443 / 证书 | 需要 | 不需要 |
| 需要开放的端口 | 80、443、26010/26020,外加组网端口… | 仅 1 个组网端口(本文示例 11010,建议自定义) |
2. 部署目标与整体架构
在一台有公网 IP 的服务器上,用命令行部署一个 easytier-core 公共共享 / 中继节点,实现:
- 公网服务器作为多个虚拟网络(如
chenyan-vpn、home-vpn)共用的中继 / 入口节点; - Windows 客户端、局域网 Linux、Docker 客户端等设备,通过公网服务器加入各自的虚拟局域网;
- 同一网络内的设备可通过 EasyTier 虚拟 IP 互相访问;
- 无法直连(NAT 后)的设备之间,由公网中继节点转发流量。
整体结构:
公网服务器
└── easytier-core.service # 唯一需要的服务:公共共享 / 中继节点
# 不加入网络,只为白名单网络转发
客户端(按各自网络组网,都指向同一个中继)
├── chenyan-vpn: Windows / Linux / Docker ...
└── home-vpn : Windows / Linux / Docker ...
3. 前提条件
3.1 服务器要求
准备一台公网服务器(如阿里云 ECS):
- 有公网 IP;
- 可以配置安全组 / 防火墙放行端口;
- Linux 系统。
关于 root:作为纯转发中继(不分配虚拟 IP、不建 TUN 网卡)时其实不需要 root。下文示例沿用
User=root,是为了与常见部署保持一致,不是必需。
示例公网 IP(下文均以此为例,为文档保留示例地址,请替换为你自己的真实公网 IP):
203.0.113.10
3.2 端口规划
命令行方案下端口非常简单,只需要一个组网端口。下文示例统一用 EasyTier 默认端口 11010;出于安全考虑,建议你换成一个自定义端口(只要 -l 与防火墙同步即可,能减少被端口扫描或陌生节点连上的概率):
| 端口 | 协议 | 服务 | 用途 | 是否需要公网开放 |
|---|---|---|---|---|
11010 |
TCP | easytier-core |
组网 / 中继入口(TCP) | 是 |
11010 |
UDP | easytier-core |
组网 / 中继入口(UDP,打洞需要) | 是 |
说明:
- 不再需要
80 / 443(没有 Web 后台,无需 Nginx 反代和证书)。- 不再需要
26010 / 26020(那是 Web 后台的 API / 配置下发端口)。- 端口由你在命令行
-l里指定,不存在“实际端口以后台为准”的问题。- 如需启用
ws / wss / wg / quic / faketcp等协议入口,EasyTier 会用相邻端口,按需再开放即可(一般 TCP+UDP 11010 已足够)。
4. 下载 EasyTier 安装包
进入临时目录:
cd /tmp
4.1 直接下载
wget https://github.com/EasyTier/EasyTier/releases/download/v2.6.0/easytier-linux-x86_64-v2.6.0.zip
4.2 使用 ghfast.top 加速下载
服务器访问 GitHub 较慢时:
wget https://ghfast.top/https://github.com/EasyTier/EasyTier/releases/download/v2.6.0/easytier-linux-x86_64-v2.6.0.zip
5. 解压安装包
如果没有 unzip,先安装:
# Debian / Ubuntu
apt install unzip -y
# CentOS / Rocky / AlmaLinux
yum install unzip -y
解压并进入目录:
unzip easytier-linux-x86_64-v2.6.0.zip
cd easytier-linux-x86_64
ls -la
通常会看到:
easytier-core
easytier-cli
easytier-web
easytier-web-embed
6. EasyTier 文件说明
| 文件 | 作用 | 本方案是否使用 |
|---|---|---|
easytier-core |
核心程序,负责组网、节点连接、中继转发 | ✅ 使用 |
easytier-cli |
命令行管理工具,查看节点、路由、状态 | ✅ 使用(查看 / 排错) |
easytier-web |
Web API 服务(不含前端) | ❌ 不用 |
easytier-web-embed |
内置 Web 管理后台 | ❌ 不用,本方案已弃用 |
本方案只需要:
easytier-core(+ easytier-cli 用于查看状态)
7. 创建部署目录
mkdir -p /opt/easytier/server
cp easytier-core easytier-cli /opt/easytier/server/
chmod +x /opt/easytier/server/easytier-*
ls -la /opt/easytier/server/
8. 配置中继节点(核心步骤)
用一个 systemd 服务直接运行 easytier-core,作为公共共享节点:不加入任何网络,只用 --relay-network-whitelist 指定为哪些网络转发。
创建服务文件:
vi /etc/systemd/system/easytier-core.service
写入以下内容(请替换公网白名单里的网络名、machine-id / hostname 与监听端口):
[Unit]
Description=easytier-core Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/easytier/server/easytier-core \
--relay-network-whitelist chenyan-vpn home-vpn \
--machine-id aliyun-relay-01 \
--hostname aliyun-relay-01 \
-l tcp://0.0.0.0:11010 \
-l udp://0.0.0.0:11010
User=root
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
注意:每行末尾续行反斜杠
\后面不要有空格,否则 systemd 可能解析异常。
8.1 参数说明
| 参数 | 说明 |
|---|---|
--relay-network-whitelist chenyan-vpn home-vpn |
只为这些网络名转发流量(空格分隔多个,支持通配符如 home-*)。这是中继的“服务范围”,也让节点以中继类型出现 |
--machine-id aliyun-relay-01 |
节点唯一标识,保证唯一且固定不变(断线重连、身份识别用) |
--hostname aliyun-relay-01 |
此节点显示的名称,easytier-cli peer 中可见 |
-l tcp://0.0.0.0:11010 |
监听 TCP 11010(组网 / 中继入口) |
-l udp://0.0.0.0:11010 |
监听 UDP 11010(UDP 打洞需要) |
关键点:这里不写 --network-name / --network-secret,也不写 -i(虚拟 IP)。
- 不写网络名 / 密钥:中继不作为任何网络的成员,它只做转发和打洞协助,不参与、也无法解密各网络内部流量。各网络的客户端凭自己的网络名 + 密钥互相组网,中继只按白名单转发。
- 不写
-i:easytier-core官方说明——-i(ipv4)为空时该节点仅转发数据包、不创建 TUN 设备,也不需要 root。这正是纯中继想要的形态。
8.2 中继是如何生效的
EasyTier 默认每个节点都会为经过它的虚拟网转发流量。所以这个公共共享节点只要:
- 有公网 IP;
- 用
-l开放了监听端口; - 用
--relay-network-whitelist声明了要服务的网络名;
它就自动成为这些网络的中继 / 入口节点——各网络客户端把它写进“初始节点 / Peer”即可,互相无法直连的客户端会自动通过它转发并尝试打洞。不需要任何“开启中继”开关,也不需要 Web 后台。
8.3 白名单与私有模式(重要区别)
--relay-network-whitelist chenyan-vpn home-vpn(本方案):中继同时服务多个网络,只为白名单内的网络名转发。留空(--relay-network-whitelist后不接任何值)则不为任何其他网络转发。- 不要在这个中继上加
--private-mode true。私有模式意为“只允许与本节点网络名/密钥相同的节点握手/中转”,而本中继故意不属于任何网络、要为多个网络转发,加私有模式会把它们全部挡掉。访问控制交给--relay-network-whitelist即可。
(--private-mode 是给客户端 / 单网络专属节点用的,见第 13 章客户端配置。)
8.4 可选:放大文件句柄上限
作为公网服务器长期运行、连接数较多时,Linux 默认 1024 的 fd 上限可能不够。可在 [Service] 段加:
LimitNOFILE=1048576
9. 启动 systemd 服务
# 重新加载 systemd
systemctl daemon-reload
# 设置开机自启
systemctl enable easytier-core.service
# 启动
systemctl start easytier-core.service
# 查看状态
systemctl status easytier-core.service
# 查看日志
journalctl -u easytier-core.service -f
正常启动后,日志里应能看到监听 tcp://0.0.0.0:11010 和 udp://0.0.0.0:11010。
10. 防火墙 / 安全组配置
10.1 云安全组(如阿里云)
放行组网端口:
TCP 11010
UDP 11010
不再需要开放 80 / 443 / 26010 / 26020。若把
-l改成别的端口,这里同步放行对应端口即可。
10.2 服务器本机防火墙(firewalld)
firewall-cmd --add-port=11010/tcp --permanent
firewall-cmd --add-port=11010/udp --permanent
firewall-cmd --reload
# 查看已开放端口
firewall-cmd --list-ports
11. 验证中继节点(节点类型显示)
这是命令行方案相比 Web 后台最直观的地方:节点类型和连接方式在 easytier-cli 里一目了然。
在公网服务器上执行:
/opt/easytier/server/easytier-cli node
/opt/easytier/server/easytier-cli peer
/opt/easytier/server/easytier-cli route
easytier-cli node:查看本机节点信息。作为纯转发中继,它没有虚拟 IP,以共享 / 中继节点形态存在。easytier-cli peer:查看所有对端节点。重点看cost列,它就是“节点类型 / 可达方式”的显示:Local:本机节点;p2p:与该节点已直连(点对点);relay:与该节点通过中继转发(说明中继正在生效)。
easytier-cli route:查看路由 / 转发情况。
只要白名单内网络的客户端在 peer 列表里出现,中继节点就已经在正常工作。
12. Windows 客户端连接
Windows EasyTier GUI 中填写(以 chenyan-vpn 网络为例,home-vpn 同理):
| 配置项 | 示例 |
|---|---|
| 网络名称 | chenyan-vpn(必须在中继白名单里) |
| 网络密钥 | 该网络的强随机密钥(客户端之间一致,中继不需要知道) |
| 初始节点 / 服务器地址 | tcp://203.0.113.10:11010 |
| 虚拟 IP | 自动(DHCP)或手动指定,不与他人冲突 |
| 独立节点 / 作为服务器 | 不开启(客户端不需要监听公网) |
进阶(GUI 里如有对应开关,建议勾选):
- 私有模式(private mode):开启;
- 延迟优先(latency first):开启。
端口固定就是中继
-l里写的11010,不需要再去看后台日志确认端口。
13. 局域网 Linux / Docker 客户端配置
局域网内的客户端只连接公网中继,不监听公网地址。关键:公网 IP 只能写在 -p(初始节点 / Peer),绝不能写到 -l(监听地址)里。
客户端要写自己的网络名 + 密钥(这点和中继相反),并可按需开启私有模式、延迟优先。
13.1 直接用 easytier-core(systemd)
[Unit]
Description=EasyTier Client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/easytier/server/easytier-core \
--hostname internal-ubuntu24-client \
--network-name chenyan-vpn \
--network-secret 请替换为该网络的强随机密钥 \
--ipv4 10.10.10.21 \
-p tcp://203.0.113.10:11010 \
--private-mode true \
--latency-first
User=root
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
虚拟 IP 也可以改用
-d(DHCP)自动分配,替换掉--ipv4 10.10.10.21即可。
13.2 Docker Compose 部署示例(适合 1Panel)
mkdir -p /opt/easytier-client
cd /opt/easytier-client
vi docker-compose.yml
写入:
version: '3.8'
services:
easytier:
image: easytier/easytier:latest
container_name: easytier-client
hostname: internal-ubuntu24-client
restart: always
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tun
environment:
- TZ=Asia/Shanghai
volumes:
- /etc/machine-id:/etc/machine-id:ro
# 使用列表格式,避免多行字符串、空格、换行符导致参数解析异常
command: [
"--hostname", "internal-ubuntu24-client",
"--network-name", "chenyan-vpn",
"--network-secret", "请替换为该网络的强随机密钥",
"--ipv4", "10.10.10.21",
"-p", "tcp://203.0.113.10:11010",
"--private-mode", "true",
"--latency-first"
# "-n", "192.168.0.10/32" # 可选:宣告本节点后面的内网地址/网段(子网代理)
# "--enable-exit-node" # 可选:允许本节点作为出口节点(其他节点用 --exit-nodes 指定它)
]
启动与查看:
docker compose up -d # 旧版命令为 docker-compose up -d
docker ps | grep easytier
docker logs -f easytier-client
13.3 Docker 关键参数说明
| 配置项 | 说明 |
|---|---|
network_mode: host |
使用宿主机网络,减少虚拟网卡 / 路由 / 端口映射问题 |
NET_ADMIN / NET_RAW |
允许容器管理网络接口、使用原始网络能力 |
/dev/net/tun |
挂载 TUN 设备,用于创建虚拟网卡 |
/etc/machine-id(只读) |
固定机器 ID,避免节点身份频繁变化 |
--network-name / --network-secret |
本客户端所属网络的名称 / 密钥,同网络客户端之间必须一致,且网络名要在中继白名单内 |
--ipv4 |
本客户端虚拟 IP,手动指定并避免冲突(或用 -d 走 DHCP) |
-p tcp://203.0.113.10:11010 |
初始节点,填公网中继地址(不要填到 -l) |
--private-mode true |
客户端私有模式:不为陌生网络做中转 |
--latency-first |
延迟优先,尽量走最低延迟路径 |
13.4 可选路由参数
| 参数 | 说明 | 使用场景 |
|---|---|---|
-n 192.168.0.10/32 |
宣告本节点后面的内网地址 / 网段(子网代理) | 让其他节点访问该 Linux 所在局域网的指定主机 |
--enable-exit-node |
允许本节点作为出口节点 | 其他节点用 --exit-nodes <本节点虚拟IP> 把全局流量从这里出去 |
普通客户端一般不启用出口节点,除非明确要把该节点作为全局流量出口。
14. 常用检查命令
# 服务状态
systemctl status easytier-core.service
# 进程
ps -ef | grep easytier-core | grep -v grep
# 监听端口(确认 11010 已监听)
ss -lntup | grep easytier
ss -lntup | grep 11010
# 日志
journalctl -u easytier-core.service -n 200 --no-pager
journalctl -u easytier-core.service -f
# 节点 / 路由 / 对端
/opt/easytier/server/easytier-cli node
/opt/easytier/server/easytier-cli peer
/opt/easytier/server/easytier-cli route
15. 常见问题
15.1 客户端连接失败
客户端日志类似:连接错误: tcp://203.0.113.10:11010。排查顺序:
# 1. 服务器本机是否在监听该端口
ss -lntup | grep 11010
- 如果本机没监听:是
easytier-core没起来或-l端口写错,检查服务状态和日志。 - 如果本机监听正常,再依次检查:云安全组 → 本机防火墙 → 客户端初始节点地址 → 网络名是否在中继白名单内 → 同网络客户端的网络密钥是否一致。
15.2 客户端能连上中继但组不进网络
多半是网络名不在中继白名单里,或同网络的客户端密钥不一致:
中继 --relay-network-whitelist 是否包含该网络名(如 chenyan-vpn)
同一网络各客户端 --network-name / --network-secret 是否完全一致
--ipv4 是否与同网络其他节点冲突
注意:中继本身不需要、也不应该知道各网络的密钥;密钥只在同一网络的客户端之间保持一致。
15.3 Docker 客户端报 Address not available
错误示例:
failed to listen on tcp://203.0.113.10:11010
Address not available
原因:把公网 IP 填到了客户端的监听地址 -l 里。局域网机器没有这个公网 IP,无法监听。
处理:公网 IP 只能写在 -p(初始节点 / Peer):
# 正确
"-p", "tcp://203.0.113.10:11010"
# 错误
"-l", "tcp://203.0.113.10:11010"
15.4 TUN 设备异常
ls -l /dev/net/tun # 检查是否存在
modprobe tun # 不存在时加载模块
Docker 场景确认 compose 里包含 devices: /dev/net/tun 和 cap_add: NET_ADMIN / NET_RAW。
15.5 节点之间只能经中继、无法直连(P2P)
easytier-cli peer 里 cost 一直是 relay 而不是 p2p:
- 确认中继和客户端都开放并放行了 UDP 11010(UDP 打洞很关键,只开 TCP 会退化为中继);
- 可在客户端加
--latency-first,并检查两端 NAT 类型; - 对称 NAT 等复杂网络下部分链路只能走中继,属正常现象,中继保证连通性。
16. 安全建议
16.1 网络名称不是密码
chenyan-vpn / home-vpn 只是网络名称,不是安全凭据。真正保护网络的是 网络密钥(--network-secret),务必使用强随机字符串,并且只在同一网络的客户端之间共享——中继不需要知道它。
16.2 中继用白名单,客户端用私有模式
- 中继:用
--relay-network-whitelist限定服务的网络名,避免被陌生网络借用转发、消耗带宽。不要在中继上加--private-mode。 - 客户端:可加
--private-mode true,防止自己被当作陌生网络的中转。
16.3 最小化端口开放
只放行实际使用的组网端口即可。本方案只需要:
TCP 11010
UDP 11010
16.4 防滥用(可选)
公网中继若被大量陌生节点尝试连接,可配置 fail2ban 过滤握手超时的连接,降低无效连接数(参考 EasyTier 官方“搭建共享节点”文档)。也可用 --foreign-relay-bps-limit 限制转发带宽。
17. 最终配置关系示例
公网中继节点(easytier-core,公共共享节点,命令行直配):
hostname : aliyun-relay-01
machine-id : aliyun-relay-01
relay-network-whitelist : chenyan-vpn home-vpn # 只为这两个网络转发
监听 : tcp://0.0.0.0:11010 + udp://0.0.0.0:11010
网络名/密钥/虚拟IP : 不配置(纯转发,不加入网络,不建 TUN)
客户端(以 chenyan-vpn 为例):
network-name : chenyan-vpn (在中继白名单内)
network-secret : <该网络的强随机密钥> (同网络客户端一致)
初始节点 : tcp://203.0.113.10:11010
虚拟 IP : 10.10.10.x(手动或 DHCP)
模式 : --private-mode true --latency-first
验证:
easytier-cli node
easytier-cli peer # cost 列显示 p2p / relay
easytier-cli route
端口和节点类型完全由命令行决定,不再存在“以 Web 后台事件日志为准”的不确定性。
18. 附:从旧 Web 管理后台方案迁移
如果服务器上已经按旧文档部署过 easytier-web-embed,迁移到命令行方案:
# 1. 停止并禁用 Web 后台服务
systemctl stop easytier-web-embed.service
systemctl disable easytier-web-embed.service
rm -f /etc/systemd/system/easytier-web-embed.service
# 2. 按第 8 章重写 easytier-core.service:
# 去掉 --config-server(不再依赖 Web 后台),
# 中继改为公共共享节点:只保留 --relay-network-whitelist / --machine-id /
# --hostname / -l,不写 --network-name / --network-secret / -i。
# 3. 重载并重启
systemctl daemon-reload
systemctl restart easytier-core.service
# 4.(可选)删除 Nginx/OpenResty 里给 easytier 用的反代配置,关闭 80/443(若不再他用)
# 删除类似 /www/sites/my-proxy/proxy/conf.d/easytier.conf 后 reload
# 5. 安全组 / 防火墙只保留 11010 TCP/UDP,可关闭 26010 / 26020 等
迁移后,客户端的网络名称、网络密钥保持不变即可继续使用,只需确认:网络名在中继 --relay-network-whitelist 白名单内,客户端初始节点端口对上中继 -l(本文为 11010)。
参考:EasyTier 官方文档 —《去中心组网》《搭建共享节点》《完整配置选项》(easytier.cn)。

浙公网安备 33010602011771号