Tailscale 私有网络(tailnet)组网教程
1. 这是什么(先澄清概念)
Tailscale 不是传统 VPN,而是基于 WireGuard 的零配置网状 VPN(mesh overlay network)。安装客户端后,设备通过 Tailscale 协调服务器(control plane)交换公钥与路由,彼此建立点对点(P2P)加密隧道,组成一个只属于你的私有网络,称为 tailnet。
关键概念:
- tailnet:你的私有网络。每台加入的设备获得一个稳定的
100.x.y.z地址和 MagicDNS 主机名(形如host.yourname.ts.net)。 - 控制面 vs 数据面:协调服务器只负责分发密钥与路由表,不经手业务流量;数据走设备间 WireGuard 直连。NAT 穿透失败时,流量经 DERP 中继(仍端到端加密,只是绕路)。
- 开源边界:Tailscale 客户端开源(BSD-3),但协调服务器是闭源 SaaS。若需完全自托管,用 Headscale(开源控制面,见第 9 节)。
- 与 ZeroTier / 传统 VPN 的区别:无需公网 IP、无需手动配端口转发;默认 P2P 直连,延迟低;控制面托管使「加设备」像装 App 一样简单。
> 适用触发词:内网穿透、远程访问家里/服务器、组私有网络、mesh VPN、Tailscale、ZeroTier 替代、不开端口访问设备、Headscale 自建。
2. 前置要求
- 官方 SaaS 方案:一个 SSO 账号(Google / GitHub / Microsoft / Apple)。个人版免费额度较高(2026 年约 100 台设备、3 名用户,具体以 tailscale.com/pricing 为准)。
- 自建方案(Headscale):一台有公网 IP 的服务器(1 核 512M 即可),用于跑控制面。
- 被管理的设备需能联网并完成一次性身份认证。
3. 安装客户端
Linux(最常用,含服务器/树莓派/NAS)
# 官方一键脚本(Ubuntu/Debian/RHEL/CentOS/Fedora/openSUSE/Amazon Linux 等通用)
curl -fsSL https://tailscale.com/install.sh | sh
# 安装后启动并认证(会输出一个登录 URL,浏览器打开登录即可)
sudo tailscale up
不想用 curl | sh 时,可用发行版 apt 源(Debian/Ubuntu 示例):
sudo apt-get install -y curl gnupg
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | \
sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg > /dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list | \
sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt-get update && sudo apt-get install -y tailscale
sudo tailscale up
静态二进制(其他架构):从 pkgs.tailscale.com/stable/#static 下载,解压后 sudo tailscaled --state=tailscaled.state 启动守护进程,再 sudo tailscale up。
macOS / Windows / 移动端
- macOS:App Store 安装 Tailscale,或
brew install tailscale(CLI 工具);GUI 登录即加入。 - Windows:从
tailscale.com/download/windows下载安装包,运行后登录。注意 Windows 防火墙可能把 Tailscale 虚拟网卡归为「公用网络」而拦截,需将其设为专用或放行入站规则。 - Android / iOS:应用商店安装 Tailscale App,登录同一账号即可。
- Apple TV:可作为 exit node 使用(见第 5 节)。
Docker(把容器直接接入 tailnet)
常见两种模式:官方 tailscale/tailscale 镜像作为 sidecar,或用 tsdproxy / docktail 自动代理。最小 sidecar 思路:在同一 pod/compose 网络里起一个 Tailscale 容器,用 --advertise-routes 或 TS_AUTHKEY 把主容器暴露进 tailnet。
4. 基础使用(连起来就能用)
tailscale status # 查看 tailnet 内所有节点、IP、在线状态
tailscale ip -4 # 查看本机在 tailnet 中的 IPv4 地址
tailscale ping <host> # 测试到某节点的连通性(host 可为 IP 或 MagicDNS 名)
tailscale netcheck # 诊断:是否 P2P 直连、走了哪个 DERP 中继
- MagicDNS:默认开启。可直接用
ping host.yourname.ts.net访问设备,无需记 IP。 - Tailscale SSH(强烈推荐替代暴露 22 端口):
tailscale set --ssh在本机开启,之后tailscale ssh user@host即可,无需开放公网 22。 - 服务器免密钥过期:长期在线的服务器(NAS、树莓派、Docker 主机)可在控制台 Machines 页对该设备「Disable key expiry」,避免定期重认证断连(有安全风险,仅限可信设备)。
- 重认证:
sudo tailscale up --force-reauth;断开:tailscale down。
5. Exit Node(出口节点:让流量走某台设备的公网)
场景:在咖啡店/酒店等不可信 Wi‑Fi 上,让手机/笔记本的所有流量经你家里的宽带出口出去(相当于私人 VPN 出口)。
- 在被选作出口的机器上通告(如家里一台常开 Linux):
bash
sudo tailscale up --advertise-exit-node
-
控制台批准:Machines 页找到该设备 → 菜单 → Edit exit node → Use as exit node(若在策略
autoApprovers中授权则自动批准)。 -
客户端使用:
bash
# 指定走某出口节点
sudo tailscale up --exit-node=<出口机MagicDNS名或IP>
# 或运行中切换:tailscale set --exit-node=<出口机>
# 允许同时使用出口节点时仍能访问本地 LAN(如打印机)
sudo tailscale set --exit-node-allow-lan-access
- ACL 授权(若用自定义策略):需有一条
dst为autogroup:internet的 grant/ACL 允许该用户使用出口。 - 停止:客户端选 Exit Node = None。
> 进阶:可用 patte/fly-tailscale-exit 在 fly.io 上部署全球分布的出口节点。
6. Subnet Router(子网路由:让 tailnet 访问没装客户端的局域网设备)
场景:访问家里打印机、路由器管理页、或无法安装客户端的老旧设备(这些设备本身不装 Tailscale,但和某台已装 Tailscale 的机器在同一局域网)。
- 在局域网内一台 Linux 上启用 IP 转发:
bash
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
- 通告要暴露的子网(改成你真实的网段):
bash
sudo tailscale set --advertise-routes=192.168.1.0/24
-
控制台批准路由:Machines → 该设备 → Subnets → Edit → 勾选路由 → Save(用
autoApprovers.routes可免手动批准)。 -
客户端接受路由:
bash
sudo tailscale set --accept-routes # Linux 需手动;macOS/Win/iOS/Android 自动获取
- 若节点用 firewalld,需允许伪装:
sudo firewall-cmd --permanent --add-masquerade。
7. ACL 与标签(零信任访问控制)
Tailscale 默认是 allow-all(同 tailnet 内互通)。生产/多人环境应改为最小权限:
- 策略文件在控制台 Access controls 页,采用 huJSON(带注释的 JSON)语法,deny-by-default。
- 新配置推荐用 grants 语法;旧 acls 语法永久可用。
最小示例(仅允许 admin 组 SSH/HTTPS 访问被打 tag:server 的机器):
{
"groups": {
"group:admin": ["alice@example.com"]
},
"hosts": {
"server": "100.64.1.2"
},
"tagOwners": {
"tag:server": ["group:admin"]
},
"acls": [
{
"action": "accept",
"src": ["group:admin"],
"dst": ["tag:server:22", "tag:server:443"]
}
]
}
- 标签(tags):让服务器/容器以「标签身份」而非「用户身份」加入网络,配合 authkey(认证密钥)实现无人值守自动入网(适合 Ansible/CI 批量部署,参考
joshrnoll/tailscale-info)。 - 想彻底关掉互通:把
acls设为空数组(deny-all)。 - ACL 仅作用于 tailnet 内流量,不影响设备访问其本地局域网。
8. 设备共享(Node Sharing)
把单台设备分享给外部用户或另一个 tailnet,而不必让对方加入你的整个网络——适合临时给朋友/客户访问某台机器。控制台 Machines → 目标设备 → Share,生成邀请链接即可。
9. Headscale 自建(完全自托管控制面,不用 Tailscale SaaS)
当你需要数据控制面完全自建(隐私/合规/无设备数限制)时,用 Headscale 替代 Tailscale 闭源协调服务器,客户端仍用官方 Tailscale。
- 仓库:
github.com/juanfont/headscale(44k+ ⭐),文档headscale.net/stable。 - Web 管理 UI(任选):
tale/headplane、gurucomputing/headscale-ui、GoodiesHQ/headscale-admin。
部署要点(以二进制为例,命令以当前文档为准):
# 1) 下载并运行 headscale(从 GitHub Releases 取二进制,或 docker 运行)
# 配置文件 config.yaml 需设置 server_url / listen_addr / private_key 等
# 2) 创建用户(命名空间)
headscale users create myuser
# 3) 生成可复用的预授权密钥(用于客户端一键加入)
headscale preauthkeys create --user myuser --reusable --expiration 24h
# 4) 客户端加入自建网络(把 URL 换成你的 headscale 地址)
sudo tailscale up --login-server https://hs.yourdomain.com:8080 --accept-routes
> 注意:Headscale 官方不建议用反向代理/容器跑;社区常用 Docker + 直连端口。自建后 Exit Node、Subnet Router、ACL 等用法与官方完全一致,只是控制面在你自己手里。
10. 常用命令速查
| 命令 | 作用 |
|---|---|
sudo tailscale up |
启动并认证加入 tailnet |
tailscale status |
列出节点、IP、在线状态 |
tailscale ip -4 |
本机 tailnet IPv4 |
tailscale ping <host> |
测试连通 |
tailscale netcheck |
诊断 P2P / DERP 中继 |
tailscale set --ssh |
开启 Tailscale SSH |
tailscale set --accept-routes |
接受子网路由 |
tailscale set --advertise-routes=10.0.0.0/24 |
通告子网路由 |
sudo tailscale up --advertise-exit-node |
通告为出口节点 |
sudo tailscale up --exit-node=<host> |
使用某出口节点 |
sudo tailscale up --force-reauth |
强制重新认证 |
tailscale down |
断开 tailnet |
sudo systemctl status tailscaled |
查看守护进程状态 |
sudo modprobe tun |
缺 tun 内核模块时手动加载 |
11. 排障
- tun 模块缺失:
sudo modprobe tun;开机自启写入/etc/modules或/etc/modules-load.d/tun.conf。 - 连接慢/绕路:
tailscale netcheck查看是否走了 DERP 中继(NAT 类型严格时会中继,属正常)。 - Windows 连通但访问不了服务:检查 Tailscale 虚拟网卡是否被防火墙归为「公用网络」,放行对应入站规则。
- 关日志减少元数据上报:编辑
/etc/default/tailscaled加TS_NO_LOGS_NO_SUPPORT=true(会失去官方技术支持)。 - 完整排查指南见
tailscale.com/docs/reference/troubleshooting。
12. 安全与合规
- 免费/付费额度与功能随官网调整,以
tailscale.com/pricing为准。 - 业务流量 P2P 端到端加密;控制面只转发元数据(节点列表、路由),不接触明文。
- 服务器「Disable key expiry」会降低安全性,仅限可信设备,设备丢失立即吊销密钥。
- 用 Tailscale SSH 替代把 22 端口暴露在公网;ACL 遵循最小权限/零信任。
- 合规/隐私敏感场景优先 Headscale 自建,使控制面数据不出自有服务器。
13. GitHub 资源池(本教程蒸馏来源)
| 仓库 | Stars | 用途 |
|---|---|---|
tailscale/tailscale |
~38k | 官方客户端源码、文档与 CLI |
juanfont/headscale |
~45k | 开源 Tailscale 控制面(自托管) |
tailscale/tailscale-android |
~2.7k | 官方 Android 客户端 |
tailscale/tailscale-rs |
~1.2k | Rust 实现(实验性) |
tailscale/tailcat |
~8.4k | 基于 Tailscale 数据面的 netcat |
tailscale/golink |
~2k | tailnet 内私有短链服务 |
tailscale-dev/ScaleTail |
~2.1k | 120+ 自托管应用的 Docker Compose 栈(集成 Tailscale) |
SierraSoftworks/tailscale-unifi |
~1.8k | 在 UniFi OS 设备上跑 Tailscale |
almeidapaulopt/tsdproxy |
~1.7k | Docker 容器自动 Tailscale 反代 |
marvinvr/docktail |
~1.3k | 用标签把 Docker 容器暴露为 Tailscale 服务 |
patte/fly-tailscale-exit |
~1.7k | 在 fly.io 部署全球出口节点 |
adyanth/openwrt-tailscale-enabler |
~1.5k | 低功耗 OpenWRT 设备接入 Tailscale |
Adversis/tailsnitch |
~1.1k | Tailscale 配置安全审计工具 |
tale/headplane |
~3.2k | Headscale 功能完整 Web UI |
anderspitman/awesome-tunneling |
~22k | 隧道/内网穿透工具大全(含 Tailscale 与替代方案) |
EasyTier/EasyTier、gravitl/netmaker、slackhq/nebula、zerotier/ZeroTierOne、netbirdio/netbird |
— | 同类开源 mesh/overlay 组网替代(自建优先参考) |
社区实战示例(教程类):joshrnoll/tailscale-info(Ansible 批量入网 + OAuth/标签)、Mario-CyberS/Tailscale-RDP-Setup-From-Mac-to-Windows(Mac 远程 Windows RDP)、bruhismyname/vibecoding-ultimate-starter(VPS+笔记本组私有网)。
14. 官方参考文档(仅官方域名)
- 快速上手:
tailscale.com/docs/how-to/quickstart - Linux 安装:
tailscale.com/kb/1031/install-linux - Exit Node:
tailscale.com/kb/1103/exit-nodes - Subnet Router:
tailscale.com/kb/1019/subnets - ACL:
tailscale.com/kb/1018/acls、策略文件语法tailscale.com/docs/reference/syntax/policy-file - Tailscale SSH:
tailscale.com/docs/features/tailscale-ssh - 排障:
tailscale.com/docs/reference/troubleshooting - Headscale:
headscale.net/stable、github.com/juanfont/headscale