先搞懂几个核心概念#
不用全记住,遇到再回来查。理解这几个词,后面全通。
| 概念 | 一句话解释 |
|---|---|
| Tailnet | 你的私有网络。同一个账号登录的所有设备都在这张网里,互相能通。 |
| 节点 Node | 网里的每台设备,自动分到一个 100.x.y.z 的私有 IP(永不变)。 |
| MagicDNS | 给每台机一个好记的名字,直接用 ssh laptop 而不是记 IP。 |
| 直连 vs 中继 | Tailscale 优先让两台机点对点直连(打洞);打不通才走中继(DERP),慢一些但保证通。 |
| ACL | 访问控制策略,一份 JSON 决定"谁能连谁的哪个端口"。安全的核心。 |
| Exit Node | 出口节点。让你的全部上网流量从某台指定机器出去(类似 VPN 落地)。 |
| Subnet Router | 子网路由。一台机器把它所在的整个局域网"引进" tailnet,别的设备不用装 Tailscale 也能访问。 |
tailscale up 登录;之后 tailscale status 看谁在线、tailscale ping <机器> 看走的是直连还是中继。App Store 版(GUI)或 brew install tailscale(CLI)。
curl -fsSL https://tailscale.com/install.sh | sh
应用商店搜 Tailscale,同账号登录即入网。
官网下载安装包,托盘登录。
从任何地方 SSH 回自己的机器#
出门在外(咖啡馆、公司、出差),想连回家里或云端的服务器跑命令、看日志。传统做法要在路由器开 22 端口转发,暴露在公网天天被爆破。
- 用 Tailscale SSH:认证走 tailnet 身份,不用管公钥分发,还能强制重新认证。
- 服务器 不在公网开 22 端口,SSH 只监听 Tailscale 接口。
- 用 MagicDNS 名字连,不背 IP。
在要被连的服务器上开启 Tailscale SSH:
# 开启 Tailscale SSH(接管 SSH 认证) tailscale up --ssh
# 直接用机器名连,无需公网 IP、无需端口 ssh user@myserver # 或带 tailnet 全名 ssh [email protected]
远程桌面 / 屏幕共享(一块屏控制多台机)#
家里有多台电脑但只有一块显示器;或者出门想图形化操作家里那台机。想像坐在它面前一样点鼠标、开 App。
- 屏幕共享(VNC)走 tailnet:在家自动直连局域网(~2ms),出门走加密隧道,全程不开公网端口。
- 用 MagicDNS 名字发起连接,做成一条命令一键弹出。
- 被控机若不接显示器(无头),插个几十块的 HDMI 假负载或用虚拟显示器,避免分辨率变低。
被控的 Mac:系统设置 → 通用 → 共享 → 打开「屏幕共享」。发起端直接连:
# 用 MagicDNS 名字(在家走局域网直连,最快) open vnc://mymac # 出门时用它的 Tailscale IP open vnc://100.x.x.x
# 在家走局域网,不在家自动回退 Tailscale vnc-desk() { if ping -c1 -t1 mymac.local >/dev/null 2>&1; then open "vnc://mymac.local" else open "vnc://100.x.x.x" # 目标机的 Tailscale IP fi }
3389)、Linux 用 xrdp / VNC,道理一样——服务端口只对 tailnet 开放即可。访问整个家庭 / 公司内网#
家里有 NAS、打印机、智能家居、路由器管理页、IoT 设备——它们装不了 Tailscale。出门却想访问它们。
- 选一台常开的机器(家用小主机 / NAS / 软路由)当 Subnet Router,把整个网段引进 tailnet。
- 只广播真正需要的网段,别把无关子网也放进来。
- 路由要在管理后台手动批准后才生效。
# 开启 IP 转发 echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf sudo sysctl -p /etc/sysctl.d/99-tailscale.conf # 广播你的局域网网段(按实际改) tailscale up --advertise-routes=10.0.0.0/24
# 打开 https://login.tailscale.com/admin/machines # 找到这台机 → ... → Edit route settings → 勾选批准该子网
tailscale up --accept-routes # 之后就能直接访问内网里没装 Tailscale 的设备,比如 NAS 后台 open http://10.0.0.20
出门让全部流量走指定出口#
连了不安全的公共 WiFi,想给全部流量加密;或需要一个固定的出口 IP(某些服务只认你家/公司 IP);或人在境外想从家里出口访问国内网络。
- 用一台带宽好、常开的机器(家里主机或云服务器)当 Exit Node。
- 手机/笔记本一键切换出口,离开时随手关掉恢复本地上网。
- 需要同时访问本地打印机等,加
--exit-node-allow-lan-access。
tailscale up --advertise-exit-node # 然后到管理后台同样「批准」这个出口节点
# 全部流量走指定出口机 tailscale up --exit-node=100.x.x.x --exit-node-allow-lan-access # 取消,恢复本地直连上网 tailscale up --exit-node=
把内网 Web 服务安全地暴露出来#
自建了 Jellyfin、NAS 面板、监控大盘、个人 dashboard,想在手机 / 别的设备上访问,又不想开端口、不想折腾反向代理和证书。
- 只给自己看 → 用
tailscale serve:仅 tailnet 内可访问,自动 HTTPS。 - 要公网分享 → 用
tailscale funnel:临时把服务开到公网,用完关掉。 - 敏感服务永远优先 serve;funnel 只给确实要外部访问的东西。
# 把本机 3000 端口的服务,以 https 发布到 tailnet tailscale serve --bg 3000 # 查看/关闭 tailscale serve status tailscale serve --https=443 off
tailscale funnel 3000 # 会给你一个 https://机器名.your-tailnet.ts.net 的公网地址
安全加固 —— 别裸奔(最重要)#
社区讨论度最高的话题。Tailscale 默认配置很宽松(全网互通),一台设备沦陷就等于整张网沦陷。下面每一项都值得做。
① ACL 改成"默认拒绝",按需放行
给设备打 tag(tag:server / tag:laptop),按 tag 授权而不是按人。笔记本丢了只吊销一个 tag。
{
"tagOwners": {
"tag:server": ["autogroup:admin"],
"tag:laptop": ["autogroup:admin"]
},
"acls": [
// 笔记本只能连服务器的 SSH/RDP/VNC 端口
{ "action":"accept", "src":["tag:laptop"],
"dst":["tag:server:22,3389,5900"] },
// 每个人都能访问「自己的」设备
{ "action":"accept", "src":["autogroup:member"],
"dst":["autogroup:self:*"] }
],
"ssh": [
// SSH 到服务器,非 root 直接放行,root 需二次确认
{ "action":"check", "src":["autogroup:member"],
"dst":["tag:server"], "users":["autogroup:nonroot","root"] }
]
}② 其余关键开关
| 项目 | 为什么 | 怎么做 |
|---|---|---|
| 新设备手动批准 | 防止陌生设备偷偷入网 | 后台 Settings → Device approval 打开 |
| Tailnet Lock | 即便协调服务器被攻破,没有你签名的新节点也进不来 | tailscale lock init 后签名各节点 |
| 密钥过期 | 定期强制重新认证,降低长期密钥泄露风险 | 后台按设备设置;服务器用一次性 auth key |
| SSH 只绑 tailnet | 公网彻底看不到 22 端口 | 见 第 01 节 + 防火墙只放行 tailscale0 |
tailscale lock init # 初始化(会给出信任密钥) tailscale lock status # 看哪些节点待签名 tailscale lock sign <node-key>
想完全自主可控:Headscale#
不想把设备拓扑托管给 Tailscale 官方,或要完全离线/内网自主运行控制面。
- 用开源 juanfont/headscale(⭐41k+)自建协调服务器,客户端仍用官方 Tailscale App。
- 配 Web 面板
headscale-ui/headplane管理。 - 代价:协调服务器的可用性要自己保障(挂了新设备连不上,已直连的不受影响)。
# Docker 起 headscale,详见官方文档 docker run -d --name headscale -v ./config:/etc/headscale \ -p 8080:8080 headscale/headscale:latest headscale serve # 创建用户 + 生成注册密钥 headscale users create myuser headscale preauthkeys create --user myuser --reusable
tailscale up --login-server=https://headscale.example.com \ --authkey=<上一步的key>
一套"远程办公"参考架构#
把上面的能力拼起来,这是社区里很常见、也很好用的一套配置(占位示例,按自己情况替换)。
台式机/主机常开,挂 tailnet。出门用屏幕共享随时进(第 02 节)。
在路上的主力,打 tag:laptop,只被授权连服务器必要端口。
兼任 Subnet Router,把家里整个内网引进来(第 03 节)。
其中一台当 Exit Node,出差时全流量走它出口(第 04 节)。
排障速查#
登录时浏览器不弹出授权页(macOS 独立版常见)
官网独立版靠网络扩展跑后端。macOS 大版本更新后,扩展经常被打回禁用状态,后端不运行 → 生成不了授权 URL → 浏览器自然不弹。
- 检查扩展状态:
systemextensionsctl list | grep tailscale—— 正常应是[activated enabled],若显示[activated disabled]就是它。 - 去 系统设置 → 通用 → 登录项与扩展 → 网络扩展,把 Tailscale 重新打开(需管理员授权)。
- 兜底:终端手动拿链接自己复制到浏览器打开 ——
/Applications/Tailscale.app/Contents/MacOS/tailscale login
怀疑走了慢速中继?看走的是直连还是 relay
tailscale ping myserver # "via 10.x/直连IP ... direct" = 点对点直连(快) # "via DERP(xxx)" = 走中继(慢,通常是 NAT 打不穿) tailscale netcheck # 看 UDP 是否可用、NAT 类型;MappingVariesByDestIP: false = 打洞友好
常见问题#
Tailscale 会不会很卡 / 走中继延迟高?
优先级是 局域网直连 > 公网 P2P 直连 > 中继。绝大多数情况能直连,延迟就是真实网络距离。只有两端 NAT 都打不穿才落中继,而且你还能自建更近的中继降低延迟。
在家两台机走 Tailscale,会绕一圈公网吗?
不会。同网段自动 LAN 直连,tailscale ping 会显示 direct 且走的是 10.x 内网地址。
和传统 VPN 有啥区别?
传统 VPN 是"所有人连到一个中心网关"(星型,中心是瓶颈);Tailscale 是点对点网状,设备之间直连,没有中心瓶颈,单点故障也不影响已建立的连接。
免费额度够个人用吗?
个人版够绝大多数家庭/个人场景(设备数、用户数上限都很宽)。介意依赖官方就上 Headscale 自托管(第 07 节)。