很多人会遇到这个组合需求:

- Mac Mini 放在家里,作为长期在线的文件服务器;

- MacBook Air 或 iPhone 在外面时,也要随时访问 Mini 上的文件;

- iPhone 又必须一直开着 Shadowrocket,不能为了 Tailscale 反复切换 VPN。

难点在于:iOS 通常只能同时启用一个系统级 VPN 隧道。直接安装并打开 Tailscale App,会和 Shadowrocket 争用这个通道。

我最终采用的方案是:Mac Mini 正常运行 Tailscale;iPhone 不单独启动 Tailscale App,而是使用 Shadowrocket 自带的 Tailscale 模块,再通过两条规则把访问 Mac Mini 的流量交给 Tailscale。这样,日常代理和远程文件访问可以同时工作。

下面把完整过程写清楚。

一、最终能实现什么

设置完成后:

- iPhone 的 Shadowrocket 可以一直保持连接;

- iPhone 不需要和 Mac Mini 处在同一个 Wi‑Fi;

- 在“文件”App 中输入 Mac Mini 的 Tailscale MagicDNS 地址,即可访问 SMB 共享;

- MacBook Air 同样可以通过 Tailscale 访问 Mac Mini;

- 不需要把 SMB 的 445 端口暴露到公网,也不依赖路由器端口转发。

二、为什么 Tailscale App 会和 Shadowrocket 冲突

Shadowrocket 和 Tailscale App 都希望创建 iOS 的 VPN 隧道。系统在同一时间通常只允许一个这类隧道工作,因此打开一个时,另一个可能会断开。

解决思路不是让两个 App 强行同时建立 VPN,而是让 Shadowrocket 继续作为唯一的 VPN App,并启用它内置的 Tailscale 功能。

这里用到的是 Shadowrocket 2.2.90 的内置 Tailscale 模块。不同版本的菜单名称可能略有变化,如果你的界面里找不到 Tailscale,请先检查版本。

三、先在 Mac Mini 上准备文件共享

在 Mac Mini 上打开:

“系统设置” → “通用” → “共享” → 开启“文件共享”。

进入文件共享的详细设置:

\1. 添加准备远程访问的文件夹;

\2. 给自己的 Mac 用户设置“读与写”权限;

\3. 点“选项”,确认 SMB 文件共享已开启;

\4. 勾选允许通过 SMB 登录的用户。

建议专门创建一个用于远程文件访问的账号,设置独立强密码,不要使用空密码。

接着在 Mac Mini 上安装并登录 Tailscale,确认设备在 Tailscale 管理后台显示为在线。

记下两个信息:

- Mac Mini 的 Tailscale IP,格式通常是 100.x.x.x

- Mac Mini 的 MagicDNS 名称,格式类似 <设备名>.<tailnet>.ts.net

后面优先使用 MagicDNS 名称连接。

四、在 Shadowrocket 里启用 Tailscale

先到 Tailscale 管理后台生成一个 Auth Key:

“Settings” → “Keys” → “Generate auth key”。

如果这台 iPhone 是长期自用设备,可按需要选择可重复使用或临时密钥;密钥只应在首次认证时使用,不能发到群聊、截图或公开文章里。若密钥曾经泄露,应立即在后台撤销并重新生成。

然后在 Shadowrocket 中打开:

“设置” → “Tailscale”。

填入 Auth Key,完成认证并开启 Tailscale。成功后,这个页面的“状态”应显示“已连接”,设备列表中也能看到 Mac Mini。

为了优先验证功能,初次排查时可以暂时开启“始终使用 DERP”。它会强制 Tailscale 流量通过中继,通常更容易绕开复杂网络环境,但速度和延迟可能不如设备间直连。稳定后可关闭它,再比较直连效果。

五、添加两条专用分流规则

在 Shadowrocket 的当前配置里添加:

IP-CIDR,<Mac Mini 的 Tailscale IP>/32,TAILSCALE,no-resolve

DOMAIN-SUFFIX,

ts.net

,TAILSCALE

例如第一条只应该指向你自己的 Mac Mini,不要照抄别人的真实 IP。

这两条规则分别负责:

- 将发往 Mac Mini Tailscale IP 的流量交给 Tailscale;

- 将所有 *.ts.net MagicDNS 域名交给 Tailscale。

规则应放在可能提前匹配的宽泛规则之前,尤其要在最终的 FINAL 或兜底规则之前。

六、移除一个常见的冲突项

进入 Shadowrocket:

“设置” → “代理” → “跳过代理”。

检查列表中是否有:

100.64.0.0/10

如果有,把它删除。

原因是 Tailscale 的设备地址通常位于 100.64.0.0/10 这一段。如果把整个网段设为“跳过代理”,流量可能在到达你刚才添加的 Tailscale 规则之前就被系统直连处理,最终导致访问失败。

删除后重新连接 Shadowrocket,再确认 Tailscale 状态仍为“已连接”。

七、在 iPhone“文件”App 中连接 Mac Mini

打开 iPhone 自带的“文件”App:

\1. 进入“浏览”;

\2. 点右上角“…”;

\3. 选择“连接服务器”;

\4. 输入:

smb://<设备名>..ts.net

\5. 选择“注册用户”;

\6. 输入 Mac Mini 上允许 SMB 登录的用户名和密码。

连接成功后,“文件”App 会列出 Mac Mini 上开放的共享目录。

八、两个容易误判的问题

\1. 用 Tailscale IP 连接时提示“Socket 未连接”

如果 smb://100.x.x.x 失败,不代表 Tailscale 一定没通。可以改用:

smb://<设备名>..ts.net

在这次实测中,直接 IP 出现“Socket 未连接”,而 MagicDNS 名称可以正常打开共享。因此建议把 MagicDNS 作为首选连接方式。

同时检查:

- Shadowrocket 中 Tailscale 是否为“已连接”;

- 两条 TAILSCALE 规则是否位于兜底规则之前;

- “跳过代理”里是否仍有 100.64.0.0/10

- Mac Mini 的文件共享和 SMB 用户是否开启;

- Tailscale 后台中两台设备是否在线且 ACL 允许互访。

\2. 共享根目录显示“只读”

“文件”App 在服务器根层级显示“只读”,不一定代表所有共享都没有写权限。先进入某一个具体共享目录,再长按空白处或点“…”检查“新建文件夹”是否可用。

如果具体共享目录里可以新建文件夹,就说明它实际可写;根层级的“只读”只是服务器入口本身不能直接写入。

若共享内部也不可写,请回到 Mac Mini 的文件共享设置,确认当前 SMB 用户对该目录拥有“读与写”权限。

九、让连接长期可用:关闭 Key Expiry

Tailscale 的设备密钥默认可能会过期。对长期在线的自用设备,可以在管理后台进入对应设备详情,关闭 Key Expiry:

“Machines” → 选择设备 → “Key expiry” → “Disable key expiry”。

建议只对受你控制、启用了锁屏密码和磁盘加密的长期设备这样做。手机丢失或设备不再使用时,要立即从 Tailscale 后台移除设备。

十、安全检查清单

完成后,用下面这份清单自查:

- 没有在路由器上把 SMB 445 端口映射到公网;

- Auth Key 没有保存在公开截图、笔记分享链接或聊天记录里;

- Mac Mini 的 SMB 账号使用独立强密码;

- 只共享确实需要远程访问的文件夹;

- Tailscale ACL 只允许必要设备访问 Mini;

- iPhone 和 Mac 都开启锁屏密码,Mac 开启 FileVault;

- 丢失设备时,第一时间从 Tailscale 管理后台撤销。

最后总结

这套方案的关键不是让两个 VPN App 同时运行,而是让 Shadowrocket 统一承载网络隧道,再把访问 Tailscale IP 和 *.ts.net 的流量精确交给它内置的 Tailscale 模块。

最关键的三个设置是:

\1. 在 Shadowrocket 中完成 Tailscale 认证;

\2. 添加 IP 与 `

ts.net

两条TAILSCALE` 规则;

\3. 从“跳过代理”中移除 100.64.0.0/10,并优先使用 MagicDNS 连接 SMB。

如果你也想把家里的 Mac Mini 变成随时可访问的私人文件服务器,可以先收藏这篇,按步骤逐项设置。