家里没有固定 IP,如何从办公室稳定远程访问 Mac Studio?我的最终方案是 WireGuard + VPS 中转

我家里有一台 Mac Studio,平时会放在家中长期运行。需求很简单:我希望能在办公室随时远程连回去,做一些 SSH 管理、文件操作,必要时也能直接打开 macOS 的屏幕共享进行远程控制。

听起来这是一个很常见的远程访问需求,但实际动手时,会遇到几个现实问题:

  • 家里宽带没有固定公网 IP
  • 运营商网络和办公网络都可能有 NAT 或更复杂的限制
  • 我不想把 SSH、VNC 之类的服务直接暴露到公网
  • 我希望方案尽量安全,同时也别太折腾
  • 最重要的是,不只是“能连上”,还得“尽量好用”

这篇文章记录的是我从 Tailscale 走到 WireGuard + VPS 中转 的完整过程。如果你也有类似需求,这套思路应该很有参考价值。

一开始,我选择了 Tailscale

最初我用的是 Tailscale。

原因很简单:它的上手门槛真的很低。安装客户端,登录,同一个网络里的设备就能互通。对于“家里一台机器,办公室一台机器”的场景来说,它几乎是最省心的选择之一。

理论上看,它也很适合我这种情况:

  • 不需要固定公网 IP
  • 自动处理 NAT 穿透
  • 不需要我自己搭建复杂控制面
  • 底层基于 WireGuard,安全性也没有问题

但问题出在实际网络环境上。

问题出现了:能连上,但远程桌面体验很差

我在办公室连回家里的 Mac Studio 时,发现延迟非常高。普通的终端操作还能勉强接受,但一旦打开屏幕共享,体验就明显不对劲:卡顿、拖影、响应慢,根本不适合长期使用。

后来排查发现,问题不在于“服务没通”,而在于链路质量不理想。

tailscale ping 的结果可以看出,连接并没有建立直连,而是走了 DERP 中继。这意味着:办公室电脑和家里的 Mac Studio 没有直接通信,而是通过 Tailscale 的中继服务器绕了一圈。

这对“偶尔连一下”可能无伤大雅,但对屏幕共享这种交互式远程控制来说,体验会明显下降。

这时候我才意识到,远程访问里有两个层次的问题:

  1. 能不能连上
  2. 连上之后好不好用

Tailscale 很擅长解决第一个问题,但在我这个具体网络环境里,第二个问题并没有被很好解决。

为什么会这样?

简单说,就是 NAT 穿透没有成功建立直连。

如果两端网络都比较友好,Tailscale 的体验通常非常好。但如果其中一端,尤其是办公室网络,对 UDP、NAT 打洞、直连策略不太友好,那么连接就可能退化成走中继。

一旦走中继,SSH 可能还能用,远程桌面就容易变差。

于是我开始换一个思路:

既然 NAT 穿透靠不住,那我就不要再把希望放在“自动直连”上,而是自己搭一条固定、可控的路径。

最终方案:WireGuard + VPS 中转

最后我采用的方案是:

办公室 Mac ⇄ VPS ⇄ 家里的 Mac Studio

也就是说,我找一台有公网 IP 的 VPS 作为中转节点,让家里的 Mac Studio 主动连过去,办公室的 Mac 也主动连过去。这样一来,办公室访问家里的机器时,流量会稳定地经过这台 VPS。

这个方案有几个明显优点:

  • 不依赖家里有固定公网 IP
  • 不依赖 NAT 穿透是否成功
  • 不需要把家里的管理端口暴露到公网
  • 整条路径由我自己掌控
  • 只要 VPS 带宽和线路还行,体验通常比不稳定中继更可控

对我来说,这套方案的价值不是“看起来更高级”,而是“链路终于掌握在自己手里”。

我原本就有一条 WireGuard VPN,会不会冲突?

这是我一开始最担心的问题之一。

因为我本来就在用一套基于 WireGuard 的 VPN。如果新方案也建立在 WireGuard 上,会不会互相打架?

实际结论是:可以共存

真正容易冲突的,不是“都用了 WireGuard”,而是路由设计。只要你避免下面这几件事,问题通常不大:

  • 不要让两条 VPN 都抢默认路由
  • 不要让两边使用重叠的网段
  • 不要把同一批目标流量同时送进两条隧道

我的处理方式很简单:新的这条 WireGuard 中转隧道,只负责访问家里的那台机器,不接管默认出网。

也就是说,办公室电脑这边只让下面两个地址走新隧道:

  • VPS:10.77.0.1
  • 家里的 Mac Studio:10.77.0.2

这样一来,原有 VPN 继续做原来的事,新加的中转 VPN 只负责“回家”这件事,两边互不影响。

我的地址规划

为了避免混乱,我单独规划了一个小网段:

  • VPS:10.77.0.1/24
  • Home Mac Studio:10.77.0.2/24
  • Office Mac:10.77.0.3/24

整个思路很简单:

  • VPS 是中转站
  • 家里的 Mac Studio 是目标机器
  • 办公室 Mac 是访问端

安装过程并不复杂,但 macOS 上有个坑

VPS 是 Ubuntu,这边安装很直接:

sudo apt update
sudo apt install -y wireguard

家里的 Mac Studio 和办公室 Mac 都是 macOS。因为我所在地区不方便通过 App Store 安装 WireGuard,所以我走的是 Homebrew 路线:

brew install wireguard-tools
brew install wireguard-go

这里有一个很容易踩到的坑:macOS 自带的 Bash 版本太旧,而 wg-quick 需要更新版本的 Bash。

所以如果你直接运行:

sudo wg-quick up wg-home

很可能会报错,提示 Bash 版本不对。

我的解决方法是显式使用 Homebrew 的 Bash:

sudo /opt/homebrew/bin/bash /opt/homebrew/bin/wg-quick up /usr/local/etc/wireguard/wg-home.conf

这个点看起来很小,但如果不知道,会卡很久。

实施顺序:先打通家里机器,再接入办公室电脑

我没有一开始就三端一起配,而是分成了两个阶段。

第一阶段:先打通 VPS 和家里的 Mac Studio
先只做一件事:Home Mac Studio ⇄ VPS

这样可以先确认:

  • 家里的机器能不能稳定连到 VPS
  • WireGuard 基础配置是不是正常
  • 路由和端口有没有问题只要这一步成功,后面的事情就简单很多。

第二阶段:再接入办公室 Mac
等家里的机器和 VPS 通了之后,再把办公室电脑作为第三个节点接进来。

最终形成:Office Mac ⇄ VPS ⇄ Home Mac Studio

这一阶段最关键的一点是:办公室电脑的配置里,不要让这条新隧道接管默认路由,而只让访问 VPS 和家里 Mac 的流量走进去。这一步做对了,就不会影响原有 VPN。

VPN 打通之后,还要做什么?

VPN 打通只是“网络通了”,还不等于“能远程管理”。因为目标机器是 macOS,所以还需要在家里的 Mac Studio 上开启系统自带的远程功能。

1. 开启 SSH
在系统设置里打开:
通用 -> 共享 -> Remote Login
然后建议把权限限制成“Only these users”。

这样办公室电脑就可以直接:

ssh 用户名@10.77.0.2

2. 开启屏幕共享

同样在系统设置里打开:
通用 -> 共享 -> Screen Sharing

之后在办公室 Mac 上执行:

open vnc://10.77.0.2

这样就能用 macOS 自带的屏幕共享远程控制家里的 Mac Studio 了。

实际效果怎么样?

就功能可用性来说,这套方案是成功的。部署完成之后:

  • SSH 稳定可用
  • 屏幕共享也能正常连接
  • 整体体验比之前 Tailscale 走中继时明显更好

不过,我在继续使用时还是发现了一个问题:如果开启 High Performance Screen Sharing,延迟依然比较明显。

这时问题已经不是 VPN 方案本身,而更可能是 VPS 带宽

远程桌面里,带宽和延迟是两回事。我当前这台 VPS 只有 3M 带宽

这时候就要区分两个概念:

  • 延迟 决定操作是不是跟手
  • 带宽 决定画面是不是流畅、会不会卡顿、会不会拥塞

很多时候你感觉“延迟很大”,其实不一定只是 RTT 高,也可能是屏幕数据太多,而链路带宽太小,导致排队和拥塞。

对 SSH 来说,3M 带宽绰绰有余。但对屏幕共享,尤其是高性能模式来说,3M 就偏紧了。

我手里还有另一台 5M 的 VPS,位置和当前这台差不多,也在同区域、同城市。所以我后来的判断是:既然地理位置差不多,那优先换带宽更大的那台,更值得尝试。

为了方便迁移,我把整个方案脚本化了

既然这套方案已经跑通了,我就顺手把部署过程整理成了一套可重复使用的脚本:

  • setup-wg-relay.sh:在 Ubuntu VPS 上自动部署 WireGuard 中转
  • rollback-wg-relay.sh:快速回滚
  • generate-wg-clients-safe.sh:根据密钥文件生成客户端配置
  • migrate-wg-relay.sh:一键迁移到新 VPS

这样以后换 VPS、换机房、换带宽时,就不用再手工从零配一遍。

这一步看起来像“锦上添花”,但其实很有必要。因为只要你开始长期使用这套方案,迁移和复用迟早会发生。

这次实践最值得记住的几件事

回头看整个过程,我觉得有几个经验特别值得记下来。

  1. Tailscale 很方便,但并不保证远程桌面体验一定好
    如果能直连,它很优秀;如果退化成中继,体验可能明显下降。
  2. 远程访问不能只看“通不通”,还要看“顺不顺”
    SSH 和屏幕共享对网络质量的要求完全不是一个级别。
  3. 自己控制链路,很多时候比“自动组网”更重要
    尤其是在办公网络、复杂 NAT、企业网络环境下,这一点特别明显。
  4. 多个 WireGuard VPN 完全可以共存
    前提是路由设计要克制,别动不动就上默认路由。
  5. macOS 的命令行 WireGuard 环境有自己的坑
    尤其是 wg-quick 对 Bash 版本的要求,必须提前知道。
  6. VPS 带宽对屏幕共享影响很大
    很多“像延迟一样的卡顿”,其实是带宽不足导致的。

最后总结

如果你的目标只是“有时候从外面连回家里机器”,Tailscale 这类方案真的非常省心。

但如果你的目标进一步升级成:

  • 办公室长期远程管理家里的机器
  • SSH 要稳定
  • 屏幕共享要尽量流畅
  • 网络环境又不利于 NAT 穿透

那么 WireGuard + VPS 中转 往往是一条更可控、更稳妥的路线。至少对我这次的实际场景来说,它确实比原来的方案更适合。

一句话总结就是:当自动穿透不够稳定时,自己搭一条固定、可控的回家路,往往才是真正好用的方案。