闲置设备折腾:Tailscale 异地组网笔记
这篇笔记位于「开发实践」目录下,随手记录一下最近把家里的闲置设备利用起来搞异地组网的过程。
折腾起因
最近手里有一台笔记本闲置着,一直没想好拿来干嘛。它的配置其实还行,但因为已经有了一台配置更好的台式机专门用来打游戏,这台本子就彻底吃灰了。跟 AI 聊了一下之后,打算干脆给它重装成 Ubuntu 系统,刚好配合我最近手头这块 RK3588 的香橙派,再加上云服务器,一起搞个异地组网。
以前其实没怎么尝试过这种组网方式。在之前的认知里,搞内网穿透总觉得安全性没太大保障,容易把内网暴露出去。不过跟几个 AI 反复讨论评估之后,发现用 Tailscale 来做异地组网安全性还是挺靠谱的,只要在配置里把访问隔离做好,可以减少不必要的暴露;实际安全性仍取决于设备、身份管理和访问策略。
打洞原理(NAT 穿透)
动手之前先摸了一下 Tailscale 的基本原理。左侧拓扑用处在不同网络中的香橙派和笔记本演示通信过程;这是原理示意,不代表它们当前已经连通。向下阅读时,图中的路径会逐步变化。
下面按知识点拆开说明。实际连接会先通过 DERP 中继,再尝试升级为直连;探测和路径协商可能并行发生,并不是严格串行的六个操作。
1. 加入网络,认识彼此
设备安装 Tailscale 并登录后,会与协调服务交换节点、公钥和连接信息。协调服务负责帮助设备发现彼此、下发访问策略,不负责转发日常业务数据。
可以把这一步理解成先拿到一份“通讯录”:知道对方是谁、有哪些可能到达的地址,接下来才能尝试连接。设备的私钥留在本机。
2. 用 STUN 探测公网端点
家庭路由器通常会通过 NAT,把设备的内网地址转换成公网地址。设备向 STUN 服务发送探测请求,了解自己在外部看来使用的公网 IP 和端口。
Tailscale 的 DERP 服务器也提供 STUN 服务,但“探测地址”和“转发数据”是两种不同的职责。图中的公网端点 A、B 只是示意;映射可能随目标和网络环境变化,不应理解为固定不变的设备地址。
3. 双向发送探测包
有了候选地址,两台设备就可以向对方发送 UDP 探测包,尝试建立直接通信的路径。主动发出的数据包会建立相应的 NAT 状态,在合适的网络条件下,让对方返回的数据包能够通过。
这里的“打洞”不是关闭防火墙,也不是把整个内网公开。不同 NAT 和防火墙的行为并不一致,双方发包也不保证一定成功;Tailscale 会尝试寻找可用的路径。
4. 成功后,直接传输加密数据
找到可用路径后,两台设备通过 WireGuard 进行端到端加密通信。此时业务流量直接在设备之间传输,不需要绕经 DERP 中继。
这就是后面连接状态里 direct 的含义:描述的是当前这对设备之间的通信路径,并不意味着所有设备之间都已直连。网络变化后,路径也可能重新协商。
5. 无法直连时,通过 DERP 中继
如果当前网络无法建立直连,DERP 可以继续转发两端的加密数据,让设备仍然能够通信。中继服务器不能解密这些业务内容。
所以中继不是“连接失败”的另一种说法,而是一条可用的通信路径。相比直连,它可能增加延迟;是否能切换为直连,需要看两端实际的网络条件。
理解完这个过程,再回到安装本身就很简单了:
# Ubuntu / 香橙派安装并启动 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up访问隔离备忘
虽然默认登录同一个账号就能互通,但为了安全起见,后续还是要在控制台的 ACL(访问控制)里给云服务器、香橙派和笔记本打上不同的 Tag,限制一下能互相访问的端口,做好隔离。
拓扑里的“允许 SSH、拒绝未授权服务”只是策略示例,并不表示当前已经应用了这些规则。
和 WebRTC 的对比
研究这个打洞过程的时候觉得特别眼熟,因为我之前接触过用 WebRTC 来做长连接。
WebRTC 也是先通过信令服务器(一般走 TCP/WebSocket 协议)传递信令,然后两个节点之间再通过 UDP 进行 P2P 通信。两者的底层逻辑其实非常像,核心区别主要在实现的层级和用途上:
| 对比项 | WebRTC | Tailscale |
|---|---|---|
| 实现层级 | 应用层(主要基于浏览器或客户端应用层) | 网络层(直接在系统层建虚拟网卡) |
| IP 分配 | 不分配系统 IP,只维护当前通道 | 会给每个节点分配固定的虚拟局域网 IP |
| 生命周期 | 一次性的 Session,页面关掉或会话结束就断了 | 持续性组网,后台常驻一直连着 |
| 常见场景 | 在线视频会议、实时音视频推流等 | 跨地域设备互联、远程开发、私有服务访问 |
本地检查
目前香橙派和云端服务的连接已经跑通了,等后续把本地这台 Ubuntu 笔记本也配置好,就可以做更多尝试了。平时主要用下面这几个命令看连接状态:
tailscale status
tailscale ping <节点IP>

