大家好,我是西贝。

我用一台闲置的老 PC 搭建了一个 NAS:用 Immich 备份照片,用 Navidrome 搭建 HiFi 音乐服务器,偶尔还会启动 MySQL、Redis 测试项目。

但我经常出校,一旦离开校园网,就无法访问内网里的 NAS:因为 NAS 只有内网地址,外网无法直接"看到"它。

打个比方:校园网就像一栋公寓楼,每台设备是一个房间,内网 IP 是房间号。你在外面想找人,只知道"某某公寓"的地址(公网 IP),却不知道房间号,而且公寓大门(NAT 网关)默认不让外人随便进。所以,必须要有某种方式"绕过"这扇门——这就是内网穿透。

内网穿透有哪些方案?

市面上的内网穿透方案大致分两类:

  • 端口映射类(如 frp):把内网的某个服务暴露到公网,适合对外提供服务。
  • 组网类(如 WireGuard、Tailscale):在多台设备之间搭建虚拟局域网,注册设备之间可以互相访问,更适合自用。

而我毫无疑问选择了第二种。想一想自己所有的电子设备都可以 ping 通,实现万物互联,实在是一件美事。

最开始我使用的是 WireGuard 搭建 VPN,但是配置非常麻烦。而 Tailscale 就解决了这个问题,还多出了不少非常有用的功能:

  • MagicDNS:可以给自己的虚拟局域网和设备安排一个易记的域名(如 nas.ts.net),不用背内网 IP 地址。
  • 子网路由:在一台设备上配置子网路由,就能让整个局域网的设备都被 Tailscale 网络访问。
  • Exit Node:可以让所有流量通过某个节点出去,类似代理。比如我在咖啡馆连公共 WiFi,可以让流量通过家里的 NAS 出去,更安全。

我的解决方案

最终,我的方案是:Headscale + Tailscale 客户端

Tailscale 官方提供的服务很方便,但我选择了自建控制服务器(Headscale):

  1. 隐私可控:设备列表、连接信息都在自己的服务器上,不经过第三方
  2. 无限制:官方免费版有设备数限制(虽然限制高达上百设备,完全够用)
  3. 国内访问更快:官方服务器在国外,偶尔抽风;阿里云 ECS 在国内,延迟更低

Headscale 是 Tailscale 控制服务器的开源实现,完全兼容 Tailscale 官方客户端——这意味着我可以享受 Tailscale 优秀的客户端体验,同时掌控自己的数据。

其次,Headscale 内嵌了 derp 服务,在遇到对称性 NAT 打洞失败的时候,通过 derp 来做兜底。