场景 链接到标题
家里一台 macOS,办公室局域网内一台 Ubuntu VM。以前要 SSH 访问办公室 VM,需要经过跳板机:
macOS → 跳板机 → 办公室内网 → VM
步骤繁琐,依赖跳板机在线,而且 scp 传文件要走两跳,速度慢。
目标:像在内网一样直接访问。
注册 链接到标题
打开 Tailscale 官网,用 GitHub 账号授权登录即可。登录后自动创建一个 Tailnet(你的私人网络)。
免费版支持 3 个用户、100 台设备,个人使用完全够。
macOS 安装 链接到标题
brew install --cask tailscale
安装后启动,菜单栏出现 Tailscale 图标。点击登录,浏览器打开认证页面,选择 GitHub 账号授权,几秒钟就加入 Tailnet 了。
Ubuntu Server 安装 链接到标题
curl -fsSL https://tailscale.com/install.sh | sudo sh
sudo tailscale up
第二条命令会输出一个认证链接,浏览器打开,登录同个 GitHub 账号即可。
# 验证状态
tailscale status
两台机器应该都出现在列表中了。
SSH 直连 链接到标题
# 查看远端机器的 Tailscale IP
tailscale status
# 直接 SSH,无需跳板
ssh user@100.x.x.x
延迟测试:
tailscale ping 100.x.x.x
# pong from hostname (100.x.x.x) via xxx.xxx.xxx.xxx:41641 in 41ms
41ms 延迟,SSH 敲命令几乎感觉不到延迟,体验与内网无异。
文件传输 链接到标题
# 从家里复制文件到办公室 VM
scp somefile user@100.x.x.x:~/
实测速度约 1.7MB/s,受限于双方的上行带宽。对于配置文件、代码、文档等中小文件完全够用。大文件建议用 rsync 续传。
直连 vs 中继 链接到标题
如何判断当前连接是直连还是通过中继?
tailscale ping 100.x.x.x
输出判断:
| 输出特征 | 连接方式 | 说明 |
|---|---|---|
via xxx.xxx.xxx.xxx:41641 |
直连 | 显示真实 IP 和端口,走 WireGuard 隧道 |
via DERP(区域名) |
中继 | 走 Tailscale 的中继节点,延迟更高 |
直连的延迟通常在 5-50ms,中继往往 100ms+。
NAT 穿透原理 链接到标题
为什么两台机器都在 NAT 后面,还能直接连通?
sequenceDiagram
participant Mac as macOS (家)
participant Coord as 协调服务器
participant VM as Ubuntu VM (办公室)
Mac->>Coord: 注册,告知我的公网IP:端口
VM->>Coord: 注册,告知我的公网IP:端口
Coord->>Mac: 告知 VM 的公网IP:端口
Coord->>VM: 告知 Mac 的公网IP:端口
Mac->>VM: UDP 打洞包 → 办公室 NAT
VM->>Mac: UDP 打洞包 → 家 NAT
Note over Mac,VM: NAT 上建立 UDP 映射
Note over Mac,VM: 双方互相可直达 → 直连建立
流程:
- 两台机器都先连接到 Tailscale 的协调服务器,登记自己的公网 IP:端口和内网 IP:端口
- 协调服务器把对方的地址信息交换给彼此
- 双方同时向对方的公网 IP:端口发送 UDP 包(这就是"打洞")
- NAT 设备收到这个 UDP 包后,如果之前有对应的出站会话,就会放行并建立映射
- 一旦双向映射建立,两台机器就可以直接通信了
这就是 UDP 打洞(UDP Hole Punching)。家庭宽带和办公网络通常是 Cone NAT,打洞成功率很高。如果打洞失败,Tailscale 会自动切换到 DERP 中继节点转发,保证连通性。
为什么快 链接到标题
- WireGuard 内核态加密:加解密在 kernel 层面完成,开销极低
- UDP 隧道:不存在 TCP over TCP 的嵌套重传问题
- SSH 对延迟敏感:41ms 的延迟对于交互式操作完全够用
总结 链接到标题
- 注册到使用只要 5 分钟
- SSH 直连比跳板机方案简洁得多
- 理解 NAT 穿透原理后,这类工具用起来更安心
- 速度满足日常开发需求