安装
在 macOS、Linux 和 Windows 上安装 TSLink,并验证发布产物。
前置要求
你需要一个 Tailscale 账户,并启用 MagicDNS 和 HTTPS。私有访问的接收设备需要 Tailscale 和相应策略权限。应用主机使用 TSLink 内嵌的 Tailscale 节点,无需另装 Tailscale daemon。首次私有分享不必存储 API 令牌或 OAuth 客户端凭据。macOS 主机需要 macOS 13 Ventura 或更高版本:自 v0.1.1 起使用 Go 1.27 构建,已不再支持 macOS 12 Monterey 及更早版本(见平台指南)。
macOS(Homebrew)
brew install --cask anydoor7/tap/tslinkmacOS 二进制使用 Developer ID 证书签名,并经 Apple 公证。首次运行需要联网查询公证凭证。
Linux
Linux 上的 Homebrew 使用同一条命令:
brew install --cask anydoor7/tap/tslink也可以从 v0.1.1 发布页选择适合 amd64 或 arm64 的 .deb、.rpm 或 tslink_0.1.1_linux_<arch>.tar.gz。软件包通过系统包管理器安装;归档解压后,将 tslink 放入 PATH 包含的目录。
Windows
从 v0.1.1 发布页下载 tslink_0.1.1_windows_amd64.zip 或 tslink_0.1.1_windows_arm64.zip。解压后,将 tslink.exe 所在目录加入用户 PATH,然后运行:
tslink installTSLink 随用户登录启动。zip 没有 Authenticode 签名,请按下方步骤通过已签名的校验和与 attestations 验证。
从源码构建
源码构建需要 Git 和 Go 1.27.1+。下方命令适用于 bash/zsh;各平台 shell 的步骤见平台指南。
git clone https://github.com/anydoor7/tslink.git
cd tslink
go install .
export PATH="$PATH:$(go env GOPATH)/bin"使用 PowerShell 时,在系统设置中将 $(go env GOPATH)\bin 加入用户 PATH。
验证发布产物
按发布验证命令操作,将 version 设为 v0.1.1,并填写所下载产物的准确文件名。需要支持 gh attestation verify 的 gh 2.49+、支持 verify-blob --bundle 的 cosign,以及 sha256sum 或 shasum。
下载所选产物、checksums.txt 和 checksums.txt.sigstore.json。先将产物的 SHA-256 与 checksums.txt 中对应项比较,再验证该校验和文件的 Sigstore bundle,最后验证产物的 GitHub attestation。验证固定以下四个值:
- OIDC issuer:
https://token.actions.githubusercontent.com - Workflow 身份:
https://github.com/anydoor7/tslink/.github/workflows/release.yml@refs/tags/v0.1.1 - 源码 ref:
refs/tags/v0.1.1 - Signer workflow:
github.com/anydoor7/tslink/.github/workflows/release.yml
归档的 SBOM sidecar 有独立的校验和、bundle 和 attestation,需要按同一指南单独验证。
验证安装
tslink --version
tslink --help第一条命令显示已安装版本,第二条列出命令帮助。
升级
使用 Homebrew 时,先升级 cask:
brew upgrade --cask tslink如果 TSLink 作为后台服务运行:
tslink install这会把服务的可执行文件路径更新到新版本。归档、Windows zip 或 Linux 软件包也应先替换或升级二进制,再按需运行 tslink install 更新后台服务。随后检查 tslink --version 和 tslink status --json。
认证
TSLink 有两档凭据。Tier 1 是默认档,不需要存储 API 凭据;注册与审批仍受 tailnet 策略约束。
Tier 1 — 交互式入网(默认)
无需执行存储凭据的 tslink login 命令即可分享;首次节点注册仍须完成浏览器登录。
tslink share ./build节点第一次需要加入 tailnet 时,TSLink 打印一个 Tailscale 授权 URL 然后退出。打开它、批准这个节点,再执行 tslink url <name> --wait 取实际可用的 URL。在 --json 模式下同样的信息以一条结构化记录返回,脚本或 agent 读一个字段就行,不用解析散文:
{"type":"tslink.result","ok":true,"schema_version":1,"command":"share","code":0,"data":{"status":"needs_login","auth_url":"https://login.tailscale.com/a/..."}}这样入网的节点归你所有、不打标签。注册、审批、访问及节点密钥过期受 tailnet 策略约束;策略使密钥过期时可能需要重新授权。授权交接及就绪步骤见快速开始。
Tier 2 — 存储凭据(可选)
存储凭据支持带标签的节点认证,但标签所有权和策略权限仍需满足,普通 ACL 自动化要求显式 --manage-acl。远端陈旧设备清理要求精确所有权证明及设备权限。带标签身份的节点密钥过期行为与 API-token 过期不同,见标签配置;存储凭据本身不证明配置成功。
tslink login它会显示一个选择菜单 — 选择 [1] API 访问令牌 或 [2] OAuth 客户端密钥,并提供分步引导。
普通 tskey-api-* API 访问令牌具有完整的 Tailscale API 权限;包括 OAuth client 在内的 trust credentials 支持按 scope 授权。2026 年 10 月 6 日根据 Tailscale API 官方文档核实。除非你确实需要 Tier 2 提供的能力,否则优先用 Tier 1。
选择哪种密钥类型?
| 密钥类型 | 前缀 | 有效期 | 工作方式 | 适用场景 |
|---|---|---|---|---|
| API 访问令牌 | tskey-api-* | 会周期性过期 | 派生短期、单次使用的认证密钥;节点是否临时取决于服务的 --ephemeral 标志 | 验证权限后的所需 REST 自动化 |
| OAuth 客户端密钥 | tskey-client-* | 不会周期性过期 | tsnet 直接使用;当前 REST 标签/设备自动化更窄 | 验证所需操作后的长期运行场景 |
API 访问令牌在 管理后台 → Keys 生成。OAuth 客户端密钥在 管理后台 → OAuth 生成 — 点击 "+ credential" → "OAuth client" → 按所需 API 操作配置 scopes → 复制下方的 client secret(不是上方较短的 client ID)。
凭证存储
TSLink 使用系统钥匙串安全存储你的凭证:
| 平台 | 后端 |
|---|---|
| macOS | 钥匙串(Keychain) |
| Linux | Secret Service(GNOME Keyring / KWallet) |
| Windows | 凭据管理器(Credential Manager) |
凭据优先使用系统钥匙串(macOS Keychain、Linux Secret Service、Windows Credential Manager)。明文 0600 文件回退仅在 macOS/Linux 证明旧钥匙串值不存在或已删除后允许;钥匙串不可达或状态不确定时拒绝写入,应恢复访问后重试。Windows 不允许凭据文件回退。无头运行本身不保证可以回退。
| 文件 | 内容 |
|---|---|
apikey | API 访问令牌 |
clientsecret | OAuth 客户端密钥 |
authkey | 旧版认证密钥 |
非交互式设置
如果无法打开浏览器(如无头服务器),请从 secret manager 注入凭证到 stdin 或环境变量:
printf %s "$TSLINK_API_KEY" | tslink login --api-key-stdin
printf %s "$TSLINK_CLIENT_SECRET" | tslink login --client-secret-stdin也可以使用由 secret manager 注入的环境变量:
TSLINK_API_KEY="$TSLINK_API_KEY" tslink login
TSLINK_CLIENT_SECRET="$TSLINK_CLIENT_SECRET" tslink login兼容性 argv flags 和旧版凭证文件仍可能被 TSLink 读取,但官方自动化说明不应把 secret 放进 argv、shell history 或手动写入的 credential files。
登录时自动启动
默认 add/share 会处理后台运行设置。如需显式登记或更新登录自启动,运行:
tslink install在 ~/Library/LaunchAgents/com.tslink.daemon.plist 创建 LaunchAgent,启用 KeepAlive。TSLink 在用户登录时启动,停在开机登录窗口时不会启动;agent 仍安装时,崩溃或手动停止后都会重新拉起。
检查 tslink status --json 的 data.supervision.autostart_scope,以实际观察到的登录/开机范围为准;unknown 不能证明无需登录即可开机运行。入网/审批和服务就绪与自启动是不同状态。
移除自启动:
tslink uninstallWindows uninstall 先禁用并停止其 owned task/supervisor,再删除任务;Startup-only fallback 留下的当前进程需另行执行 tslink stop。macOS/Linux 会尝试停止受管理任务,但错误或无法确认移除的警告需先解决。停止共享或维护前,按确认停机检查状态再继续。
自定义控制服务器(Headscale)
Tailscale API 派生的节点 auth key 不能发给非 Tailscale control server,会以 credential_control_url_mismatch 拒绝。自定义控制服务器的入网及 HTTPS 支持须另行验证;端到端 Headscale 验证仍待完成。
如果你使用 Headscale 或其他自定义控制服务器:
# 全局设置,适用于所有服务
tslink config set control-url https://headscale.example.com此设置持久化在 ~/.config/tslink/config.json 中,适用于所有服务。如果网关已在运行,全局设置变更需按重启流程恢复运行后生效。
你也可以为单个服务覆盖控制服务器:
# 按服务覆盖
tslink add my-service --proxy localhost:3000 --control-url https://headscale.example.comDocker 集成
Docker 标签发现属于 roadmap/experimental。Launch-candidate 流程请用 tslink add 显式注册容器背后的服务。
配置目录
默认本地配置和运行时文件位于 ~/.config/tslink/,主要存储凭据位于系统钥匙串。TSLINK_CONFIG_DIR 可选择其它本地目录,须与网关/监督程序环境一致。
~/.config/tslink/
├── registry.json # 服务注册表
├── config.json # 全局配置(control-url)
├── tslink.pid # 守护进程 PID
├── apikey # API 密钥(文件回退)
├── clientsecret # OAuth 密钥(文件回退)
├── authkey # 旧版认证密钥
├── nodes/ # 每个服务的 tsnet 状态
└── logs/ # 守护进程和访问日志下一步
TSLink 可执行文件可用后,按快速开始注册首个服务、完成可能的入网授权并等待就绪。存储凭据是可选项。