
先说结论飞牛NAS上把EasyTier跑在Docker里是解决“人在外面想访问家里NAS和其他设备”这类需求最省事的方案之一。EasyTier是一个点对点虚拟组网工具装好后家里所有设备就像处在同一个局域网里飞牛NAS的SMB、WebUI、SSH都能用虚拟IP直接访问不用再折腾公网IP、DDNS和端口转发。这篇文章是我自己从零到一部署的完整记录包括为什么选host网络模式、有没有公网的区别、Docker启动命令怎么写以及后面遇到的各种坑。1. 飞牛NAS装Docker先搞清楚网络模式再动手1.1 为什么我强烈建议用host网络模式飞牛NAS的Docker管理界面挺友好但很多人第一次部署EasyTier时会卡在“容器创建了但怎么也连不上”这个环节。根子上的问题往往不是EasyTier本身而是容器网络模式选错了。飞牛NAS上Docker的默认网络模式一般是bridge。bridge模式下容器会拿到一个内部的虚拟IP比如172.17.0.x然后通过端口映射把服务暴露给宿主机。这种模式对Web服务、数据库这类的应用没问题但对EasyTier这种需要和公网、和其他设备直接建立UDP/TCP连接的组网工具来说NAT转发会增加不少变数。端口映射偶尔没生效UDP打洞成功率也会被拖低。所以我的建议是创建EasyTier容器时直接把网络模式选成host。所谓host网络模式就是容器直接共享飞牛NAS的物理网卡不再有NAT这层包裹。EasyTier监听哪些端口宿主机就监听哪些端口虚拟IP和真实局域网IP之间的关系也更直观。提示只有在飞牛NAS的Docker基于Linux虚拟化运行时才建议用host模式。如果你看到的是“Docker Desktop”这类Windows/Mac上的Docker情况不一样不要照搬这篇文章的网络配置思路。1.2 部署EasyTier前的三个前置检查第一个检查项是给飞牛NAS固定IP。很多人不在意这个细节导致组网跑了一阵子之后突然连不上。原因就是飞牛NAS重启后从路由器DHCP拿了一个新IP之前EasyTier配置里写死的“节点地址”全失效了。我用的办法很简单去路由器后台把飞牛NAS的MAC地址和IP做静态绑定或者直接在飞牛的网络设置里改成手动IP。这一步做不好后面组网再顺也没有意义。第二个检查项是确认Docker服务已经正常启动。飞牛NAS的应用中心里能看到Docker应用但如果在SSH终端里执行docker ps都报错那后面全都不用谈。这个坑我在第4节会专门展开。第三个检查项是规划好虚拟网段。EasyTier会给每台设备分配一个虚拟IP网段不能和你家现有局域网网段冲突。比如我家路由器用的是192.168.50.0/24那我给EasyTier分配的虚拟网段就用10.59.0.0/24两边井水不犯河水。这种规划在设备多起来之后非常有用不然万一两边重了网段路由会乱成一锅粥。2. EasyTier到底是怎么“无公网组网”的2.1 先回答“组网必须有公网吗”不用但要分情况“easytier 组网必须有公网吗”是我搜过最多的疑问也是网上说得最含糊的一点。直接给结论没有公网也能组网但有没有公网决定了你是“直连”还是“中继”。EasyTier的工作原理通俗讲分两步打洞和中继。所谓打洞就是两台设备通过UDP协议在各自路由器上建立一个临时的NAT映射然后互相找到对方建立一条点对点通道。这一步如果成功流量就是直连的速度快、延迟低基本能跑满你家宽带的带宽。打洞不成功时流量就会走一台中间节点服务器转发效果相当于所有数据都绕了一道驿站延迟明显更高。我用一张表总结了几种常见网络环境下的表现网络环境表现两端都有公网IPv4打洞成功率最高基本都是直连一端家宽一端手机4G/5G多数情况能打洞偶尔走中继两端都在严格NAT后面大概率走中继稳定但延迟高两端都在同一局域网内直接通过虚拟IP互访不依赖公网所以“必须有公网吗”这个问题准确回答是必须有一个“能互相找到对方”的机制而这个机制既可以由公网IP直连完成也可以由一台有公网IP的中继节点完成。2.2 公网IP的价值以及什么时候可以不要既然可以不依赖公网那为什么大家还是很在意公网IP因为打洞成功率和首连速度差很多。家里宽带有公网IPv4的话EasyTier几乎一启动就建立好通道体验和真的在一个局域网里没区别。要是两台设备都躲在运营商大内网后面打洞经常失败流量只能走公共中继节点连接速度会明显下降大文件传输也不太稳定。我自己的情况就没有公网IPv4飞牛NAS放在老家人在外地时通过EasyTier访问。实测下来短时间内的小流量操作完全没问题但真要往飞牛NAS上拖一个几个GB的电影中继转发就有点吃力了。如果对传输速度有硬性要求还是优先想办法拿一个公网IP或者自己租一台有公网IP的小云主机当中继节点。“什么时候可以不要公网”如果你只是偶尔在外面看一眼NAS里的文件、访问一下路由器后台、连一下家里的电脑那么纯中继模式也能接受。这种情况下部署EasyTier的最大价值就是不用再为每个服务单独做端口映射也不用把飞牛NAS的管理界面暴露到公网安全性高了很多。3. Docker部署EasyTier的完整过程和配置参数3.1 命令直接跑一个最小可用的启动参数先说明一点EasyTier的版本迭代速度不慢参数名在不同版本里可能有变化。我下面的命令基于我用过的比较稳定的1.x/2.x版本按网上的教程部署前最好先去官方文档确认一下最新参数命名。我在飞牛NAS的SSH终端里直接只用一条docker run命令把EasyTier跑起来docker run -d \ --name easytier \ --network host \ --restart unless-stopped \ -e TZAsia/Shanghai \ -v /vol1/1000/docker/easytier/data:/app/data \ easytier/easytier:latest \ easytier-core \ --network-name naslan \ --network-secret 一串足够长的随机字符串 \ --ipv4 10.59.0.2/24 \ -p tcp://public.easytier.top:11010这里面几个参数分开解释一下--network host使用宿主机网络理由在第1节已经说过。--network-name虚拟网络的名称所有要组网的设备必须填同一个名字。--network-secret相当于加入网络的密钥所有设备也必须保持一致。--ipv4给这台飞牛NAS分配的虚拟IP我用的是10.59.0.2。-p tcp://public.easytier.top:11010指定一个对端节点用来建立连接和互相发现。这里填了官方公共节点生产环境下建议换自建节点。如果你的Docker镜像入口已经默认执行easytier-core那命令里的easytier-core这一段可以去掉。用之前不确定的话可以先进容器看一眼帮助信息docker run --rm easytier/easytier:latest easytier-core --help3.2 用compose管理长期运行虽然一条docker run能跑通但如果设备不止一台或者你像我一样需要反复改配置还是建议一步到位用docker compose。在飞牛NAS的共享文件夹里新建一个目录比如/vol1/1000/docker/easytier放一个docker-compose.ymlservices: easytier: image: easytier/easytier:latest container_name: easytier network_mode: host restart: unless-stopped environment: - TZAsia/Shanghai volumes: - ./data:/app/data command: easytier-core --network-name naslan --network-secret 改成你自己的随机字符串 --ipv4 10.59.0.2/24 -p tcp://public.easytier.top:11010 -p udp://public.easytier.top:11010这里多加了-p udp://public.easytier.top:11010让EasyTier同时尝试TCP和UDP两条通道。TCP更稳UDP更容易打洞成功两个通道都挂着不是坏处。在docker-compose.yml所在目录执行docker compose up -d后面想改配置直接改这个文件再执行docker compose up -d --force-recreate就能把容器按新配置重建比手动删容器再创建省心很多。3.3 虚拟网段规划别和家里的网段打架规划虚拟IP的时候有个我一开始忽略的坑虚拟网段如果和某个局域网段重复EasyTier处理路由时会变得很纠结。比如我家实际局域网是192.168.50.0/24那我给飞牛NAS分配10.59.0.2给笔记本分配10.59.0.3给手机分配10.59.0.4这样记忆成本很低路由也清晰。还要注意一点飞牛NAS的EasyTier容器如果设置了host网络模式它自己宿主机上原本的局域网IP是192.168.50.x现在又多了一个10.59.0.2的虚拟IP。组网内的其他设备访问飞牛NAS时建议一律用10.59.0.2不要用192.168.50.x因为后者只能在同一个物理局域网里访问离开了就失效。密钥的生成也别偷懒直接复制粘贴一个简单的密码后面很容易被扫描到。我习惯用系统随机生成openssl rand -base64 32然后把生成出来的字符串填到--network-secret里。4. 部署过程中我踩过的三个坑4.1 Docker权限报错Permission denied与daemon连接失败飞牛NAS上Docker装好后默认操作的还是图形界面。等你想用SSH去执行docker ps会遇到两种很常见的错误。第一种是permission denied while trying to connect to the Docker daemon socket这个原因基本就是当前SSH用户不在docker用户组里。解决办法sudo usermod -aG docker $USER newgrp docker然后重新登录SSHdocker ps就可以了。第二种是Cannot connect to the Docker daemon这个不是权限问题是Docker服务本身没起来。先检查服务状态sudo systemctl status docker如果确实没启动执行sudo systemctl start docker sudo systemctl enable docker在飞牛NAS上也可以先回到应用中心把Docker应用停掉再重启通常能把daemon拉起来。4.2 docker网络不通为什么EasyTier起来了但别人连不上这个问题我当时排查了挺久。现象是飞牛NAS上的EasyTier容器已经能在docker ps里看到状态是running日志也一直在刷但笔记本端怎么都ping不通飞牛NAS的虚拟IP。后来发现原因是我在创建容器时虽然选了host网络模式却还同时填了端口映射。Docker对host模式下的-p参数基本上是不生效的但很多图形界面不会阻止你这么填结果就给人一种“端口已经映射了”的错觉。实际检查时用docker port easytier命令显示什么都没有这时我才意识到问题在哪。解决办法就是老老实实用host模式不要画蛇添足填端口映射。如果你已经用host模式且服务正常但其他设备还是不通下一步看飞牛NAS的防火墙。很多NAS系统默认会启用防火墙EasyTier监听11010端口但防火墙没放行UDP/TCP外部设备自然进不来。去飞牛的安全设置里放行相应端口或者抓包确认一下流量到底到没到NAS。跨网段访问时还需要确认Linux的内核路由转发有没有打开。用下面命令临时开启sudo sysctl -w net.ipv4.ip_forward1永久开启则写到/etc/sysctl.conf里。4.3 镜像下载慢和“虚拟化支持未检测到”的误解“Virtualization support not detected”这种报错我第一次在网上搜到的时候也吓了一跳以为飞牛NAS装不了Docker。后来发现这个提示几乎都来自Windows上的Docker Desktop和飞牛NAS没有关系。飞牛NAS的Docker跑在自己的Linux系统里不依赖Windows Hyper-V或者WSL2所以不要用那套思路来诊断飞牛。真正影响飞牛NAS跑EasyTier的是镜像拉取速度。国内直接拉easytier/easytier:latest偶尔很慢甚至超时。我的做法是在Docker配置里加一个registry mirror把自己常用的镜像源地址填进去。注意镜像源只是拉取镜像时用的不涉及任何组网行为EasyTier本身的流量不经过它。还有一个经验是不要在GUI里反复点“重新拉取镜像”飞牛会缓存失败结果。直接在SSH里执行docker pull easytier/easytier:latest更容易看到真实报错到底是什么网络问题一目了然。5. 跑通之后怎么把飞牛NAS的服务接进虚拟局域网5.1 把NAS的SMB、SSH、WebUI暴露给组网内的设备EasyTier本身不会自动“暴露”服务它提供的是网络连通性。飞牛NAS上原本跑着的SMB、SSH、Web管理界面其实都不需要额外配置因为它们是监听在宿主机端口上的服务而EasyTier的虚拟网络已经把飞牛NAS这台设备“拉”进了虚拟局域网。我平时在外面访问飞牛NAS照片用的方式是手机上连上EasyTier客户端然后打开文件管理器地址直接填smb://10.59.0.2。这不比你平时在家访问NAS麻烦多少。相册备份、文档同步都走这条路。访问飞牛NAS的管理后台也一样浏览器打开https://10.59.0.2:8000这类地址具体端口看你飞牛本身的设置。注意浏览器可能会因为IP变化提示证书不匹配这是因为飞牛的证书是给原来局域网IP或域名签发的不影响功能但介意的话可以给飞牛配一个内网域名。5.2 自建中继节点让多台设备连接更稳如果你的设备分部在多个“严格NAT”的网络后面公共中继节点虽然方便但毕竟不受你控制速度也没有保证。我更推荐拿一台有公网IP的小云主机自己搭一个中继节点。中继节点的部署其实非常简单就是找一台Linux服务器同样用Docker跑同一个EasyTier镜像但启动参数和普通节点不一样。中继节点不需要给自己分配虚拟IP只需要监听一个公网端口docker run -d \ --name easytier-relay \ --network host \ --restart unless-stopped \ easytier/easytier:latest \ easytier-core \ -p tcp://0.0.0.0:11010 \ -p udp://0.0.0.0:11010然后把家里飞牛NAS和其他设备上的-p参数从公共节点地址改成tcp://你的服务器IP:11010。这样所有设备在打洞不成功时都会优先走自己的中继节点延迟和稳定性都可控。提示中继节点不等于一定要带宽很大1核1G的小云主机就够跑。真正影响体验的是云主机的带宽如果你经常在外部往NAS传大文件中继带宽决定了你的实际传输上限。5.3 验证连通性ping、端口扫描和日志EasyTier跑起来之后不要急着以为万事大吉先做一轮验证。最简单的方法是在飞牛NAS的容器里ping笔记本的虚拟IPdocker exec -it easytier ping 10.59.0.3如果通了说明EasyTier虚拟网络核心没问题。接下来验证具体服务在笔记本上加一条静态路由或者直接从手机端测试SSH、SMB端口。端口是否监听用docker exec -it easytier sh -c ss -lntup | grep 11010日志排查也很关键。看EasyTier日志的命令是docker logs -f easytier日志里会明显看到它当前是通过“直连”还是“中继”维持的连接。如果一直显示在反复重连先检查两台设备的时钟是否同步EasyTier对时间偏差比较敏感NTP没同步会导致握手失败。6. 最后再讲几点我之前没搜到的经验6.1 给EasyTier加一个简单的看门狗EasyTier的容器设置了restart: unless-stopped之后飞牛NAS重启容器会自动起来大部分时间都很省心。但我遇到过一次坑EasyTier容器一直running虚拟网络却断了原因可能和底层网络接口状态有关。重启容器能恢复但人不在设备旁边就很被动。我的做法是在飞牛NAS的定时任务里加一个脚本每隔几分钟ping一下EasyTier的虚拟IPping不通就自动重启容器。脚本本身不复杂if ! ping -c 3 -W 2 10.59.0.3 /dev/null; then docker restart easytier fi有这种看门狗之后很多从半夜开始的网络问题都会在几分钟内自动恢复不需要手动干预。6.2 重启飞牛NAS之后不要让网络服务互相等待飞牛NAS如果关机再开机Docker容器会和系统网络一起启动EasyTier可能还没等到底层网络就绪就开始连接了。大部分情况下它会自动重连但偶尔会遇到容器“假死”。我在飞牛上把EasyTier容器设置成restart: unless-stopped后还是遇到过需要手动docker restart easytier才恢复的情况。保险起见可以把启动顺序和依赖关系写到compose文件里比如用depends_on配合健康检查或者干脆接受这种小概率事件靠看门狗兜底。6.3 别把所有业务都塞进虚拟局域网EasyTier解决了“远程访问内网”的问题但我不建议把它当成万能的远程访问方案。如果只是临时访问飞牛NAS上的一个Web服务也可以考虑用飞牛自带的公网访问功能如果对方设备不能安装客户端EasyTier也帮不上忙。我的经验是EasyTier最适合的场景是你自己的核心设备手机、笔记本、家里的台式机、老家的NAS。把这几台设备拉进一个虚拟网段飞牛NAS上的Dify、Ollama、GitLab这类服务就都能用安全的内部地址访问而不需要暴露到公网。这个做法让我在外面用手机或笔记本访问飞牛上的各种服务时心态很放松因为我知道它们没有开任何公网端口真正对外的只有EasyTier这一条受控通道。