绿联 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,后者需要正确配置并批准子网路由。
二、部署前的准备
开始前需要准备:
- 一台支持 Docker Compose 的绿联 NAS;
- 一个 Tailscale 账号;
- 在手机上安装 Tailscale 客户端;
- 确认家庭局域网网段,例如
192.168.10.0/24; - 在 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_AUTHKEY | Tailscale 设备授权密钥 |
TS_STATE_DIR | 保存 Tailscale 登录与运行状态,避免重启后丢失 |
TS_ROUTES | 向 Tailnet 声明需要转发的家庭局域网网段 |
/dev/net/tun | Tailscale 内核网络模式需要使用的 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 后台批准它。
操作步骤:
- 打开 Tailscale 管理后台;
- 进入 Machines;
- 点击运行 Tailscale 的 NAS;
- 找到 Subnets、Edit route settings 或 Review routes;
- 勾选并批准
192.168.10.0/24; - 确认 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 打不开”时,按照下面的顺序效率最高:
- 手机关闭 Wi-Fi,确认正在使用蜂窝网络;
- 打开 iPhone 的 Tailscale,并确认状态已连接;
- 访问 NAS 的
100.x.x.x:端口; - 如果能访问,再测试
192.168.x.x:端口; - 前者成功、后者失败,检查子网路由是否批准;
- 两者都失败,检查服务监听地址、端口和防火墙;
- 路由已批准仍失败,再检查 TUN、IP 转发、ACL 和网段冲突。
九、总结
这次问题最容易误判的地方,是把 节点在线 和 子网路由生效 当成了同一件事。
完整链路其实包含三个层次:
- Tailscale 容器成功连接 Tailnet;
- NAS 使用
TS_ROUTES声明家庭局域网网段; - 管理员在 Tailscale 后台批准这条子网路由。
只有三个步骤全部完成,外面的手机才能使用 192.168.10.2 这样的局域网地址访问家中服务。
如果 100.x.x.x 可以访问,而 192.168.x.x 不可以,先不要反复重装 Docker。优先打开 Tailscale Machines 页面,检查那条子网路由有没有真正批准。