绿联 NAS 使用 Docker 部署 Tailscale,并通过手机访问整个家庭局域网

我在绿联 NAS 的 Docker 中部署了 Tailscale,想在外面使用 iPhone 流量访问家里的 NAS 和 Docker 服务。

部署完成后,Tailscale 后台显示 NAS 已经 Connected。手机也登录了同一个 Tailscale 账号,能够访问 NAS 的 Tailscale 地址:

http://100.x.x.x:7890

但访问 NAS 原本的局域网地址却打不开:

http://192.168.10.2:7890

最后发现,问题不在 Docker,也不在手机,而是:NAS 虽然已经声明了子网路由,但还需要在 Tailscale 管理后台批准这条路由。

批准 192.168.10.0/24 后,手机使用蜂窝网络也能正常访问:

http://192.168.10.2:5236

下面记录完整的部署与排查过程。

一、最终实现的效果

完成配置后,外面的手机或电脑只要连接 Tailscale,就有两种访问方式。

方式一:访问 NAS 的 Tailscale 地址

每台加入 Tailnet 的设备都会得到一个 100.x.x.x 地址,例如:

http://100.x.x.x:7890

这种方式用于直接访问安装了 Tailscale 的 NAS。

方式二:访问家中的局域网地址

开启子网路由后,可以继续使用熟悉的局域网地址:

http://192.168.10.2:5236
http://192.168.10.2:7890
http://192.168.10.10:8080

这样不仅能访问 NAS,还可以访问同一家庭局域网里的其他设备。NAS 在这里相当于一台连接 Tailscale 与家庭局域网的“路由器”。

两种地址的区别

100.x.x.x 是设备在 Tailscale 网络中的地址;192.168.10.x 是设备在家庭局域网中的地址。前者只要求目标设备加入 Tailscale,后者需要正确配置并批准子网路由。

二、部署前的准备

开始前需要准备:

  1. 一台支持 Docker Compose 的绿联 NAS;
  2. 一个 Tailscale 账号;
  3. 在手机上安装 Tailscale 客户端;
  4. 确认家庭局域网网段,例如 192.168.10.0/24
  5. 在 Tailscale 后台生成 Auth Key。

Auth Key 可以在 Tailscale 管理后台的 Settings → Keys 中创建。

不要公开 Auth Key

tskey-auth-... 相当于设备加入 Tailnet 的凭证。不要把完整密钥发布到博客、截图或公开仓库中。如果密钥曾经泄露,应立即在后台撤销并重新生成。

三、Docker Compose 配置

下面是一份整理后的 Compose 配置:

services:
  tailscale:
    container_name: tailscale
    image: tailscale/tailscale:latest
    restart: unless-stopped
    network_mode: host
    privileged: true
 
    environment:
      - TS_AUTHKEY=tskey-auth-请替换成自己的密钥
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_ROUTES=192.168.10.0/24
 
    volumes:
      - ./lib:/var/lib/tailscale
 
    devices:
      - /dev/net/tun:/dev/net/tun

如果绿联 Docker 管理界面无法填写 devices,也可以根据系统支持情况使用设备映射功能。关键是确保容器内存在 /dev/net/tun

配置项说明

配置项作用
network_mode: host让容器使用 NAS 的主机网络
privileged: true授予容器创建网络接口和修改路由所需的权限
TS_AUTHKEYTailscale 设备授权密钥
TS_STATE_DIR保存 Tailscale 登录与运行状态,避免重启后丢失
TS_ROUTES向 Tailnet 声明需要转发的家庭局域网网段
/dev/net/tunTailscale 内核网络模式需要使用的 TUN 设备

环境变量名称容易写错

正确名称是 TS_AUTHKEY,不是 TS_AUTO_KEY。如果状态目录里已经保存过登录信息,即使变量写错,容器仍可能显示在线,因此 Connected 不能证明 Auth Key 配置一定正确。

如何确认自己的局域网网段

如果 NAS 地址是:

192.168.10.2

路由器地址是:

192.168.10.1

常见网段就是:

192.168.10.0/24

不要直接照抄示例。如果家中的设备地址是 192.168.1.x,通常应填写 192.168.1.0/24

四、启动容器并检查状态

启动容器后,可以在 Tailscale 管理后台的 Machines 页面看到 NAS。状态显示为:

Connected

也可以通过 SSH 登录 NAS,执行:

docker exec tailscale tailscale status
docker exec tailscale tailscale ip -4

第二条命令会显示 NAS 的 Tailscale IPv4 地址,通常是:

100.x.x.x

此时先让手机关闭 Wi-Fi、使用蜂窝网络,并连接 Tailscale,然后直接访问:

http://100.x.x.x:服务端口

如果能够打开,说明以下环节已经正常:

  • iPhone 已连接 Tailscale;
  • iPhone 和 NAS 在同一个 Tailnet;
  • NAS 上的 Tailscale 容器在线;
  • 目标服务及端口可以通过 Tailscale 访问。

五、最关键的一步:批准子网路由

只在 Compose 中填写:

TS_ROUTES=192.168.10.0/24

还不够。

这个配置只是让 NAS 向 Tailscale 声明:“我可以转发前往 192.168.10.0/24 的流量。”出于安全考虑,管理员还需要在 Tailscale 后台批准它。

操作步骤:

  1. 打开 Tailscale 管理后台
  2. 进入 Machines
  3. 点击运行 Tailscale 的 NAS;
  4. 找到 SubnetsEdit route settingsReview routes
  5. 勾选并批准 192.168.10.0/24
  6. 确认 iPhone 上的 Tailscale 仍处于已连接状态。

批准后,再使用手机流量访问:

http://192.168.10.2:5236

这时局域网地址便可以正常打开。

Connected 不等于子网路由已生效

Connected 只代表 NAS 这个 Tailscale 节点在线。Machines 页面出现 Subnets 标签,也可能只代表设备声明了路由。能否访问 192.168.10.x,还取决于该路由是否已被管理员批准。

六、我的问题是如何定位的

当时的现象是:

测试结果
NAS 在 Tailscale 后台显示 Connected成功
iPhone 使用同一账号连接 Tailscale成功
访问 http://100.x.x.x:7890成功
访问 http://192.168.10.2:7890失败

因为 100.x.x.x 能访问,可以排除账号、手机连接、Docker 容器和目标服务整体故障。剩下的差异只有一项:访问 192.168.10.2 需要经过子网路由。

检查后台后发现,192.168.10.0/24 尚未批准。启用这条路由后,局域网地址立即恢复访问。

所以遇到相同情况,可以先记住这条判断:

100.x.x.x 能访问,192.168.x.x 不能访问

优先检查 TS_ROUTES 和后台的子网路由授权

七、其他常见问题

1. Tailscale 地址也打不开

如果 http://100.x.x.x:端口 也打不开,问题通常不在子网路由。应检查目标服务有没有启动,以及它监听在哪个地址:

ss -lntp | grep ':7890'

如果服务只监听:

127.0.0.1:7890

其他设备无法访问。通常需要让应用监听:

0.0.0.0:7890

同时检查 NAS 防火墙是否拦截了相应端口。

2. 后台没有出现待批准的子网路由

检查容器实际配置:

docker exec tailscale tailscale debug prefs

确认输出中包含需要发布的网段。还可以检查 Compose 中是否正确填写:

TS_ROUTES=192.168.10.0/24

修改环境变量后,需要重新创建容器,单纯重启旧容器不一定会应用新的 Compose 配置。

3. 容器中没有 TUN 设备

执行:

docker exec tailscale ls -l /dev/net/tun

如果设备不存在,检查绿联 NAS 是否已经启用 TUN,以及 Compose 中的 devices 映射是否正确。

4. 子网路由已批准,局域网地址仍然不通

检查 NAS 主机是否启用了 IPv4 转发:

sysctl net.ipv4.ip_forward

正常结果应为:

net.ipv4.ip_forward = 1

还需要检查:

  • NAS 防火墙是否允许转发流量;
  • TS_ROUTES 是否与实际家庭网段一致;
  • iPhone 当前所在网络是否恰好也使用相同网段;
  • 目标设备是否在线,端口是否正确;
  • Tailscale ACL 或 Grants 是否限制了访问。

如果手机当前网络也使用 192.168.10.0/24,可能出现网段冲突。此时可改用 NAS 的 100.x.x.x 地址,或者调整其中一侧的局域网网段。

八、一套最快的排查顺序

遇到“Tailscale 已连接,但 NAS 打不开”时,按照下面的顺序效率最高:

  1. 手机关闭 Wi-Fi,确认正在使用蜂窝网络;
  2. 打开 iPhone 的 Tailscale,并确认状态已连接;
  3. 访问 NAS 的 100.x.x.x:端口
  4. 如果能访问,再测试 192.168.x.x:端口
  5. 前者成功、后者失败,检查子网路由是否批准;
  6. 两者都失败,检查服务监听地址、端口和防火墙;
  7. 路由已批准仍失败,再检查 TUN、IP 转发、ACL 和网段冲突。

九、总结

这次问题最容易误判的地方,是把 节点在线子网路由生效 当成了同一件事。

完整链路其实包含三个层次:

  1. Tailscale 容器成功连接 Tailnet;
  2. NAS 使用 TS_ROUTES 声明家庭局域网网段;
  3. 管理员在 Tailscale 后台批准这条子网路由。

只有三个步骤全部完成,外面的手机才能使用 192.168.10.2 这样的局域网地址访问家中服务。

如果 100.x.x.x 可以访问,而 192.168.x.x 不可以,先不要反复重装 Docker。优先打开 Tailscale Machines 页面,检查那条子网路由有没有真正批准。

参考资料