iPhone 挂着 Shadowrocket,也能公网访问 Mac Mini:Tailscale
很多人会遇到这个组合需求:
- 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,
,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://<设备名>.
\5. 选择“注册用户”;
\6. 输入 Mac Mini 上允许 SMB 登录的用户名和密码。
连接成功后,“文件”App 会列出 Mac Mini 上开放的共享目录。
八、两个容易误判的问题
\1. 用 Tailscale IP 连接时提示“Socket 未连接”
如果 smb://100.x.x.x 失败,不代表 Tailscale 一定没通。可以改用:
smb://<设备名>.
在这次实测中,直接 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 与 `
两条TAILSCALE` 规则;
\3. 从“跳过代理”中移除 100.64.0.0/10,并优先使用 MagicDNS 连接 SMB。
如果你也想把家里的 Mac Mini 变成随时可访问的私人文件服务器,可以先收藏这篇,按步骤逐项设置。












