先说结论:飞牛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 TZ=Asia/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.yml:
services: easytier: image: easytier/easytier:latest container_name: easytier network_mode: host restart: unless-stopped environment: - TZ=Asia/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然后重新登录SSH,docker 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_forward=1永久开启则写到/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笔记本的虚拟IP:
docker 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的虚拟IP,ping不通就自动重启容器。脚本本身不复杂:
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这一条受控通道。