EasyTier 自建公网节点实战:双路由独立局域网如何访问 NAS
Docker + Unraid + Windows|P2P 内网穿透部署与踩坑记录
记录日期:2026 年 10 月 11 日
本文记录一次使用 EasyTier 解决双路由网络中 NAS 跨网段访问问题的实践,包括公网 VPS 部署、Docker 镜像下载失败、NAS 容器配置以及后续 P2P 连接测试。
一、背景:为什么需要内网穿透?
家里的网络拓扑如下:
光猫(路由模式)
│
├── 小米路由器 1
│ └── 交换机
│ └── NAS
│
└── 小米路由器 2
└── Windows 电脑两台小米路由器分别连接光猫,且都工作在路由模式,拥有各自独立的局域网。
现在的需求是:
保持两个独立局域网不变,让路由器 2 下的电脑能够访问路由器 1 下的 NAS。
传统方案包括:
把两个路由器调整为 AP 模式。
改变接线方式,让路由器 2 级联到路由器 1。
配置静态路由及防火墙规则。
使用 VPN 或 P2P 虚拟组网工具。
前两个方案需要改变当前网络架构,而静态路由方案又受小米路由器原厂固件的限制。
最终选择使用 EasyTier。
二、EasyTier 的工作原理
EasyTier 是一个开源的虚拟组网工具,支持 NAT 穿透、P2P 连接以及中继转发。
项目地址:https://github.com/EasyTier/EasyTier
本次计划使用一台具有公网 IP 的 VPS 作为共享节点。
公网 VPS
EasyTier 节点
/ \
节点发现 节点发现
/ \
NAS (EasyTier) Windows (EasyTier)
\ /
\──── P2P ──────/大致流程如下:
NAS 与 Windows 分别连接公网 EasyTier 节点。
公网节点帮助双方发现彼此。
双方尝试 NAT 穿透。
如果打洞成功,NAS 与 Windows 直接传输数据。
如果打洞失败,默认可以通过共享节点中继流量。
这里需要注意:公网服务器并不一定只承担注册中心的作用,必要时也可能承担流量中继。
如果希望公网服务器完全不转发文件数据,需要等直连验证成功以后,再额外限制中继功能。
三、部署环境与参数规划
本次环境如下:
使用的示例配置:
203.0.113.10 是示例地址,部署时需要换成真实 VPS IP。
网络名称和密钥在 VPS、NAS、Windows 三端必须保持一致,虚拟 IP 则不能重复。
四、公网 VPS 部署 EasyTier
4.1 创建目录
通过 SSH 登录 VPS,执行:
mkdir -p /opt/dockerCompose/easytier
cd /opt/dockerCompose/easytier生成一串随机密钥:
openssl rand -hex 24创建 .env 文件:
ET_NAME=home-et-2026
ET_SECRET=这里替换成生成的随机密钥设置文件权限:
chmod 600 .env4.2 遇到的问题:Docker 无法拉取镜像
最初直接通过 Docker Hub 拉取 EasyTier 镜像时,公网服务器无法正常连接镜像仓库索引。
原命令:
docker pull easytier/easytier:latest后来改用 DaoCloud 镜像地址:
docker pull \
m.daocloud.io/docker.io/easytier/easytier:latest本次测试下载成功。
随后给下载的镜像增加本地标签:
docker tag \
m.daocloud.io/docker.io/easytier/easytier:latest \
easytier/easytier:latest这样就可以继续在 Compose 中使用:
image: easytier/easytier:latest而不必修改所有配置。
需要注意,docker tag 不会重新下载镜像,只是给本地镜像增加一个引用。
如果不希望 Compose 再次访问 Docker Hub,可以添加:
pull_policy: never另一种方式是直接在 Compose 中使用 DaoCloud 的完整镜像地址。
4.3 创建 EasyTier Compose 文件
创建 easytier.yml:
services:
easytier:
image: easytier/easytier:latest
pull_policy: never
container_name: easytier-server
hostname: easytier-server
restart: unless-stopped
network_mode: host
environment:
TZ: Asia/Shanghai
command: >
--network-name ${ET_NAME}
--network-secret ${ET_SECRET}
--private-mode true
-l tcp://0.0.0.0:11010
-l udp://0.0.0.0:11010参数说明:
由于 VPS 主要作为共享节点,这里没有给它设置 EasyTier 虚拟 IP,也不需要按照 NAS 客户端的方式创建 TUN 设备。
4.4 启动服务
执行:
docker-compose -f easytier.yml up -d检查容器:
docker ps本次启动结果显示:
IMAGE STATUS NAMES
easytier/easytier:latest Up easytier-server随后检查日志:
docker logs easytier-server日志中的关键部分:
new listener added
listener=tcp://0.0.0.0:11010
new listener added
listener=udp://0.0.0.0:11010说明 EasyTier 成功启动了 TCP 和 UDP 监听器。
当前已验证:VPS Docker 容器正常启动,TCP/UDP 监听器成功创建。
但这还不能证明 NAS 或 Windows 已经成功连接,也不能证明 P2P 打洞成功。
4.5 配置 VPS 防火墙
需要在云服务器的安全组中放行:
如果 VPS 使用 firewalld,先检查其状态:
firewall-cmd --state如果正在运行,则执行:
firewall-cmd --permanent --add-port=11010/tcp
firewall-cmd --permanent --add-port=11010/udp
firewall-cmd --reload使用以下命令确认监听:
ss -lntup | grep 11010Windows 端也可以检查 TCP 入口:
Test-NetConnection 203.0.113.10 -Port 11010如果返回:
TcpTestSucceeded : True说明客户端能够连接 VPS 的 TCP 端口,但 UDP 和 P2P 还需要单独验证。
五、NAS 部署 EasyTier
NAS 使用 Unraid,并且计划通过独立 Docker 容器运行 EasyTier。
5.1 Docker 的 TUN 设备映射问题
最开始考虑使用:
devices:
- /opt/et/tun:/dev/net/tun希望把相关文件统一放在 /opt/et 目录下。
但这里有一个容易忽略的问题:
Linux 的 TUN 不是普通文件,而是字符设备。
Docker 的 devices 映射要求宿主机源路径对应真实设备节点,不能随便创建一个普通文件代替。
可以在 NAS 上检查:
ls -l /dev/net/tun正常情况下应当看到类似:
crw-rw-rw- 1 root root 10, 200 ... /dev/net/tun其中:
c表示字符设备。10, 200是 TUN 设备的主、次设备号。
所以推荐直接保留:
devices:
- /dev/net/tun:/dev/net/tun如果设备不存在,先检查 TUN 内核模块:
modprobe tun
ls -l /dev/net/tun5.2 machine-id 可以修改映射路径吗?
可以。
例如:
volumes:
- /opt/et/machine-id:/etc/machine-id:ro只要左边是真实的、可读取的文件,并且内容长期保持稳定即可。
不过对于 Unraid,更推荐把需要持久化的文件放在 appdata 目录。
原因是 Unraid 的部分系统目录位于内存文件系统,不能随意假设 /opt 中自行创建的数据重启后仍然存在。
创建目录:
mkdir -p /mnt/user/appdata/easytier如果打算单独保存一个 machine-id 文件,可以执行:
if [ ! -s /mnt/user/appdata/easytier/machine-id ]; then
tr -d '-' < /proc/sys/kernel/random/uuid \
> /mnt/user/appdata/easytier/machine-id
fi
chmod 644 /mnt/user/appdata/easytier/machine-id如果 NAS 原本已经有稳定的 /etc/machine-id,也可以直接只读映射宿主机原文件。
需要注意:
不要每次重启都生成新的 machine-id,也不要让不同节点共用同一个 machine-id。
5.3 NAS 端创建环境变量
进入部署目录:
cd /mnt/user/appdata/easytier创建 .env:
ET_NAME=home-et-2026
ET_SECRET=与VPS相同的网络密钥
VPS_IP=203.0.113.10然后执行:
chmod 600 .env5.4 NAS 端 Compose 文件
创建 easytier.yml:
services:
easytier:
image: easytier/easytier:latest
container_name: easytier-nas
hostname: home-nas
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- /mnt/user/appdata/easytier/machine-id:/etc/machine-id:ro
environment:
TZ: Asia/Shanghai
command: >
-i 10.144.144.1
--network-name ${ET_NAME}
--network-secret ${ET_SECRET}
-p tcp://${VPS_IP}:11010这里几个比较重要的参数:
network_mode: host
让 EasyTier 在 NAS 的宿主机网络空间中运行。需要注意与已有 VPN、虚拟网卡和路由规则的冲突。
cap_add
给容器增加网络管理能力。
devices
允许容器访问 TUN 设备。
-i 10.144.144.1
指定 NAS 的 EasyTier 虚拟 IP。
-p tcp://...
连接自建公网共享节点。
启动:
docker-compose -f easytier.yml up -d检查日志:
docker logs --tail 50 easytier-nas查看连接节点:
docker exec easytier-nas easytier-cli peer这一步需要确认 NAS 能正常发现公网 VPS。
六、Windows 安装客户端
Windows 不需要运行 Docker,直接安装 EasyTier GUI 即可。
官方下载地址:
https://easytier.cn/guide/download.html
GitHub:
https://github.com/EasyTier/EasyTier/releases
安装客户端后,创建网络并配置:
不同版本的 GUI 可能有不同的字段名称,以实际界面为准。
如果使用 CLI,可以在管理员 PowerShell 中执行:
.\easytier-core.exe `
-i 10.144.144.2 `
--network-name home-et-2026 `
--network-secret "替换成实际密钥" `
-p tcp://203.0.113.10:11010需要确保 Windows 与 NAS 的虚拟 IP 不重复,并且网络名称和密钥完全一致。
七、测试 NAS 网络连接
NAS 和 Windows 成功加入同一个 EasyTier 网络后,Windows 应当能够尝试访问 NAS 的虚拟 IP。
首先测试:
ping 10.144.144.1随后检查 SMB 端口:
Test-NetConnection 10.144.144.1 -Port 445如果返回:
TcpTestSucceeded : True可以在 Windows 文件资源管理器中输入:
\\10.144.144.1然后使用 NAS 的 SMB 账号登录。
如果 ping 正常但 SMB 无法访问,需要进一步检查 NAS 的 SMB 服务是否运行、监听接口以及防火墙和共享权限。
整个过程中不需要在公网开放 NAS 的 SMB 445 端口。
八、如何判断 P2P 是否成功?
在 NAS 上执行:
docker exec easytier-nas easytier-cli peer还可以查看虚拟网络路由:
docker exec easytier-nas easytier-cli route通过节点连接路径、隧道协议和路由下一跳等信息,判断双方是否建立直接连接。
需要注意,cost 不一定显示 p2p 字符串。EasyTier 官方示例中 cost 是数值,route 中的 DIRECT 等信息可以辅助判断连接路径。
若双方已成功建立 P2P 直连,业务数据可以不经过公网 VPS。
如果打洞失败,默认情况下 EasyTier 可能通过共享节点中继,实际速度会受到 VPS 带宽、网络延迟等因素的影响。
九、可选:让 VPS 仅负责打洞
如果不希望公网 VPS 承担 NAS 文件传输流量,可以考虑 EasyTier 提供的以下参数:
--relay-network-whitelist --relay-all-peer-rpc其用途是限制普通业务流量转发,同时保留协助节点建立 P2P 的 RPC 流量转发能力。
但不建议一开始就开启。
应该先完成以下步骤:
确认 VPS 共享节点工作正常。
确认 NAS 和 Windows 能互相访问。
检查双方是否成功建立 P2P 直连。
再决定是否关闭 VPS 中继。
因为如果两端 NAT 环境无法支持直接打洞,而 VPS 又不能提供中继,双方就可能完全无法通信。
十、实际遇到的问题总结
十一、总结
本次方案最大的好处是,不必重新折腾两台小米路由器,也不需要修改原有网络布线。
通过在公网 VPS、NAS 和 Windows 上部署 EasyTier,就可以为原本相互独立的设备建立一层额外的虚拟网络。
本次已经验证的部分包括:
通过 DaoCloud 镜像源成功下载 EasyTier。
使用
docker tag解决镜像名称引用问题。VPS 上的 Docker Compose 成功启动。
EasyTier 成功建立 TCP/UDP 11010 监听器。
NAS 与 Windows 的实际互访、SMB 共享连接以及 P2P 打洞结果,仍需要进一步测试。
最后,有三个经验值得记住:
第一,公网共享节点运行正常,不代表 P2P 打洞已经成功。
第二,Docker 的 TUN 设备映射和普通文件挂载是两回事。
第三,在 Unraid 上部署服务,要特别注意配置文件是否真正持久化。
只要把这几个问题区分清楚,后续 EasyTier 的部署和排错就会清晰许多。