EasyTier 自建公网节点实战:双路由独立局域网如何访问 NAS

Docker + Unraid + Windows|P2P 内网穿透部署与踩坑记录

记录日期:2026 年 10 月 11 日

本文记录一次使用 EasyTier 解决双路由网络中 NAS 跨网段访问问题的实践,包括公网 VPS 部署、Docker 镜像下载失败、NAS 容器配置以及后续 P2P 连接测试。

一、背景:为什么需要内网穿透?

家里的网络拓扑如下:

光猫(路由模式)
│
├── 小米路由器 1
│   └── 交换机
│       └── NAS
│
└── 小米路由器 2
    └── Windows 电脑

两台小米路由器分别连接光猫,且都工作在路由模式,拥有各自独立的局域网。

现在的需求是:

保持两个独立局域网不变,让路由器 2 下的电脑能够访问路由器 1 下的 NAS。

传统方案包括:

  1. 把两个路由器调整为 AP 模式。

  2. 改变接线方式,让路由器 2 级联到路由器 1。

  3. 配置静态路由及防火墙规则。

  4. 使用 VPN 或 P2P 虚拟组网工具。

前两个方案需要改变当前网络架构,而静态路由方案又受小米路由器原厂固件的限制。

最终选择使用 EasyTier。

二、EasyTier 的工作原理

EasyTier 是一个开源的虚拟组网工具,支持 NAT 穿透、P2P 连接以及中继转发。

项目地址:https://github.com/EasyTier/EasyTier

本次计划使用一台具有公网 IP 的 VPS 作为共享节点。

                 公网 VPS
               EasyTier 节点
               /          \
        节点发现            节点发现
           /                  \
    NAS (EasyTier)      Windows (EasyTier)
           \                  /
            \──── P2P ──────/

大致流程如下:

  1. NAS 与 Windows 分别连接公网 EasyTier 节点。

  2. 公网节点帮助双方发现彼此。

  3. 双方尝试 NAT 穿透。

  4. 如果打洞成功,NAS 与 Windows 直接传输数据。

  5. 如果打洞失败,默认可以通过共享节点中继流量。

这里需要注意:公网服务器并不一定只承担注册中心的作用,必要时也可能承担流量中继。

如果希望公网服务器完全不转发文件数据,需要等直连验证成功以后,再额外限制中继功能。

三、部署环境与参数规划

本次环境如下:

设备

系统或运行方式

作用

公网 VPS

Linux + Docker

EasyTier 共享节点

NAS

Unraid + Docker

NAS 客户端

电脑

Windows

EasyTier 客户端

路由器

两台小米路由器

保持原网络结构

使用的示例配置:

参数

值

VPS 公网 IP

203.0.113.10

端口

11010

网络名称

home-et-2026

网络密钥

自行生成

NAS 虚拟 IP

10.144.144.1

Windows 虚拟 IP

10.144.144.2

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 .env

4.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

参数说明:

参数

作用

network_mode: host

直接使用 VPS 的网络

--network-name

虚拟网络名称

--network-secret

组网身份验证密钥

--private-mode true

限制其他网络的节点使用共享节点

-l tcp://...

设置 TCP 监听地址

-l udp://...

设置 UDP 监听地址

由于 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 防火墙

需要在云服务器的安全组中放行:

协议

端口

TCP

11010

UDP

11010

如果 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 11010

Windows 端也可以检查 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/tun

5.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 .env

5.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

安装客户端后,创建网络并配置:

项目

值

网络名称

home-et-2026

网络密钥

与 VPS、NAS 一致

虚拟 IP

10.144.144.2

Peer 地址

tcp://203.0.113.10:11010

不同版本的 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 流量转发能力。

但不建议一开始就开启。

应该先完成以下步骤:

  1. 确认 VPS 共享节点工作正常。

  2. 确认 NAS 和 Windows 能互相访问。

  3. 检查双方是否成功建立 P2P 直连。

  4. 再决定是否关闭 VPS 中继。

因为如果两端 NAT 环境无法支持直接打洞,而 VPS 又不能提供中继,双方就可能完全无法通信。

十、实际遇到的问题总结

问题

原因

解决方式

VPS 无法拉取镜像

Docker Hub 访问失败

使用 DaoCloud 镜像

换镜像后还想保留原镜像名

Compose 引用原名称

使用 docker tag

容器正常,但 PORTS 为空

Host 网络模式

用 ss 检查

修改 TUN 路径后可能报错

TUN 不是普通文件

映射真实 /dev/net/tun

machine-id 映射为目录

源文件未提前创建

先生成或复制文件

Unraid 重启后文件可能丢失

使用了非持久化目录

放入持久化 appdata

NAS 和 Windows 不通

节点未成功入网或防火墙限制

先检查 peer,再检查 SMB

能访问但传输速度慢

可能经过中继

检查 P2P 路径

十一、总结

本次方案最大的好处是,不必重新折腾两台小米路由器,也不需要修改原有网络布线。

通过在公网 VPS、NAS 和 Windows 上部署 EasyTier,就可以为原本相互独立的设备建立一层额外的虚拟网络。

本次已经验证的部分包括:

  • 通过 DaoCloud 镜像源成功下载 EasyTier。

  • 使用 docker tag 解决镜像名称引用问题。

  • VPS 上的 Docker Compose 成功启动。

  • EasyTier 成功建立 TCP/UDP 11010 监听器。

NAS 与 Windows 的实际互访、SMB 共享连接以及 P2P 打洞结果,仍需要进一步测试。

最后,有三个经验值得记住:

第一,公网共享节点运行正常,不代表 P2P 打洞已经成功。

第二,Docker 的 TUN 设备映射和普通文件挂载是两回事。

第三,在 Unraid 上部署服务,要特别注意配置文件是否真正持久化。

只要把这几个问题区分清楚,后续 EasyTier 的部署和排错就会清晰许多。

参考资料