Tailscale 入门:让自己的设备跨网络互联
出门后用笔记本连接家里的 Linux 主机,或用手机访问自己的开发服务,常常会遇到没有公网 IP、路由器不能配置端口转发的问题。Tailscale 可以把这些设备接入一个受身份和访问策略管理的私有网络,再通过设备名或 Tailscale IP 访问服务。
第一次使用,先完成一个目标:两台自己的设备加入同一个网络,在不同网络下访问其中一台的服务。本文以 macOS 笔记本和 Linux 主机为例,Windows、手机也可以作为客户端。
核对日期:2026-10-16。安装方式和功能支持以文中链接的官方文档为准;套餐额度会变化,选用前查看当前定价 (opens new window)。
# 先理解连接方式
Tailscale 使用 WireGuard 加密设备间的通信。账号登录和控制平面负责协调设备、身份及策略;设备尝试建立直接连接,无法直连时可经中继转发。直连和中继都保持设备间的端到端加密,中继可能增加延迟。详见连接类型 (opens new window)与加密说明 (opens new window)。
| 名称 | 在实际使用中意味着什么 |
|---|---|
| Tailnet | 由 Tailscale 管理的私有网络,两台设备需要加入同一个 tailnet,或另行配置共享 |
| Tailscale IP | 分配给设备的虚拟地址,IPv4 通常来自 100.64.0.0/10;它不是可供任意互联网用户访问的公网 IP |
| MagicDNS | 把设备名解析成 Tailscale 地址,减少记忆 IP 的负担 |
| DERP | 一种中继方式;看到它不代表连接失败,也不代表明文传输 |
| 访问策略 | 决定哪些身份、设备可以访问哪些服务端口 |
一个常见连接过程是:笔记本在酒店 Wi-Fi,Linux 主机在家中,两端登录同一个 tailnet,笔记本访问 home-server 的 Tailscale 地址。通常不需要在家庭路由器做端口映射,但两端仍需要可用的网络连接,目标主机也必须开机且服务正常。
默认组网不会把日常上网流量全部转到另一台设备。要让互联网流量从家里出去,需要另外配置“出口节点”。官方说明 (opens new window)
# 第一次上手:两台设备连通
1. 创建账号,安装客户端
从官方下载页 (opens new window)安装 macOS、Windows、iOS 或 Android 客户端,完成系统要求的网络扩展或 VPN 授权,然后登录。第一台设备建立网络,第二台使用同一个账号登录即可加入自己的 tailnet;可在管理控制台 (opens new window)确认两台设备均在线。完整流程见官方快速入门 (opens new window)。
macOS 只作为普通组网客户端时,可以选择官网提供的图形客户端;需要充当 Tailscale SSH 服务端时,使用下文的开源 tailscale/tailscaled 方案。避免同时安装并运行多个客户端变体。手机普通组网通过 App 操作;保留原 VPN 的浏览器 SSH 方案见后文。
Linux 可以使用官方安装脚本;它会修改系统的软件源或安装包,先下载查看,再执行。也可以按发行版安装说明 (opens new window)选择手动包管理器安装。
curl -fsSL https://tailscale.com/install.sh -o /tmp/tailscale-install.sh
less /tmp/tailscale-install.sh
sh /tmp/tailscale-install.sh
sudo tailscale up
2
3
4
tailscale up 会在需要时输出登录链接,在浏览器打开并使用同一账号授权。服务器没有浏览器也可以复制链接到自己的电脑完成授权;不要公开分享该链接。
2. 确认地址,给设备起容易识别的名字
在管理控制台把 Linux 主机命名为 home-server,笔记本命名为 my-laptop。后文的设备名和 100.101.102.103 都是示例,运行时替换为自己控制台显示的值。
| 操作 | 命令 | 预期结果 |
|---|---|---|
| 查看设备和连接状态 | tailscale status | 能看到自己和另一台已加入的设备 |
| 查看本机 Tailscale IPv4 | tailscale ip -4 | 输出本机的 100.x.x.x 地址 |
| 检查到目标的 Tailscale 路径 | tailscale ping 100.101.102.103 | 显示响应以及连接路径;初始经中继、随后变为直连属于正常情况 |
| 检查设备名解析和路径 | tailscale ping home-server | MagicDNS 正常时可直接使用设备名 |
MagicDNS 可在控制台的 DNS 页面检查。短设备名不可用时,先用 IP 验证,再尝试控制台显示的完整 *.ts.net 名称;不要自己猜完整域名。MagicDNS 文档 (opens new window)
macOS 若提示 tailscale: command not found,先检查所安装客户端提供的 CLI 设置。App Store 变体可通过下面的程序路径调用;其他变体按CLI 平台说明 (opens new window)设置。命令可用后再继续,不需要重复安装另一套后台服务。
/Applications/Tailscale.app/Contents/MacOS/Tailscale status
3. 换一个网络验证
让笔记本连接手机热点,Linux 主机继续留在家庭网络,再运行 tailscale ping。这可以确认连接确实跨过了两个网络,而不是只依赖同一个 Wi-Fi。路径检查成功之后,还需要用 SSH 或网页请求验证实际服务;tailscale ping 不能代替服务端口测试。
# 连接 SSH 和自己的网页服务
先用普通 SSH,保留原来的账号与密钥
只要 Linux 主机已启用 SSH 服务,允许相应连接,并且 tailnet 策略放行 TCP 22,就可以直接使用现有 SSH 工具连接。Tailscale 提供网络通路,普通 SSH 继续验证目标系统的用户和 SSH 密钥。两种 SSH 方式的区别 (opens new window)
ssh example_user@home-server
# 设备名还未解析时,可先用实际 Tailscale IP
ssh [email protected]
2
3
example_user 是目标 Linux 系统里真实存在的账号,通常不同于 Tailscale 登录邮箱。首次连接仍需核对 SSH 主机指纹,不能因为走私网就跳过。已有命令选项可参考本站的 SSH 文档。
如果连接的是 Mac,普通 SSH 需要先在系统设置中开启“远程登录”,并限制允许的用户。
可选:让 Tailscale 管理 SSH 身份
Tailscale SSH 可以基于 tailnet 身份和专门的 SSH 规则授权。初次入门建议先在 Linux 目标机使用;macOS 作为 Tailscale SSH 服务端需要开源 tailscaled 变体,不能把图形客户端直接当作等价服务端;Windows 不支持作为该功能的服务端,但可以作为连接客户端。平台限制与配置 (opens new window)
# 在 Linux 目标机启用;需同时检查网络访问规则与 SSH 规则
sudo tailscale set --ssh=true
# 在客户端连接,仍指定目标系统用户
ssh example_user@home-server
# 在 Linux 目标机关闭 Tailscale SSH
sudo tailscale set --ssh=false
2
3
4
5
6
7
8
启用后,来自 tailnet 的 22 端口连接由 Tailscale SSH 处理,已有的该路径 SSH 会话可能中断;authorized_keys 的原有内容不能保证该路径仍然授权成功。需要同时满足网络访问策略和 SSH 授权规则,必要时按提示在浏览器重新认证。切换前保留一条可用的管理路径,避免把自己锁在外面。
访问只监听本机的网页:使用 Serve
假设 Linux 主机运行了自己的 Web 服务,地址是 http://127.0.0.1:3000。在笔记本访问 http://home-server:3000 不会自动成功:127.0.0.1 只接受运行该服务的主机自身访问。
可以在运行服务的主机上使用 Tailscale Serve,由它代理本机端口,对 tailnet 提供 HTTPS 入口:
# 在运行 Web 服务的主机执行
curl -I http://127.0.0.1:3000
tailscale serve --bg --https=443 http://127.0.0.1:3000
tailscale serve status
2
3
4
第一次可能提示开启 HTTPS 或相关功能,按命令输出的官方授权链接完成设置。然后在已接入 tailnet、且策略允许的设备上打开命令输出的 HTTPS 地址。--bg 让配置在后台持续生效;应用进程仍要自己保持运行。Serve 功能 (opens new window)与命令说明 (opens new window)
| 操作 | 命令 | 注意 |
|---|---|---|
| 查看代理配置 | tailscale serve status | 以输出的地址为准 |
| 关闭本例 HTTPS 443 入口 | tailscale serve --bg --https=443 off | 与启用时保持相同选项;如配置了其他端口,按实际端口关闭 |
| 清除整台设备的 Serve 配置 | tailscale serve reset | 会影响这台设备上其他已有 Serve 入口,确认后再使用 |
Serve 的访问范围在 tailnet 内;Funnel 会把服务发布到公网,使用者不必加入自己的网络。它们不能混用概念,私有管理后台不要照抄 tailscale funnel 命令。Funnel 访问范围 (opens new window)
对于博客 AI 后端,Serve 可以作为“已接入 tailnet 的个人设备访问私有服务”的候选方案,但不等于现有后端已经支持它。公开博客调用私有 API,仍需处理 HTTPS、CORS、浏览器本地网络访问限制及后端身份认证;现有服务若要求 Cloudflare Access JWT,也不会因为网络可达自动通过认证。
# 按需要再选进阶能力
| 目标 | 功能 | 还需要做什么 |
|---|---|---|
| 连接已安装 Tailscale 的两台设备 | 基础组网 | 确认身份、网络策略、目标服务及防火墙 |
| 访问不能安装客户端的打印机、旧 NAS 等 | 子网路由器(Subnet router) | 常开网关可到达目标局域网;启用转发、发布并批准路由,放行所需访问;Linux 客户端通常还需接受路由 |
| 让上网流量从家里的设备出去 | 出口节点(Exit node) | 节点具备转发能力并发布、管理员批准,客户端主动选择;带宽受节点及其网络影响 |
| 向 tailnet 提供本机 Web 服务 | Serve | 保持应用运行,确认允许访问该入口的身份与设备 |
| 向互联网用户提供服务 | Funnel | 明确是公网暴露,并另外考虑应用登录、限流和内容范围 |
子网路由的典型路径是“外出笔记本 → 家中子网路由器 → 局域网打印机”。加密隧道只覆盖到路由器,路由器到目标设备这一段是否加密取决于应用协议;使用 HTTPS 等协议保护最后一段。家庭网段与外出网络重叠时,还可能遇到路由冲突。子网路由文档 (opens new window)
出口节点是“外出笔记本 → 家中出口节点 → 互联网”,只为 SSH 或访问家里一台服务器时通常用不上。客户端选择出口节点后,默认不能访问客户端所在局域网;确有需要再启用 Allow LAN access。出口节点不提供匿名保证,也不会自动带来更快网速。出口节点配置 (opens new window)
# 访问边界与常见排查
接入网络之后,仍要控制谁可以访问
新建 tailnet 通常带有方便设备互通的默认允许策略。加入他人、共享设备或部署管理服务之前,检查控制台 Access controls,根据需要限制源身份、目标设备和端口。多条授权规则会叠加,新增一条窄规则不能覆盖已有的宽泛允许;修改时保留管理路径并使用控制台策略测试。默认策略示例 (opens new window)与Grants 规则 (opens new window)
个人使用也应给登录账号开启多因素认证,及时在控制台移除丢失或闲置设备,关注设备密钥到期提示。不要把认证密钥写进博客或脚本仓库;联网授权不能代替应用自身的登录和操作权限。
| 现象 | 建议排查顺序 |
|---|---|
| 看不到另一台设备 | 是否同一 tailnet、两端是否已连接、是否待设备批准、是否休眠或密钥到期 |
| IP 能通,设备名不通 | 检查 MagicDNS、客户端 DNS 设置、其他 VPN 或 DNS 软件冲突;先用 IP 缩小范围 |
| 路径检查有响应,SSH 超时 | 检查网络访问规则、系统防火墙、SSH 服务和监听端口;普通 SSH 可用 ssh -v 查看阶段 |
SSH 返回 Permission denied | 普通 SSH 查系统账号与密钥;Tailscale SSH 查 SSH 规则及重新认证要求 |
| 网页打不开或连接被拒绝 | 先在服务所在主机访问本机地址;确认端口、进程和监听地址,再查 Serve 状态及访问策略 |
| 连接显示中继、速度偏慢 | 用 tailscale netcheck 查看 UDP 等网络条件,换网络对比;中继可用不等于一定能升级直连 |
| 手机开启后另一个 VPN 断开 | 不要在必须保留原 VPN 时反复切换;可改用 Safari SSH Console,具体流程见后文 |
| 用了出口节点后本地打印机不可达 | 检查 Allow LAN access 和本地网段冲突;不需要出口节点时取消选择 |
命令行为可查CLI 参考 (opens new window)。停用时,tailscale down 断开当前设备,tailscale up 重新连接;tailscale logout 注销本机身份。丢失设备还应在控制台移除,单纯退出其他设备并不能撤销丢失设备的访问。
第一次练习的完成标准:两台设备出现在控制台;其中一台换到热点后,仍能访问另一台的 SSH 或 Serve 页面;停止 Serve 后对应入口不可访问。做到这里,再按实际需求增加子网路由、出口节点或更细的访问策略。
# 实战:保留 iPhone 原 VPN,浏览器连接家里的 Mac
目标是 Mac 在家通过 Wi-Fi 联网,iPhone 通过蜂窝网络并保留现有 VPN,在 Safari 中操作 Mac 上 tmux 内的 Codex。连接路径是:
iPhone Safari(保留现有 VPN)
→ Tailscale 网页管理后台 / SSH Console
→ 家中 Mac 的开源 tailscaled SSH 服务端
→ Mac 本地用户的新 shell
→ attach 已有 tmux 会话
→ 操作持续运行的 Codex
2
3
4
5
6
浏览器 SSH Console 会创建临时 Tailscale 节点,因此不要求开启 iPhone Tailscale App 的 VPN。它提供终端入口,不会让 Safari 的其他页面自动获得整个 tailnet 的访问能力。现有 VPN 仍需允许浏览器访问登录服务及中继,不能保证任意 VPN 配置都兼容。
Mac 安装与网页后台是两回事
先检查,复用已有组件:
sw_vers
uname -m
command -v brew tailscale tailscaled tmux codex
brew list --formula --versions tailscale tmux
brew list --cask --versions tailscale
brew services list
tmux list-sessions
2
3
4
5
6
7
开源 Homebrew formula 提供 tailscale 命令及后台 tailscaled,没有应用程序文件夹中的图形窗口。图形版附带 CLI 不代表它支持 Mac SSH 服务端。发现已有图形版时先记录版本、账号及配置位置,按官方迁移说明处理,勿清空状态或启动两套服务。官方开源 Mac 安装说明 (opens new window)
brew install --formula tailscale
sudo brew services start tailscale
sudo tailscale up
2
3
密码只在本机终端的 sudo 提示中输入;打开 tailscale up 显示的链接完成账号认证。Safari 已登录控制台,不代表 Mac 已登录入网。本次排查中,手机已登录,但 Mac 仍为 NeedsLogin,所以手机列表里没有 Mac;完成 Mac 设备认证后才变为 Running、Online: true,并得到 Tailscale IP。
管理后台是网页控制台 (opens new window),Mac 浏览器和 iPhone Safari 都能访问。编辑策略建议用 Mac:进入 Access controls,左侧选择 JSON editor;不是在本机寻找同名应用。手机页面可能需要横向滚动才能看到设备行最右侧菜单。页面上的 Add second device 是客户端安装引导,本方案不用在 iPhone 点击它来安装第二个 VPN。
先收紧规则,再开启 SSH
在 Access controls (opens new window) 备份完整原策略。此次看到的是默认全互通网络规则,以及允许成员以 root 或任意非 root 用户登录自己设备的 SSH 规则。新增窄规则不能当成撤销旧授权,应检查所有匹配规则。SSH 授权说明 (opens new window)
下面是“只有这一项远程 SSH 用途”的最小示例;将邮箱、虚拟 IP、本地用户名替换为自己的值。它会取消其他 tailnet 互通用途,已有其他服务时应在原策略上逐项调整,不能直接覆盖。
{
"grants": [
{
"src": ["[email protected]"],
"dst": ["100.101.102.103"],
"ip": ["tcp:22"]
}
],
"ssh": [
{
"action": "check",
"src": ["[email protected]"],
"dst": ["autogroup:self"],
"users": ["example_user"]
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
网络规则只允许指定身份到目标 IP 的 TCP 22;SSH 规则允许该身份在自己的设备上以指定本地用户登录,二者都满足才可连接。autogroup:self 本身不是“只指定一台设备”,本例靠网络规则限定目标;以后增加网络授权时要重新检查组合效果。目标 100.x.x.x 是 Tailscale 虚拟地址,不是家庭公网地址,更换 Wi-Fi 通常不变;设备删除重建后须重新核对。
确认控制台保存成功、规则已下发后,在 Mac 开启:
sudo tailscale set --ssh=true
tailscale status
tailscale ip -4
id -un
2
3
4
Tailscale SSH 自带服务端,不需要为它额外开启 macOS“远程登录”,也不需要公网 22 端口、路由器映射、Funnel、出口节点或子网路由。id -un 输出才是连接时填写的 Local username,不是邮箱或电脑显示名称。
iPhone 连接和认证
- Mac 接电、开盖并保持联网;iPhone 关闭 Wi-Fi,使用 4G/5G,保留原 VPN,不开启 Tailscale App 的 VPN。
- Safari 打开 Machines (opens new window),登录同一 tailnet,找到 Mac。
- 设备行最右侧
⋯→ SSH to machine,填写 Mac 的本地短用户名。 - 按弹窗提示重新认证,再进入终端;若没有 SSH 入口,先检查 Mac 是否开启 SSH、账号角色与两层访问规则。
SSH Console 要求 Owner、Admin、IT admin 或 Network admin 角色,每次创建会话都需要重新认证。浏览器临时节点的 OS 属性是 js,若现有设备姿态规则只放行 macOS,浏览器可能被拦截。此入口目前为 beta,使用 DERP 中继;临时节点结束后会移除,不应把临时节点 IP 写成固定来源。SSH Console 官方说明 (opens new window)
SSH 不会自动进入电脑已有的终端窗口
SSH 建立的是目标用户的新 shell。已有 Codex 若运行在 tmux 中,手机 attach 到同一会话即可看到并操作它;若原来不在 tmux 内,不能声称能直接迁移,也不要终止旧会话或启动第二个 Codex 修改同一项目。
# 连接后先确认身份和现有会话
whoami
hostname
pwd
tmux list-sessions
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command}'
# 示例:已有 Codex 位于会话 1、窗口 1、面板 1
# 先切换窗口,再选面板;号码以实际列表为准
tmux select-window -t 1:1
tmux select-pane -t 1:1.1
tmux attach-session -t 1
2
3
4
5
6
7
8
9
10
11
12
attach 不会新启动一个 Codex;电脑和手机可同时操作同一会话,输入会共享,窗口尺寸可能随客户端变化。离开时用 tmux 的 detach,不要在 Codex 中误按退出操作。默认快捷键是先按 Ctrl+B,松开后按 D;已有配置可能修改前缀,使用 tmux show-options -gv prefix 查询。
还没有会话时,可以先创建命名会话:tmux new-session -s codex-blog -c /path/to/project,之后在里面按自己的正常方式启动 Codex。先确认没有同项目的活动会话,再启动;手机恢复使用 tmux attach-session -t codex-blog。tmux 保留的是运行中的进程,不会在 Mac 重启后自动恢复进程。
持续在线与重连的坑
| 现象 / 条件 | 处理方式 |
|---|---|
| 锁屏、屏幕熄灭 | 不等于系统睡眠;系统保持清醒时可继续连接 |
| 空闲睡眠、合盖 | 可能使服务不可达;初次测试保持开盖,不依赖网络唤醒 |
| 临时保持清醒 | 在本机终端运行 caffeinate -is -t 7200,两小时后结束;该终端 Ctrl+C 可提前取消,不改永久设置;-s 仅接电有效,不保证绕过合盖睡眠 |
| 手机切后台、锁屏、切换网络 | Safari 可能挂起网页或断开 SSH;重新从控制台连接,再 attach tmux |
| 窗口显示 Reconnecting | 先区分是聊天 App 还是 SSH Console;检查其他网页、Mac 在线状态、VPN 和错误提示,不把所有重连都归因于 Tailscale |
| SSH 已断开,但 Codex 在 tmux 中 | 重新连接同一用户、同一 tmux 会话;不要直接重启 Codex |
| 重启 tailscaled 或升级服务 | 现有 SSH 连接会断开,安排在不用远程操作时进行 |
| 找不到 tmux / codex 命令 | SSH shell 的 PATH 可能不同;Apple Silicon Homebrew 可用 /opt/homebrew/bin/tmux,Codex 路径用本机 command -v codex 确认 |
测试时记录失败发生在哪一步:控制台登录、找设备、SSH 入口、重新认证、终端建立还是 tmux 恢复;保留错误文字、时间、Mac 的 tailscale status、tailscale netcheck 结果及手机 VPN 状态。分享日志前去掉登录链接、凭据和其他设备隐私信息。
本次记录的已验证结果是开源版安装、后台运行、Mac 认证并在线,以及找到已有 tmux 内的 Codex。已经讨论最小策略,但没有记录控制台保存后的有效规则验证;Tailscale SSH 开启及 iPhone 外网 attach 测试也未由本次操作验证。后续暂缓手机 SSH 测试,先尝试通过 Codex App 的聊天操作;这不等于 Tailscale 链路已实测通过,也不代表两种远端方式已经互通。
# 常用命令与帮助速查
tailscale 是客户端命令,tailscaled 是后台服务;TS 只是文中简称,默认没有 ts 命令。下表用于 Mac/Linux 终端,iPhone Safari 内连接成功后执行的命令实际上运行在远端 Mac。修改配置若提示权限不足,在本机或已授权终端按需使用 sudo,不要把密码发到聊天里。
| 用途 | 命令 | 说明 |
|---|---|---|
| 查看顶层帮助 | tailscale --help | 列出当前安装版本支持的子命令 |
| 查看子命令帮助 | tailscale status --help | 帮助参数放在子命令后面 |
| 查看配置参数 | tailscale set --help | 修改之前先确认选项与默认值 |
| 查看 SSH 命令帮助 | tailscale ssh --help | CLI SSH 的帮助,不是浏览器 Console 的入口 |
| 查看 Serve 帮助 | tailscale serve --help | 旧教程与当前版本语法可能不同 |
| 查看版本 | tailscale version | 排查时附上版本 |
| 连接 / 发起认证 | tailscale up | 需要时输出登录链接,打开后完成设备授权 |
| 查看连接状态 | tailscale status | 检查是否运行、设备是否在线 |
| 机器可读状态 | tailscale status --json | 可查看 BackendState、Self.Online 等;结构可能随版本变化,勿原样公开全部输出 |
| 查看虚拟 IPv4 | tailscale ip -4 | 不是公网 IP |
| 检查到设备的路径 | tailscale ping home-server | 本机已加入 tailnet 后使用,成功不代表 SSH 端口已获准 |
| 网络条件诊断 | tailscale netcheck | 帮助排查 UDP、中继等网络条件 |
| 使用 CLI 连接 SSH | tailscale ssh example_user@home-server | 仍需满足目标的 SSH 授权 |
| 开启 / 关闭 SSH 服务端 | sudo tailscale set --ssh=true / sudo tailscale set --ssh=false | 仅支持相应服务端平台;不要在唯一管理路径上随意切换 |
| 断开当前设备 | tailscale down | 可能立即切断当前远程管理链路 |
| 注销本机账号 | tailscale logout | 会断开并使当前节点密钥失效,不是普通的临时断连 |
| 启动 Mac 开机服务 | sudo brew services start tailscale | Homebrew formula 安装路径;不要再启动第二个 daemon |
| 停止 Mac 后台服务 | sudo brew services stop tailscale | 会影响当前远程连接 |
本次安装版本实查支持 tailscale --help 和 tailscale <子命令> --help;tailscale help status 返回未知子命令,不要套用其他工具的 help 写法。tailscale set 用于修改指定偏好,已有复杂配置时优先查询其帮助,避免误用 tailscale up --reset 重置其他选项。命令以官方 CLI 参考 (opens new window)及本机 --help 为准。