使用 Tailscale 让 NAS、iPhone、Mac mini 与 MacBook 实现安全异地组网

5112 字
26 分钟
使用 Tailscale 让 NAS、iPhone、Mac mini 与 MacBook 实现安全异地组网

概述#

很多人将 NAS 部署在家中,用来保存照片、视频和项目文件,并运行影音库、下载器、相册、密码管理器等本地服务。但离开家庭网络后,如何安全访问这些资源,往往会遇到几个问题:

  • 家庭宽带没有公网 IPv4。
  • 不想在路由器上开放 SMB、NAS 管理后台等端口。
  • Mac 和 iPhone 平时还需要运行 Surge 或 Loon。
  • iOS 通常无法让两个独立 VPN 隧道同时接管网络。
  • 希望访问体验与局域网基本一致,而不是每次都进行复杂配置。

Tailscale 可以将 NAS、Mac mini、MacBook 和 iPhone 加入同一个虚拟局域网,也就是 Tailnet。设备无论位于家庭宽带、公司网络、酒店 Wi-Fi 还是蜂窝网络中,都可以通过加密连接相互访问。

本文以 Unraid 7 为 NAS 示例。TrueNAS、Synology、QNAP 等其他 NAS 的总体思路相同,但客户端安装位置、子网路由和容器集成方式需要参考各自系统文档。

整个方案不需要将 NAS 的 SMB、管理后台或 Docker 服务直接映射到公网。Tailscale 构建在 WireGuard 之上,并增加身份认证、访问控制、NAT 穿透、DERP 中继和 MagicDNS 等能力。只有经过授权并满足 Tailnet 访问策略的设备才能通信。

安全目标

本文的目标是通过 Tailnet 私下访问 NAS,而不是将 NAS 服务公开到互联网。配置完成后,应删除不再需要的公网端口映射,并避免对 SMB、管理后台和私人 Docker 服务使用 Tailscale Funnel。

网络结构#

完成后的网络结构大致如下:

Internet
Tailscale 加密虚拟网络
┌────────────────────┼────────────────────┐
│ │ │
NAS 服务器 Mac mini MacBook
以 Unraid 为例 Tailscale 客户端 Tailscale / Surge
├── SMB 文件共享
├── NAS 管理后台
├── Docker 本地服务
└── 局域网其他设备(可选)
iPhone
Surge 内置 Tailscale

设备加入 Tailnet 后,会获得一个位于 100.64.0.0/10 范围内的 Tailscale IPv4 地址,例如:

100.101.102.103

开启 MagicDNS 后,还可以使用设备名称访问:

unraid
unraid.example-tailnet.ts.net

Tailscale 地址在设备保持注册期间通常稳定,但删除设备、重置节点或重新安装系统后可能变化。长期配置访问策略时,可以使用设备标签或及时更新地址。

开始前的准备#

需要准备以下设备和软件:

  • 一台家庭 NAS,本文使用 Unraid 7 举例。
  • 一台 Mac mini。
  • 一台 MacBook。
  • 一台 iPhone。
  • 一个 Tailscale 账户。
  • Surge Mac 6.7.0 或更高版本。
  • Surge iOS 5.20.0 或更高版本。

Unraid 7 已提供官方维护的 Tailscale 集成。访问 Unraid 宿主机、WebGUI 和 SMB 共享时,应安装 Tailscale (Plugin),而不是旧的 Tailscale Docker 模板。

创建 Tailnet#

首次在任意设备上登录 Tailscale 时,系统会自动创建一个 Tailnet。建议先进入 Tailscale 管理后台,完成基础设置。

开启 MagicDNS#

MagicDNS 可以让设备通过名称互相访问,不必记住每台设备的 100.x.x.x 地址。

推荐使用清晰的设备名称:

unraid
mac-mini
macbook
iphone

完整 MagicDNS 名称通常采用以下格式:

<设备名>.<tailnet-name>.ts.net

同一 Tailnet 内的原生 Tailscale 客户端通常可以使用短名称。Surge 内置 Tailscale 和跨 Tailnet 分享场景优先使用完整域名:

unraid.example-tailnet.ts.net

保护登录账户#

Tailscale 的安全边界依赖登录账户和设备授权。建议为用于登录 Tailscale 的 Apple、Google、Microsoft 或 GitHub 账户开启双重验证。

还应定期检查管理后台中的设备,删除已经出售、重装或不再使用的节点。

谨慎设置设备名称#

避免使用姓名、家庭地址或公司名称作为设备名。

如果为设备启用 Tailscale HTTPS 证书,机器名称可能出现在公开证书日志中,因此应使用自己愿意公开的名称。

在 Unraid 上安装 Tailscale#

安装官方插件#

打开 Unraid WebGUI,依次进入:

Apps
→ 搜索 Tailscale
→ 选择 Tailscale (Plugin)
→ Install

不要选择旧版 Docker 模板。

安装后进入:

Settings
→ Network Services
→ Tailscale

选择:

Reauthenticate
→ Connect

登录与其他设备相同的 Tailscale 账户。

检查设备状态#

进入 Tailscale 管理后台的设备页面,应该可以看到 Unraid 节点:

unraid
100.101.102.103
Connected

如果 Tailnet 开启了设备审批,还需要手动批准该节点。

然后从另一台已经加入 Tailnet 的设备测试访问:

http://100.101.102.103

或者:

https://unraid.example-tailnet.ts.net

实际协议和端口取决于 Unraid 的管理访问设置。

判断是否需要子网路由#

单纯访问以下内容时,通常不需要配置子网路由:

  • Unraid WebGUI。
  • Unraid 宿主机上的 SMB 共享。
  • 已映射到 Unraid 宿主机端口的 Docker 服务。

直接使用 Unraid 的 Tailscale IP 或 MagicDNS 名称即可。

只有以下场景需要子网路由:

  • Docker 容器使用独立的 br0 局域网 IP。
  • 需要访问家庭局域网中的打印机、摄像头或其他设备。
  • 希望继续使用设备原来的 192.168.x.x 地址。

假设家庭网络是:

192.168.1.0/24

可以进入:

Settings
→ Tailscale
→ Advertise Routes

根据需求广播:

192.168.1.50/32 只开放单台设备
192.168.1.0/24 开放整个家庭网段

保存后,还需要在 Tailscale 管理后台批准该路由。

最小开放范围

只需要访问一台容器或局域网设备时,优先广播 /32。没有访问整个家庭网络的需求时,不要直接开放整个 /24 网段。

Unraid 7 容器集成#

Unraid 7 可以让部分 Docker 容器直接加入 Tailnet,每个容器拥有独立身份、主机名和 Tailscale 地址。

这种方式适合:

  • 只共享某个容器,而不是整个 NAS。
  • 为不同容器配置独立 Grants。
  • 让容器独立使用 HTTPS、Serve 或其他 Tailscale 功能。

如果服务已经映射到 Unraid 宿主机端口,通常不需要让容器单独加入 Tailnet。

容器网络模式存在兼容性限制,不应在关键容器上直接试验。尤其不要把旧 Tailscale Docker 模板与 Unraid 7 的官方容器集成混为一谈。配置前应查看当前 Unraid 版本的发行说明,并先在非关键容器上测试。

在 Mac mini 上配置 Tailscale#

Mac mini 往往承担家庭常开服务器、远程开发机或下载机的角色,因此建议安装完整的 Tailscale 系统客户端。

完整客户端可以让其他 Tailnet 设备主动访问 Mac mini,例如:

  • SSH。
  • 屏幕共享。
  • Web 服务。
  • 本地 API。
  • 文件共享。
  • 远程开发工具。

Surge 内置 Tailscale 是应用层出站策略,不能接受其他 Tailnet 设备的主动入站连接,也不能把当前设备作为子网路由器或出口节点进行广播。

因此,作为服务器使用的 Mac mini 应优先安装 Tailscale 官方客户端。

同时使用 Surge#

推荐组合是:

Tailscale:保持连接
Surge:开启系统代理
Surge 增强模式:非必要不启用

Surge 的系统代理主要处理浏览器和遵循系统代理的应用;SMB、SSH 和其他访问 100.x.x.x 的连接继续由 macOS 路由到 Tailscale。

这种方式的优点是:

  • Tailscale 可以接受其他设备的入站连接。
  • Surge 继续处理互联网代理流量。
  • SMB 和 SSH 不需要经过代理节点。
  • 两者不必争抢相同的系统路由。

如果开启 Surge 增强模式后出现 Tailnet 无法访问、路由被覆盖或另一项 VPN 被关闭,应优先关闭增强模式,改用系统代理模式。

macOS 可以同时安装多种网络工具,但其他 VPN 的路由、防火墙以及 100.64.0.0/10 地址冲突仍可能造成问题。Surge 的高级接口绑定方案依赖实际 utun 接口,不适合作为所有设备通用的默认配置。

在 MacBook 上同时使用 Surge 和 Tailscale#

MacBook 通常主要作为访问端,可以选择两种模式。

模式一:原生 Tailscale 加 Surge 系统代理#

这是最容易理解,也最适合需要完整 Tailscale 功能的方案。

Tailscale App:保持连接
Surge:开启系统代理
Surge 增强模式:关闭

此时流量大致为:

网页和普通代理流量 → Surge
100.x.x.x 和 Tailnet 流量 → Tailscale
SMB、SSH 等非 HTTP 流量 → Tailscale

该模式适合以下需求:

  • MacBook 需要被其他 Tailscale 设备访问。
  • 需要使用 Taildrop。
  • 需要使用 Tailscale CLI。
  • 需要完整的系统级 MagicDNS 和路由。
  • 不要求 Surge 增强模式接管所有应用。

模式二:使用 Surge 内置 Tailscale#

Surge iOS 5.20.0 和 Surge Mac 6.7.0 开始提供原生 Tailscale 策略。该策略会在 Surge 内部加入 Tailnet,并将规则选中的流量发送到 Tailscale,不需要建立第二个系统 VPN 隧道。

这种模式适合:

  • Surge 必须开启增强模式。
  • 只需要从 MacBook 主动访问 NAS。
  • 不需要其他设备主动访问 MacBook。
  • 希望代理和异地组网由一个客户端统一管理。

Surge 内置策略可以作为客户端使用已批准的子网路由和出口节点,但不能提供入站服务、广播子网路由或把当前设备作为出口节点。

创建专用 Auth Key#

进入 Tailscale 管理后台创建 Auth Key,建议设置:

Pre-authorized:根据设备审批策略开启
Reusable:关闭
有效期:尽量短
每台设备:单独创建一个密钥

Surge 内置 Tailscale 不提供交互式网页登录,因此需要使用 Auth Key 完成设备注册。

WARNING

Auth Key 等同于设备注册凭据。不要把真实密钥发到群聊、截图、公开仓库或订阅配置中。撤销 Auth Key 不会自动删除已经注册的设备,泄露后还需要在设备页面移除可疑节点。

Surge 配置示例#

在 Surge 配置中添加:

[Proxy]
Home Tailnet = tailscale, section-name=home-tailnet
[Tailscale home-tailnet]
auth-key = tskey-auth-在这里填写密钥
hostname = surge-macbook

然后在规则区域添加:

[Rule]
DOMAIN-SUFFIX,example-tailnet.ts.net,Home Tailnet
IP-CIDR,100.64.0.0/10,Home Tailnet,no-resolve

需要将:

example-tailnet.ts.net

替换为管理后台显示的实际 Tailnet DNS 后缀。

100.64.0.0/10 规则匹配 Tailscale IPv4 地址,域名规则匹配完整 MagicDNS 名称。

如果需要使用 Tailscale IPv6 或已批准的家庭子网路由,还需要根据实际地址范围添加对应规则。只配置 100.64.0.0/10 不能覆盖所有 Tailscale 路由。

不要把所有互联网流量无条件指向 Home Tailnet,也不要让 Tailscale 控制服务器的连接再次匹配到相同策略,否则可能形成递归依赖。

在 iPhone 上同时使用代理和 Tailscale#

iPhone 上的核心问题是系统 VPN 隧道冲突。iOS 通常只允许一个活动 VPN,因此无法可靠地同时开启 Surge App 和 Tailscale App 两个独立隧道。

解决方式是让 Surge 自己加入 Tailnet。

使用 Surge iOS#

使用 Surge iOS 5.20.0 或更高版本,为 iPhone 创建独立 Auth Key,然后加入类似配置:

[Proxy]
Home Tailnet = tailscale, section-name=home-tailnet
[Tailscale home-tailnet]
auth-key = tskey-auth-在这里填写iPhone专用密钥
hostname = surge-iphone
[Rule]
DOMAIN-SUFFIX,example-tailnet.ts.net,Home Tailnet
IP-CIDR,100.64.0.0/10,Home Tailnet,no-resolve

此时只需要开启 Surge:

普通互联网流量 → Surge 原有代理规则
NAS 和 Tailnet → Surge 内置 Tailscale

Surge 内置策略支持规则选中的 TCP 和 UDP 出站流量,可以访问 Tailnet 节点、MagicDNS 名称以及经过批准的子网路由。

不需要再同时开启官方 Tailscale App。

Loon 当前状态#

Loon 已计划加入原生 Tailscale 支持,但截至本文发布时间,该功能尚未在正式版中发布。

Surge iOS:已支持内置 Tailscale
Loon:已计划支持 Tailscale,等待正式版发布

Loon 当前支持 WireGuard,但这不等同于已经原生支持 Tailscale。在正式功能发布前,Loon 仍无法替代 Surge 完成本文中的单隧道代理与 Tailnet 分流。

来源不明的修改版客户端、描述文件或包含 Auth Key 的第三方模块会扩大凭据泄露风险,应避免使用。

通过 Mac 访问 NAS SMB#

先在 Unraid 中创建单独的 SMB 用户,并为共享目录配置权限。

推荐设置:

共享模式:Private 或 Secure
访客访问:关闭
用户权限:按需设置只读或读写

不要为了方便将重要目录长期设置为 Public。

使用 Finder 连接#

在 Mac 上打开:

访达
→ 前往
→ 连接服务器

也可以直接按:

Command + K

输入 Tailscale IP 和共享名称:

smb://100.101.102.103/Media

或者使用完整 MagicDNS 地址:

smb://unraid.example-tailnet.ts.net/Media

macOS 官方支持以下格式:

smb://DNS名称/共享名称
smb://IP地址/共享名称

如果不填写共享目录:

smb://unraid.example-tailnet.ts.net

登录后可以再选择需要挂载的共享。

连接成功后,可以把共享目录拖到 Finder 边栏。需要登录时自动挂载,可以将已经挂载的 SMB 宗卷加入:

系统设置
→ 通用
→ 登录项

跨地区网络延迟较高时,SMB 打开大量小文件会明显慢于本地局域网;大文件连续传输通常更加稳定。

通过 iPhone 访问 NAS SMB#

iPhone 自带的“文件”App 可以连接 SMB 服务器,不需要额外安装文件管理器。

依次打开:

文件
→ 浏览
→ 右上角“···”
→ 连接服务器

输入 NAS 的 Tailscale IP、完整 MagicDNS 名称或网络地址,例如:

100.101.102.103
unraid.example-tailnet.ts.net

部分系统版本也可以直接填写:

smb://unraid.example-tailnet.ts.net

选择:

注册用户

然后输入 Unraid SMB 用户名和密码。

连接成功后,NAS 会出现在“文件”App 的“共享”区域,可以浏览、上传、移动和复制文件。

如果 iPhone 使用 Surge 内置 Tailscale,应在 Surge 最近请求中确认连接命中:

Home Tailnet

而不是普通代理节点。

访问 NAS 上的 Docker 服务#

如果 Docker 服务已经映射到 Unraid 宿主机端口,例如:

Plex:32400
qBittorrent:8080
Immich:2283
Home Assistant:8123

可以直接访问:

http://100.101.102.103:8080
http://unraid.example-tailnet.ts.net:8080

其他服务同理。

容器使用独立局域网 IP#

假设容器地址是:

192.168.1.50

可以选择两种方法。

配置子网路由#

让 Unraid 广播:

192.168.1.50/32

需要访问整个家庭网络时才广播:

192.168.1.0/24

保存后在 Tailscale 管理后台批准路由。

使用 Unraid 7 容器集成#

让容器直接加入 Tailnet,获得独立的 Tailscale 身份和地址。这样可以只授权某个容器,而不是允许客户端访问整个 Unraid 或家庭局域网。

这种方式权限更清晰,但存在容器网络模式和版本兼容性限制,应先在非关键容器上测试。

安全配置建议#

Tailscale 能减少公网暴露,但安全性仍取决于账户、设备、访问策略和应用权限。

删除公网端口映射#

使用 Tailscale 后,通常不应继续把以下端口映射到公网:

445 SMB
22 SSH
3389 RDP
80 HTTP
443 HTTPS
NAS 管理后台端口
Docker 管理端口

Tailscale 本身不要求将这些业务端口开放到公网。

区分 Serve 与 Funnel#

Tailscale Serve 只向 Tailnet 内经过授权的设备和用户提供服务;Funnel 会将服务发布到整个互联网。

功能访问范围适合场景
ServeTailnet 内部私有 Web 服务和管理页面
Funnel公网明确需要公开的 Web 服务

Funnel 不适合 SMB,也不应默认用于 NAS WebGUI 和私人 Docker 服务。

可以使用:

Tailscale 设备地址
MagicDNS
Tailscale Serve

除非明确知道自己正在公开什么,否则不要使用:

Tailscale Funnel
公网端口映射
公开反向代理

每台设备使用独立 Auth Key#

不要让 iPhone、MacBook 和其他设备共用同一个可重复使用密钥。

推荐:

surge-iphone:独立一次性密钥
surge-macbook:独立一次性密钥
自动化容器:独立密钥、标签或 OAuth

Auth Key 优先使用短有效期、一次性、预授权并限制权限的配置。不要把密钥留在公开配置、Shell 历史或截图中。

定期清理设备#

定期检查 Tailscale 管理后台,删除:

  • 已出售的手机。
  • 已重装的旧系统。
  • 不再使用的临时节点。
  • 名称相似但无法确认来源的设备。
  • 已失效的 Surge 临时节点。

保留 SMB 独立认证#

即使 SMB 只能通过 Tailnet 访问,也应该:

  • 关闭访客访问。
  • 使用独立 Unraid 用户。
  • 设置强密码。
  • 不让普通用户拥有不必要的写入权限。
  • 将备份和重要资料设置为只读或分开管理。

Tailscale 负责网络层身份和加密,但不会替代 SMB 自身的用户名、密码和文件权限。

使用 Grants 限制端口#

新建 Tailnet 的默认策略可能允许成员设备广泛互访。Tailscale 当前推荐使用 Grants 实施最小权限控制。

例如,将 Unraid 定义为固定主机后,只允许成员访问 SMB、HTTP 和 HTTPS:

{
"hosts": {
"unraid": "100.101.102.103"
},
"grants": [
{
"src": ["autogroup:member"],
"dst": ["unraid"],
"ip": [
"tcp:445",
"tcp:80",
"tcp:443"
]
}
]
}

有 Docker 服务时,再添加实际需要的端口:

"tcp:8080",
"tcp:8123",
"tcp:32400"

Grants 中:

  • src 定义访问来源。
  • dst 定义目标设备、标签或地址。
  • ip 限制协议和端口。

修改访问策略前应保存原配置并逐步测试。多条 Grants 的权限会合并,更具体的规则不会自动覆盖之前过宽的授权。只保留示例规则也可能导致其他设备间连接被拒绝,需要根据实际用途补充。

连接测试与故障排查#

测试 Unraid WebGUI#

使用浏览器打开:

http://100.101.102.103

或者:

https://unraid.example-tailnet.ts.net

测试 SMB 端口#

在使用原生 Tailscale 客户端的 Mac 上运行:

Terminal window
nc -vz 100.101.102.103 445

成功时一般会显示:

succeeded

测试 Tailscale 路径#

使用原生 Tailscale 客户端时:

Terminal window
tailscale ping unraid

如果显示:

direct

说明设备之间建立了点对点直连。

如果显示 DERP 或 relay,连接仍然经过加密,只是使用 Tailscale 中继,速度和延迟可能不如直连。

Surge 内置 Tailscale 可以在策略状态中查看当前节点、地址以及连接是 direct 还是 relay。DERP 是正常的备用连接状态,并不代表连接失败。

Surge 中看不到请求#

检查以下规则是否位于其他可能提前匹配的规则之前:

DOMAIN-SUFFIX,example-tailnet.ts.net,Home Tailnet
IP-CIDR,100.64.0.0/10,Home Tailnet,no-resolve

同时确认使用的是完整 MagicDNS 地址:

unraid.example-tailnet.ts.net

如果访问的是家庭子网路由或 Tailscale IPv6 地址,还需要增加实际地址范围的规则。

Web 服务可用但 SMB 不通#

依次检查:

  • Unraid SMB 服务是否开启。
  • 共享目录是否允许当前用户访问。
  • TCP 445 是否被 Grants 或防火墙拦截。
  • SMB 地址和共享名称是否填写正确。
  • Surge 请求是否命中 Home Tailnet
  • 是否错误地将 SMB 流量发送到普通代理节点。
  • Unraid 服务是否只监听某个局域网接口。

Docker 服务无法访问#

如果服务使用 Unraid 宿主机端口,应访问:

Unraid 的 Tailscale IP:端口

如果容器拥有独立的 192.168.x.x 地址,则需要:

  • 配置并批准子网路由。
  • 或让容器单独加入 Tailnet。

总结#

通过 Tailscale,可以把分布在不同网络中的家庭 NAS、Mac mini、MacBook 和 iPhone 组成一个安全的虚拟局域网。

与公网端口映射相比,这套方案具有以下优势:

  • 不依赖家庭宽带公网 IP。
  • 不直接公开 NAS 管理后台。
  • 不将 SMB 445 端口暴露给互联网。
  • 设备之间基于 WireGuard 加密通信。
  • Mac 可以继续使用 Surge。
  • iPhone 可以在保持代理的同时访问 NAS。
  • Finder 和“文件”App 可以直接使用 SMB。
  • Docker 服务可以按设备、端口或容器精细授权。

真正需要注意的不是“安装 Tailscale 后会不会自动暴露公网”,而是避免主动开启 Funnel、保留公网端口映射、泄露 Auth Key,以及给所有设备过大的访问权限。

坚持不做公网端口映射、不对私人服务使用 Funnel、开启账户双重验证,并为 SMB 和 Tailnet 设置合理权限,就可以在安全性和使用便利之间取得较好的平衡。

参考#

使用 Tailscale 让 NAS、iPhone、Mac mini 与 MacBook 实现安全异地组网
https://lunary.cc/posts/使用-tailscale-让-nasiphonemac-mini-与-macbook-实现安全异地组网/
作者
鹤望兰
发布于
2026-07-28
许可协议
CC BY-NC-SA 4.0