场景 链接到标题

家里一台 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: 双方互相可直达 → 直连建立

流程:

  1. 两台机器都先连接到 Tailscale 的协调服务器,登记自己的公网 IP:端口内网 IP:端口
  2. 协调服务器把对方的地址信息交换给彼此
  3. 双方同时向对方的公网 IP:端口发送 UDP 包(这就是"打洞")
  4. NAT 设备收到这个 UDP 包后,如果之前有对应的出站会话,就会放行并建立映射
  5. 一旦双向映射建立,两台机器就可以直接通信了

这就是 UDP 打洞(UDP Hole Punching)。家庭宽带和办公网络通常是 Cone NAT,打洞成功率很高。如果打洞失败,Tailscale 会自动切换到 DERP 中继节点转发,保证连通性。

为什么快 链接到标题

  • WireGuard 内核态加密:加解密在 kernel 层面完成,开销极低
  • UDP 隧道:不存在 TCP over TCP 的嵌套重传问题
  • SSH 对延迟敏感:41ms 的延迟对于交互式操作完全够用

总结 链接到标题

  • 注册到使用只要 5 分钟
  • SSH 直连比跳板机方案简洁得多
  • 理解 NAT 穿透原理后,这类工具用起来更安心
  • 速度满足日常开发需求