跳过正文
  1. 博客文章/

EasyTier Supervisor 部署

·1202 字·6 分钟·
DevOps SRE EasyTier Supervisor DevOps VPN SRE
Zayn
作者
Zayn
专注 Kubernetes、CI/CD、可观测性等云原生技术栈,记录生产环境中的实战经验与踩坑复盘。
目录
生产变更复盘 - 这篇文章属于一个选集。
8: 本文
这是一套 EasyTier 私有组网的部署 runbook:公网共享节点负责发现和中转,HK/US 两台客户端通过固定虚拟 IP 加入同一网络,进程交给 Supervisor 托管,并启用 KCP / QUIC Proxy 改善跨区域 TCP 连接体验。
文中使用 203.0.113.1010.144.66.0/24et-private-netCHANGE_ME_NETWORK_SECRET 作为示例值。落地前替换成自己的公网地址、虚拟网段、网络名和密钥;已经出现在聊天、工单或 Git 里的 network-secret 需要重新生成。

0. 结论和使用边界
#

这份记录适合已经拿到 EasyTier Linux 二进制、希望用一台公网机器做私有共享节点的场景。可复用的是部署顺序、Supervisor 配置、验证矩阵、继续/停止条件和回滚路径;不能直接照抄的是公网地址、虚拟网段、主机名和密钥。

示例配置
组件EasyTier CLI / easytier-core
进程管理Supervisor
共享节点public-share,公网地址 203.0.113.10
共享节点端口23451/tcp23451/udp
共享节点模式--private-mode true,只允许同网络名和同密钥节点接入
HK 客户端hk-client,虚拟 IP 10.144.66.3
US 客户端us-client,虚拟 IP 10.144.66.6
客户端模式固定虚拟 IP,主动连接共享节点,--no-listener 不监听本地端口
传输优化--enable-kcp-proxy--enable-quic-proxy--use-smoltcp

风险边界也要明确:

  • network-secret 一旦暴露,就按已失效处理,生成新密钥并全网同步替换。
  • 共享节点不配置 -i/--ipv4,主要承担发现、握手和转发;客户端才配置固定虚拟 IP。
  • 本文的 Supervisor 配置使用 user=root,目标是稳定创建 TUN 设备和虚拟 IP,不是 no-root 部署。
  • KCP / QUIC Proxy 需要有虚拟网内 TCP 连接才会出现活跃记录,不能只看进程状态判断是否生效。

1. 拓扑和流量路径
#

先把角色关系说清楚,后面的命令才有落点。共享节点只负责接入和中转,HK/US 客户端通过同一个 network-namenetwork-secret 进入同一个虚拟网络。

flowchart LR
    hk["hk-client
10.144.66.3"] -->|TCP/UDP 23451| share["public-share
203.0.113.10"] us["us-client
10.144.66.6"] -->|TCP/UDP 23451| share hk <-->|Virtual Network
10.144.66.0/24| us

客户端启动后主动连接共享节点:

  • -p tcp://203.0.113.10:23451 用作初始 peer。
  • -e tcp://203.0.113.10:23451 用作外部发现节点。
  • --no-listener 让客户端不在本机开放 EasyTier 监听端口。
  • --hostname 用于在 EasyTier 节点列表和日志里区分客户端。

2. Review Gate
#

上线前先过一遍 Review Gate。这里的目标不是证明链路一定稳定,而是避免把明显不可用或不可回滚的配置推到线上。

检查项方法通过标准
二进制存在test -x /root/easytier-linux-x86_64/easytier-core命令退出码为 0
CLI 存在test -x /root/easytier-linux-x86_64/easytier-cli命令退出码为 0
版本可见/root/easytier-linux-x86_64/easytier-core --version输出版本号
端口规划检查安全组、防火墙、现有监听23451/tcp23451/udp 未被占用并允许访问
虚拟 IP 规划检查现有 EasyTier 节点和路由10.144.66.310.144.66.6 未冲突
密钥状态检查聊天记录、工单、Git diff没有继续使用已暴露密钥
回滚点备份 /etc/supervisor/conf.d/easytier-*.conf能恢复原 Supervisor 配置

准备命令:

test -x /root/easytier-linux-x86_64/easytier-core
test -x /root/easytier-linux-x86_64/easytier-cli
/root/easytier-linux-x86_64/easytier-core --version
/root/easytier-linux-x86_64/easytier-cli --version

如果希望目录更规范,可以把二进制放到 /opt/easytier/。路径迁移要单独做,不要一边移动文件一边上线;先确认新路径能执行,再同步替换 Supervisor 的 command

3. 生成和替换网络密钥
#

不要复用已经暴露过的 network-secret。生成新密钥:

openssl rand -base64 32 | tr -d '=+/' | cut -c1-32

后续示例统一使用:

network-name: et-private-net
network-secret: CHANGE_ME_NETWORK_SECRET
public-server: 203.0.113.10
listen-port: 23451

network-namenetwork-secret 必须在共享节点和所有客户端上保持一致。密钥只放在 root 可读的部署文件里,不写入公开文章、工单、聊天记录或仓库。

4. 分阶段部署策略
#

这类组网变更适合按节点推进。共享节点先启动,确认 TCP/UDP 监听正常,再接入第一个客户端,随后接入第二个客户端并验证互通。

阶段可以继续的条件应该停止的信号
启动共享节点supervisorctl status easytier-shareRUNNING23451/tcp23451/udp 都在监听进程反复退出、端口未监听、日志出现密钥或监听地址错误
接入 HK 客户端easytier-hk-clientRUNNING,客户端日志出现连接共享节点的记录客户端无法连到 203.0.113.10:23451,或虚拟 IP 未创建
接入 US 客户端easytier-us-clientRUNNING,HK/US 虚拟 IP 互通IP 冲突、ping 不通、日志提示 network-name/secret 不一致
验证 KCP/QUIC产生 SSH/HTTP 等虚拟网内 TCP 流量后,easytier-cli proxy 能看到代理记录只有进程状态正常但无代理记录,或业务 TCP 连接失败
固化配置Supervisor 配置权限为 600,备份已生成配置里仍有真实密钥、真实公网地址或错误主机名

5. 公网共享节点
#

共享节点需要公网可达,并开放 TCP/UDP 23451。如果服务器同时有 IPv4 和 IPv6,可以监听两类地址:

/root/easytier-linux-x86_64/easytier-core \
  --private-mode true \
  --network-name et-private-net \
  --network-secret CHANGE_ME_NETWORK_SECRET \
  -l 'tcp://[::]:23451' \
  -l 'udp://[::]:23451' \
  -l 'tcp://0.0.0.0:23451' \
  -l 'udp://0.0.0.0:23451' \
  --multi-thread \
  --use-smoltcp \
  --file-log-level off \
  --enable-kcp-proxy \
  --enable-quic-proxy

如果机器没有 IPv6,去掉 [::] 两行即可。

检查监听:

ss -lntup | grep ':23451'
ss -lnuap | grep ':23451'

UFW 环境放行端口:

ufw allow 23451/tcp
ufw allow 23451/udp

不用 UFW 的环境按自己的防火墙或云安全组放行同样的 TCP/UDP 端口。

6. 客户端连接共享节点
#

客户端主动连接公网共享节点,不监听本地端口。HK 客户端:

/root/easytier-linux-x86_64/easytier-core \
  --network-name et-private-net \
  --network-secret CHANGE_ME_NETWORK_SECRET \
  -i 10.144.66.3 \
  -p tcp://203.0.113.10:23451 \
  -e tcp://203.0.113.10:23451 \
  --no-listener \
  --hostname "$(hostname -s)" \
  --multi-thread \
  --use-smoltcp \
  --file-log-level off \
  --bind-device false \
  --enable-kcp-proxy \
  --enable-quic-proxy

US 客户端只换虚拟 IP:

/root/easytier-linux-x86_64/easytier-core \
  --network-name et-private-net \
  --network-secret CHANGE_ME_NETWORK_SECRET \
  -i 10.144.66.6 \
  -p tcp://203.0.113.10:23451 \
  -e tcp://203.0.113.10:23451 \
  --no-listener \
  --hostname "$(hostname -s)" \
  --multi-thread \
  --use-smoltcp \
  --file-log-level off \
  --bind-device false \
  --enable-kcp-proxy \
  --enable-quic-proxy

参数含义:

参数作用
--network-name虚拟网络名称,同一网络必须一致
--network-secret网络密钥,同一网络必须一致
-i当前节点虚拟 IP
-p / --peers初始连接的 peer
-e / --external-node用作发现的共享节点
--no-listener客户端不监听端口,只主动连接
--bind-device false不把连接 socket 固定到物理网卡
--use-smoltcp为 KCP Proxy / 子网代理启用用户态网络栈
--enable-kcp-proxy将虚拟网内 TCP 流量代理为 KCP,改善丢包链路
--enable-quic-proxy启用 QUIC Proxy;KCP 和 QUIC 同开时通常优先看到 KCP

7. Supervisor 托管
#

示例按 Debian / Ubuntu 的 /etc/supervisor/conf.d/ 编写。RHEL / CentOS 常见目录是 /etc/supervisord.d/,路径不同但配置思路相同。

安装 Supervisor:

apt update
apt install -y supervisor
systemctl enable --now supervisor

7.1 共享节点配置
#

cat > /etc/supervisor/conf.d/easytier-share.conf <<'EOF'
[program:easytier-share]
command=/root/easytier-linux-x86_64/easytier-core --private-mode true --network-name et-private-net --network-secret CHANGE_ME_NETWORK_SECRET -l tcp://[::]:23451 -l udp://[::]:23451 -l tcp://0.0.0.0:23451 -l udp://0.0.0.0:23451 --multi-thread --use-smoltcp --file-log-level off --enable-kcp-proxy --enable-quic-proxy
directory=/root
autostart=true
autorestart=true
startsecs=5
startretries=3
stopsignal=TERM
stopasgroup=true
killasgroup=true
user=root
redirect_stderr=true
stdout_logfile=/var/log/supervisor/easytier-share.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=1
EOF
chmod 600 /etc/supervisor/conf.d/easytier-share.conf

加载配置:

supervisorctl reread
supervisorctl update
supervisorctl status easytier-share

7.2 HK 客户端配置
#

Supervisor 的 command 默认不是 shell,$(hostname) 不会自动展开。客户端如果要动态使用当前主机名,需要显式通过 /bin/sh -lc 包一层。

cat > /etc/supervisor/conf.d/easytier-hk-client.conf <<'EOF'
[program:easytier-hk-client]
command=/bin/sh -lc 'exec /root/easytier-linux-x86_64/easytier-core --network-name et-private-net --network-secret CHANGE_ME_NETWORK_SECRET -i 10.144.66.3 -p tcp://203.0.113.10:23451 -e tcp://203.0.113.10:23451 --no-listener --hostname "$(hostname -s)" --multi-thread --use-smoltcp --file-log-level off --bind-device false --enable-kcp-proxy --enable-quic-proxy'
directory=/root
autostart=true
autorestart=true
startsecs=5
startretries=3
stopsignal=TERM
stopasgroup=true
killasgroup=true
user=root
redirect_stderr=true
stdout_logfile=/var/log/supervisor/easytier-hk-client.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=1
EOF
chmod 600 /etc/supervisor/conf.d/easytier-hk-client.conf

加载配置:

supervisorctl reread
supervisorctl update
supervisorctl status easytier-hk-client

7.3 US 客户端配置
#

cat > /etc/supervisor/conf.d/easytier-us-client.conf <<'EOF'
[program:easytier-us-client]
command=/bin/sh -lc 'exec /root/easytier-linux-x86_64/easytier-core --network-name et-private-net --network-secret CHANGE_ME_NETWORK_SECRET -i 10.144.66.6 -p tcp://203.0.113.10:23451 -e tcp://203.0.113.10:23451 --no-listener --hostname "$(hostname -s)" --multi-thread --use-smoltcp --file-log-level off --bind-device false --enable-kcp-proxy --enable-quic-proxy'
directory=/root
autostart=true
autorestart=true
startsecs=5
startretries=3
stopsignal=TERM
stopasgroup=true
killasgroup=true
user=root
redirect_stderr=true
stdout_logfile=/var/log/supervisor/easytier-us-client.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=1
EOF
chmod 600 /etc/supervisor/conf.d/easytier-us-client.conf

加载配置:

supervisorctl reread
supervisorctl update
supervisorctl status easytier-us-client

8. 验证矩阵
#

部署后按共享节点、客户端、虚拟网互通、代理通道四层验证。不要只看 Supervisor RUNNING,进程存活不等于组网成功。

验证项方法通过标准
共享节点进程supervisorctl status easytier-share状态为 RUNNING
TCP 监听ss -lntup 后过滤 :23451能看到 23451/tcp 监听
UDP 监听ss -lnuap 后过滤 :23451能看到 23451/udp 监听
共享节点日志tail -n 100 /var/log/supervisor/easytier-share.log无反复退出、密钥错误、监听失败
HK 客户端进程supervisorctl status easytier-hk-client状态为 RUNNING
US 客户端进程supervisorctl status easytier-us-client状态为 RUNNING
虚拟 IPip addr 后过滤 10.144.66客户端看到自己的虚拟 IP
客户端互通ping -c 3 10.144.66.6HK 到 US 有响应
TCP 业务路径ssh 10.144.66.6 或访问虚拟网内 HTTP 服务TCP 连接能建立
KCP/QUIC Proxy/root/easytier-linux-x86_64/easytier-cli proxy产生 TCP 流量后出现 KcpQuic

常用检查命令:

supervisorctl status easytier-share
ss -lntup | grep ':23451'
ss -lnuap | grep ':23451'
tail -n 100 /var/log/supervisor/easytier-share.log
supervisorctl status easytier-hk-client
supervisorctl status easytier-us-client
tail -n 100 /var/log/supervisor/easytier-hk-client.log
tail -n 100 /var/log/supervisor/easytier-us-client.log
ip addr | grep '10.144.66'
ping -c 3 10.144.66.6
ssh 10.144.66.6

查看代理连接:

/root/easytier-linux-x86_64/easytier-cli proxy

transport_type 出现 KcpQuic,说明对应代理通道已经建立。KCP 和 QUIC 同时启用时,实际输出可能优先看到 KCP。

9. no-root 模式边界
#

EasyTier 的 no-root 模式需要加:

--no-tun

它适合没有 root 权限、不能创建 TUN 设备的环境。这个模式下节点仍可通过虚拟 IP 被访问,也支持 TCP、UDP、ICMP 和子网代理,但节点不能像普通 TUN 模式那样主动访问其他节点。需要主动访问时,要配合 SOCKS5。

当前 Supervisor 配置使用 user=root 运行,目标是稳定创建虚拟网卡和虚拟 IP。后续如果要改成 no-root,要单独验证三件事:

  • 访问方向是否满足业务要求。
  • 是否需要 SOCKS5 作为主动访问入口。
  • --no-tun 下 KCP / QUIC Proxy 和业务连接路径是否仍符合预期。

10. 回滚方案
#

回滚不是只停进程。至少要能恢复 Supervisor 配置、停止错误实例,并在密钥变更场景下保证所有节点一致。

备份 Supervisor 配置:

tar czf /root/easytier-supervisor-backup-$(date +%F-%H%M%S).tar.gz \
  /etc/supervisor/conf.d/easytier-*.conf

停止实例:

supervisorctl stop easytier-share
supervisorctl stop easytier-hk-client
supervisorctl stop easytier-us-client

恢复配置后重新加载:

supervisorctl reread
supervisorctl update
supervisorctl restart easytier-share
supervisorctl restart easytier-hk-client
supervisorctl restart easytier-us-client

如果只是更换 network-secret,必须共享节点和所有客户端同步替换。只改一端会导致节点无法握手。

回滚场景处理方式验证
共享节点无法启动恢复旧 easytier-share.conf,重新 supervisorctl updatesupervisorctl status easytier-shareRUNNING
单个客户端接入失败停止该客户端,恢复旧客户端配置其他客户端仍可通过共享节点运行
密钥写错同步替换共享节点和所有客户端密钥客户端重新握手并恢复互通
KCP/QUIC 异常临时移除 --enable-kcp-proxy / --enable-quic-proxy 后重启普通虚拟网连接可用
no-root 改造失败回到 user=root 和 TUN 模式配置虚拟 IP 存在,客户端互通

11. 常见问题
#

11.1 Supervisor 里 $(hostname) 没展开
#

现象:EasyTier 节点名显示为字面量,或日志里看不到预期主机名。

可能原因:Supervisor 不会自动通过 shell 执行 command

处理方式:

command=/bin/sh -lc 'exec ... --hostname "$(hostname -s)" ...'

也可以直接写死:

--hostname hk-client

11.2 客户端无法连接共享节点
#

现象:客户端进程反复重启,或日志里持续连接 203.0.113.10:23451 失败。

可能原因:

  • 公网安全组没有同时放行 TCP/UDP 23451
  • 本机防火墙只放行了 TCP,没有放行 UDP。
  • 共享节点没有真正监听 23451

处理方式:

nc -vz 203.0.113.10 23451
nc -vzu 203.0.113.10 23451
supervisorctl status
tail -n 100 /var/log/supervisor/easytier-hk-client.log

11.3 节点启动后互相 ping 不通
#

现象:Supervisor 状态正常,但 ping -c 3 10.144.66.6 失败。

可能原因:

  • network-namenetwork-secret 不一致。
  • 客户端虚拟 IP 冲突。
  • 客户端误用了 --no-tun,访问方向和普通 TUN 模式不同。

处理方式:

ip addr | grep '10.144.66'
tail -n 100 /var/log/supervisor/easytier-hk-client.log
tail -n 100 /var/log/supervisor/easytier-us-client.log

必要时先停掉其中一个客户端,排除虚拟 IP 冲突:

supervisorctl stop easytier-us-client
ping -c 3 10.144.66.3

11.4 easytier-cli proxy 没有 KCP/QUIC
#

现象:进程正常,虚拟 IP 也能 ping,但 easytier-cli proxy 看不到代理连接。

可能原因:KCP/QUIC Proxy 只会在有对应 TCP 连接时出现活跃记录。

处理方式:先产生一条虚拟网内 TCP 连接,例如 SSH 或 HTTP,再查看:

ssh 10.144.66.6
/root/easytier-linux-x86_64/easytier-cli proxy

如果同时启用 KCP 和 QUIC,优先看到 KCP 属于预期现象。

11.5 修改密钥后全部节点离线
#

现象:共享节点正常监听,但所有客户端都无法加入网络。

可能原因:只改了共享节点或只改了客户端,导致握手密钥不一致。

处理方式:在维护窗口内同步修改共享节点和所有客户端配置,重新加载 Supervisor:

supervisorctl reread
supervisorctl update
supervisorctl restart easytier-share
supervisorctl restart easytier-hk-client
supervisorctl restart easytier-us-client

12. 发布前脱敏检查
#

发布前只保留方法和示例值,不保留能定位真实环境的信息。需要检查:

  • 真实 network-secret
  • 真实公网 IP
  • 真实内网 IP 或虚拟网络规划
  • 真实主机名
  • 私有仓库地址、Token、私钥、API Key

扫描文章:

ARTICLE_FILE="content/posts/easytier-supervisor-deployment.md"
PRIVATE_IP_PATTERN="(^|[^0-9.])(10\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|172\\.(1[6-9]|2[0-9]|3[0-1])\\.[0-9]{1,3}\\.[0-9]{1,3}|192\\.168\\.[0-9]{1,3}\\.[0-9]{1,3})([^0-9.]|$)"
SECRET_PATTERN="glpat-|oauth2:|BEGIN (RSA|OPENSSH|PRIVATE)|Authorization:[[:space:]]*Bearer|AKIA[0-9A-Z]{16}|api[_-]?key\\s*=|password\\s*=|passwd\\s*=|secret\\s*=|token\\s*=|client_secret\\s*=|private_key"

grep -nEi "${PRIVATE_IP_PATTERN}|${SECRET_PATTERN}" "${ARTICLE_FILE}" || true

本文允许命中 10.144.66.x,它是刻意保留的示例虚拟网段。其他真实公网地址、真实内网地址、真实密钥或 Token 命中后,先脱敏再发布。

检查新增 diff:

git diff -- content/posts/easytier-supervisor-deployment.md \
  | grep -E '^\\+[^+]' \
  | grep -nEi "${PRIVATE_IP_PATTERN}|${SECRET_PATTERN}" || true

构建验证:

hugo --minify

如果构建失败,先修当前文章里的 front matter、shortcode、Mermaid 或未闭合代码块,不要把构建产物、public/resources/_gen/images 加进提交。

13. 复用原则
#

这类 EasyTier 部署可以按五条规则复用:

  • 共享节点先上线,客户端后接入;每接入一个节点都先验证再继续。
  • 密钥当作一次性生产凭据管理,暴露后立即轮换。
  • Supervisor 配置权限收紧到 600,日志保留够排障即可。
  • KCP / QUIC Proxy 的验证要产生 TCP 流量,只看进程状态不够。
  • no-root 是另一种访问模型,不要在同一次变更里和 TUN 模式混改。

14. 参考
#

生产变更复盘 - 这篇文章属于一个选集。
8: 本文

相关文章

用 Docker Compose 部署 Scrutiny:NVMe 健康监控的最小可用方案
·772 字·4 分钟
SRE NVMe SMART SRE DevOps +3
华为 UPS2000 接入 NUT Server:编译 huawei-ups2000 驱动并完成联动
··2156 字·11 分钟
SRE NUT UPS Linux SRE +4
生产级 DNS 集群从零部署:dnsdist 与 Technitium 三节点架构
·2755 字·13 分钟
SRE DNS DDNS SRE DevOps +4