EasyTier 自建公网中继节点部署文档

EasyTier 自建公网中继节点部署文档(命令行版)

本版本改为直接用命令行配置 easytier-core 来搭建中继节点。

不再需要 easytier-web-embed Web 管理后台,也不需要 Nginx / OpenResty 反代。

中继节点作为一个公共共享节点运行:它本身不加入任何具体网络(不写网络名称 / 网络密钥、不分配虚拟 IP),只用 --relay-network-whitelist 指定“为哪些网络转发”。监听端口、转发白名单、节点标识全部写死在命令行里,节点在 easytier-cli 里显示的类型(Local / p2p / relay)和监听端口一目了然,彻底避免了旧方案里“客户端连接端口以 Web 后台事件日志中显示的监听端口为准”这种端口和节点类型显示不确定的问题。


1. 为什么去掉 Web 管理后台

旧方案的结构是:easytier-web-embed(Web 后台 + 配置下发服务)→ 下发配置给 easytier-coreeasytier-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-vpnhome-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)。

  • 不写网络名 / 密钥:中继不作为任何网络的成员,它只做转发和打洞协助,不参与、也无法解密各网络内部流量。各网络的客户端凭自己的网络名 + 密钥互相组网,中继只按白名单转发。
  • 不写 -ieasytier-core 官方说明——-i(ipv4)为空时该节点仅转发数据包、不创建 TUN 设备,也不需要 root。这正是纯中继想要的形态。

8.2 中继是如何生效的

EasyTier 默认每个节点都会为经过它的虚拟网转发流量。所以这个公共共享节点只要:

  1. 有公网 IP;
  2. -l 开放了监听端口;
  3. --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:11010udp://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/tuncap_add: NET_ADMIN / NET_RAW

15.5 节点之间只能经中继、无法直连(P2P)

easytier-cli peercost 一直是 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)。

posted @ 2026-07-14 11:25  饿死的大肥鱼  阅读(39)  评论(0)    收藏  举报