SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Ubuntu上Tailscale安装错误怎么修复

Ubuntu 上 Tailscale 安装失败多为 apt 错误。先查看状态码和完整 URL,再修复发行版代号、软件源路径或签名密钥环,避免盲目重装。

为什么 Ubuntu 上的 Tailscale 安装错误实际上是 apt 错误

Ubuntu 上的 Tailscale 安装错误几乎总是在任何 Tailscale 代码运行前发生。它们属于 apt 错误。Ubuntu 的软件包归档中没有 tailscale 软件包:根据 2026 年 10 月对 Ubuntu 软件包归档的检查,唯一匹配项是 Go 辅助库和 python3-tailscale。因此,守护进程通常来自 Tailscale 自己的 apt 软件仓库,即 pkgs.tailscale.com。Canonical 也维护一个 Tailscale snap,本文末尾的其他备用方案会介绍它。

添加该软件仓库会写入两个文件。一个文件告诉 apt 软件包所在的位置。另一个文件保存公钥,供 apt 检查软件仓库索引的签名。下面几乎所有故障,都是这两个文件之一配置错误,或者 apt 与软件仓库之间的设备拒绝了请求。

以下是 Tailscale 为 Ubuntu 24.04 发布的命令:

sudo mkdir -p --mode=0755 /usr/share/keyrings
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 tailscale

noble 是 Ubuntu 24.04 的代号,并且会出现在两个 URL 中。第二条命令会向 /etc/apt/sources.list.d/tailscale.list 写入一行注释和一行 deb,而 cat 会准确显示写入该文件的内容。

cat /etc/apt/sources.list.d/tailscale.list

将该 deb 行理解为由 4 个字段组成的地址:方括号中的选项 [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg],然后是软件仓库的基础地址,即通过 https 访问的 pkgs.tailscale.com/stable/ubuntu,接着是套件 noble,最后是组件 main。apt 会将基础地址和套件拼接成一个 URL,然后获取该 URL:https://pkgs.tailscale.com/stable/ubuntu/dists/noble/InRelease。如果可以手动获取该 URL,apt 也可以获取它。这就是完整的诊断方法。

阅读 apt 错误后再进行修改

单独运行更新命令,避免其他输出将错误内容滚过。

sudo apt update

第三方软件源失败时会显示为下方形式。您机器上的代号和 IP 地址会不同。

E: Failed to fetch https://pkgs.tailscale.com/stable/ubuntu/dists/wilma/InRelease  404  Not Found [IP: 203.0.113.9 443]
E: Some index files failed to download. They have been ignored, or old ones used instead.

该输出中的两项内容决定下一步操作:状态码,以及 E: Failed to fetch 行中的完整 URL。不要根据底部的摘要行猜测原因。复制该 URL,然后直接向服务器发起请求。

curl -sS -o /dev/null -w '%{http_code}\n' https://pkgs.tailscale.com/stable/ubuntu/dists/noble/InRelease

对于 Tailscale 发布的代号,该命令会输出 200。截至 2026 年 10 月检查时,noble 会返回一个包含 Origin: Tailscale 和 Codename: noble 的签名索引。将 noble 替换为您自己的错误信息中的代号,然后重新运行命令。如果 apt 获取索引时出现 fetch 错误,而 curl 获取到 200,则说明软件源可访问,问题出在 apt 自身的配置中。不过,200 只能证明下载成功:apt 下载索引后仍会验证其签名;如果密钥存在问题,验证会失败。下面的密钥环部分将介绍此问题。

状态码说明了什么

  • 404 Not Found 表示仓库在该路径下没有文件。在 pkgs.tailscale.com 中,这几乎总是 URL 中的代号。
  • 403 Forbidden 表示有设备返回了响应,但拒绝了请求。截至 2026 年 10 月,该仓库对不存在的路径返回 404,因此 403 通常指向位于您的服务器与 Tailscale 之间的代理、过滤设备或防火墙。但并非总是如此:pkgs.tailscale.com 通过 Amazon CloudFront 提供服务,AWS 也说明 CloudFront 分配可以从自身返回 403,例如由防火墙规则或源服务器导致。
  • 407 Proxy Authentication Required 表示代理要求凭据,而 apt 没有发送凭据。401 Unauthorized 则不同:它是针对请求资源本身的凭据质询,通过 WWW-Authenticate 标头发送,单凭该状态码无法确定请求经过了代理。此仓库无需凭据即可提供文件,因此 401 通常表示该 URL 的响应来自其他设备,例如拦截网关。代理部分的调试命令会显示 apt 实际连接到的主机。
  • 连接错误或名称解析错误表示根本没有发生 HTTP 通信。请跳转到 IPv6 部分。

URL 中的代号不是 Tailscale 发布的代号

Tailscale 会为每个 Ubuntu 代号建立单独的目录。请求不存在的代号时会返回 404,因为服务器上没有可提供的 dists/<codename>。供应商在 pkgs.tailscale.com/stable 提供的目录列出了现有代号。2026 年 10 月,该列表从 16.04 延续到 resolute,也就是 Ubuntu 26.04。

错误代号通常来自在基于 Ubuntu 但并非 Ubuntu 的发行版上运行 lsb_release -cs。在 Linux Mint 22 上,该命令会输出 wilma,这是 Mint 自己的代号,Tailscale 不会发布该代号的软件包。请改为读取 Ubuntu 基础版本。

. /etc/os-release
echo "$VERSION_CODENAME $UBUNTU_CODENAME"

在 Ubuntu 上,这两个值相同。在衍生发行版上,VERSION_CODENAME 是衍生发行版的名称,UBUNTU_CODENAME 是其所基于的 Ubuntu 版本。在两个 URL 中都使用 UBUNTU_CODENAME。

第二种情况是发行版升级。Ubuntu 升级工具运行时会禁用第三方软件源。因此,在将 Ubuntu 24.04 升级到 26.04后,您会发现 /etc/apt/sources.list.d/tailscale.list 要么已被注释掉,要么仍然使用 noble,但此时系统已经是 resolute。请重新运行两个 curl 命令,并使用新的代号。命令会覆盖这两个文件。如果升级过程在中途停止,导致 dpkg 报告存在未完全配置的软件包,而不只是该软件源有问题,请先恢复失败的发行版升级。因为只修复 tailscale.list 无法解决 apt 无法完成配置的问题。

第三种情况是时机问题。如果您在新的 Ubuntu 版本发布后、Tailscale 添加其代号之前安装,就会得到相同的 404。这个时间窗口通常很短,有时甚至不存在:Tailscale 关于 Ubuntu 24.04 安装支持的跟踪问题在 2024 年 1 月已标记为完成,距该版本发布还有数月。如果确实遇到这种情况,通常可以将文件指向上一个 LTS 版本的代号来完成安装,因为这些软件包的依赖项很少。但这样运行的是为旧版本构建的软件包。请使用 apt policy tailscale 检查实际安装的版本,并在正式代号出现后将文件改回去。

密钥环为空,而写入它的命令没有输出任何内容

这一类问题通常没有明显提示,也是最常见的结果。再次查看密钥环命令:

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null

shell 会在两个程序运行前先构建整个管道,因此 sudo tee 会立即打开密钥环路径,并将其截断为 0 字节。如果 curl 随后失败,并且 -f 使其在任何 HTTP 错误时失败,curl 就不会写入任何内容并以非零状态退出。文件会保持为 0 字节。管道的退出状态是最后一个命令的状态,也就是 tee 的状态;该命令成功退出。终端没有输出,你继续执行下一个命令,以为密钥已经安装。

检查文件,不要只检查生成它的命令。

ls -l /usr/share/keyrings/tailscale-archive-keyring.gpg
gpg --show-keys /usr/share/keyrings/tailscale-archive-keyring.gpg

正常的密钥环会输出一行 pub 和一行包含 Tailscale 名称的 uid。0 字节文件只会输出 gpg: no valid OpenPGP data found.,不会输出其他内容。捕获了 HTML 错误页面的文件也会输出相同结果;对它运行 head -c 80 时,会看到网页开头,而不是二进制密钥数据。

如果密钥环中没有可用密钥,sudo apt update 会下载索引,然后拒绝该索引。你会看到一行 W: GPG error,其中包含 Tailscale 软件仓库及其套件名称;下一行是 The following signatures couldn't be verified because the public key is not available: NO_PUBKEY,后面跟着 16 位密钥 ID;再下面会显示仓库未签名的错误。注意 apt 提供的信息:它已成功下载索引,但无法检查签名。这是密钥问题,不是网络问题。如果密钥环文件完全不存在,错误消息又会不同,并通过 Could not open file /usr/share/keyrings/tailscale-archive-keyring.gpg 直接指出文件路径。

分两步写入密钥,这样下载失败就不会破坏正常的密钥环。

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg -o /tmp/tailscale.gpg
gpg --show-keys /tmp/tailscale.gpg
sudo install -m 0644 -o root -g root /tmp/tailscale.gpg /usr/share/keyrings/tailscale-archive-keyring.gpg

中间那一行是检查关卡:如果没有输出包含 Tailscale 的 uid,就停止,不要复制该文件。0644 模式很重要,因为 apt 会降权为非特权的 _apt 用户来下载和验证,因此只有 root 可读的密钥环无法供 apt 使用。

.list 文件和 .sources 文件描述的是同一个软件源

Ubuntu 在 Ubuntu 24.04 LTS 中将自有软件源迁移到了 deb822 格式,其中 /etc/apt/sources.list 变为 /etc/apt/sources.list.d/ubuntu.sources。Tailscale 仍发布单行格式的软件源文件。截至 2026 年 10 月检查时,pkgs.tailscale.com 上没有可下载的 .sources 文件:该 URL 返回 404。因此,如果系统中存在 tailscale.sources,说明这是您或某份指南手动创建的;如果 tailscale.list 也仍然存在,apt 现在就会重复描述同一个软件源。

较轻的情况是在每次更新时显示警告:

W: Target Packages (main/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list.d/tailscale.list:1 and /etc/apt/sources.list.d/tailscale.sources:1

严重的情况发生在两个文件指定了不同的密钥环路径时,因为 apt 无法确定哪个密钥控制该软件源。它会输出 E: Conflicting values set for option Signed-By regarding source,随后输出软件源及其套件名称,再输出由 != 分隔的两个密钥环路径,最后拒绝继续执行:

E: The list of sources could not be read.

这种错误会阻止所有 apt 命令,而不只是 update,直到其中一个文件被移除。Ubuntu 自有软件源也会出现相同问题;deb822 迁移后的重复 apt 软件源错误介绍了一般情况。

删除任何文件前,先找出所有提到 Tailscale 的文件。

grep -RIn tailscale /etc/apt/sources.list /etc/apt/sources.list.d/

保留其中一个文件。如果不想丢失另一个文件,可以将其重命名来禁用它:apt 只读取以 .list 或 .sources 结尾的文件,因此会跳过 tailscale.list.bak,但文件仍保留在磁盘上供参考。

正确编写 deb822 源文件

如果您更喜欢新格式,请转换已有文件,不要重新输入仓库地址。地址中的拼写错误正是上述错误的常见起点。近期的 apt 版本提供了转换器,可将 .list 文件重写为 deb822 stanza,并将 signed-by 选项迁移为 Signed-By。

apt modernize-sources --help
sudo apt modernize-sources

Ubuntu 24.04 随附的 apt 版本早于该子命令,因此查看帮助信息即可立即确认当前版本是否支持它。如果不支持,请根据磁盘上已有的源配置行生成 stanza。这样基础地址来自供应商文件,而不是依赖手动输入。

. /etc/os-release
{
  echo 'Types: deb'
  echo "URIs: $(awk '/^deb /{print $3}' /etc/apt/sources.list.d/tailscale.list)"
  echo "Suites: $UBUNTU_CODENAME"
  echo 'Components: main'
  echo 'Signed-By: /usr/share/keyrings/tailscale-archive-keyring.gpg'
} | sudo tee /etc/apt/sources.list.d/tailscale.sources
sudo rm /etc/apt/sources.list.d/tailscale.list

该命令会输出它写入的 stanza,因此您可以在执行下一个 apt update 前检查其中的字段。以下4个字段尤其值得详细了解,因为它们的失败方式各不相同:

  • URIs 应填写仓库的基础地址。将 dists/noble 部分粘贴进去会导致 404,因为 apt 会自行追加 dists/<suite>,并请求 dists/noble/dists/noble。
  • Suites 是代号,必须与单行格式中间的值完全一致。
  • Signed-By 接受密钥环文件的绝对路径。也可以在该字段下方直接内嵌 ASCII armored 密钥;密钥的每一行都必须缩进1个空格,密钥内部的每个空行都必须写成一个句点。
  • Enabled: no 可在不删除源的情况下停用它。相比重命名,这样更容易撤销,也更便于向下一位维护者说明。

第三方仓库应每个文件只保留一个 stanza。如果确实需要在同一文件中保留多个 stanza,请在它们之间添加空行。仓库索引将 amd64 和 arm64 列为支持的架构,因此 ARM VPS 不需要额外的 Architectures 字段。

中间代理返回 403

由于该仓库不存在的路径会返回 404,因此 403 并不表示文件缺失。它通常来自服务器与 Tailscale 之间的设备,但仓库前面的 CDN 也可能返回 403。先检查 apt 自身的配置,因为其中设置的代理只对 apt 生效,不会影响交互式 curl。

grep -RIn -i proxy /etc/apt/apt.conf.d/ /etc/apt/apt.conf
sudo apt-config dump | grep -i 'acquire::http'

然后监控 apt 实际发送的内容。

sudo apt -o Debug::Acquire::http=1 update

该命令会输出请求行、apt 发送的标头,以及 apt 连接使用的代理(如果有)。将其与对同一 URL 执行的普通 curl 结果进行比较。如果 curl 返回 200,而 apt 返回 403,说明这两个请求在某些中间设备关注的内容上存在差异。最常见的差异是用户代理:

curl -sS -o /dev/null -w '%{http_code}\n' -A 'Debian APT-HTTP/1.3' https://pkgs.tailscale.com/stable/ubuntu/dists/noble/InRelease

如果该命令返回 403,而默认 curl 返回 200,说明过滤设备按名称拒绝了 apt。应在该设备上修复问题,而不是修改服务器。如果服务器发出的所有请求都返回 403,请从其他网络中的计算机执行相同的 curl:如果那里返回 200,说明阻断发生在你所在的一侧;如果所有位置都返回 403,则问题指向该服务,应检查 Tailscale 的状态页。检查 TLS 的企业代理会表现出不同的情况:apt 报告证书验证失败,而不是状态码,因为它收到的证书由代理签发,而不是由 Tailscale 的证书颁发机构签发。另一个常见来源是仅允许访问 Ubuntu 镜像的云出口防火墙。此时应在防火墙上允许 pkgs.tailscale.com。

仅使用 IPv6 出站,以及不是状态码的错误

如果 apt 从未收到 HTTP 响应,请分别测试每种协议。

curl -4 -sS -o /dev/null -w 'v4 %{http_code}\n' https://pkgs.tailscale.com/stable/ubuntu/dists/noble/InRelease
curl -6 -sS -o /dev/null -w 'v6 %{http_code}\n' https://pkgs.tailscale.com/stable/ubuntu/dists/noble/InRelease

如果 IPv4 可以响应,而 IPv6 一直挂起或报告 Network is unreachable,则 apt 失败的原因是解析器库优先使用 IPv6,但此服务器没有可用的 IPv6 路径。强制本次运行使用 IPv4,以确认这一判断:

sudo apt -o Acquire::ForceIPv4=true update

如果这次更新成功,请将设置永久化。

echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

还要考虑相反的情况。如果 VPS 完全没有 IPv4 地址,强制使用 IPv4 不会解决问题,因为没有 IPv4 路由可供流量使用。此时需要提供商提供的 NAT64 和 DNS64,或使用持有 IPv4 地址的代理。其症状是连接错误中显示 IPv6 地址,因此,curl -6 行才是能说明实际原因的信息。

备用方案及其代价

供应商安装脚本。 curl -fsSL https://tailscale.com/install.sh | sh 是 Tailscale 宣传使用的命令。阅读脚本可以发现,它从 /etc/os-release 检测发行版,然后从相同的 URL 写入本指南一直在修复的两个路径:/usr/share/keyrings/tailscale-archive-keyring.gpg 和 /etc/apt/sources.list.d/tailscale.list。这会影响你的预期:它不会绕过代理阻止的仓库。它只会以更少的输出同样失败。将下载的脚本通过管道传给 root shell 是一种取舍,不是解决方案,因为你需要信任服务器当时返回的所有内容,而且不会保留实际执行内容的副本。如果选择这种取舍,必须明确了解其中的风险:

curl -fsSL https://tailscale.com/install.sh -o install.sh
less install.sh
sh install.sh

静态二进制文件。 同一服务器会在 pkgs.tailscale.com/stable 的静态二进制文件部分提供普通 tar 包。截至 October 2026,稳定版本为 1.104.1,64 bit x86 文件为 tailscale_1.104.1_amd64.tgz。你需要自行放置 tailscale 客户端和 tailscaled daemon,并自行管理该 daemon,因此不会有 apt upgrade 路径,之后每次更新都需要你记得手动下载。这种方式适合隔离网络主机,或你必须固定使用某个确切版本的场景。

Ubuntu 自带的软件包。 该归档中没有 deb 软件包。未配置供应商仓库时运行 sudo apt install tailscale,最终会出现 E: Unable to locate package tailscale;无论执行多少次 apt update,结果都不会改变。Canonical 确实提供 snap,可通过 sudo snap install tailscale 安装。由于它来自 Snap Store,因此可以避开上文所有 apt 错误。2026 年 10 月检查时,其 1/stable channel 提供的版本为 1.102.3,低于 Tailscale 当前的 1.104.1;列表还说明该 snap 由 Canonical 维护,不一定得到上游开发者认可。它按照 snapd 的计划自动更新;在 Ubuntu Server 上控制 snap 更新介绍了如何管理更新。如果你实际需要的是由自己控制的 coordination server,而不是 Tailscale 托管的服务器,这是另一个决定:运行 Headscale 作为自己的控制服务器对此有说明;Tailscale 与普通 WireGuard 的比较则介绍了你是否需要这套机制。

软件包已安装,但 tailscaled 无法启动

apt 不再报错后,问题会转移到守护进程。

systemctl status tailscaled
sudo journalctl -u tailscaled -n 50

在使用容器虚拟化且共享宿主机内核的 VPS 上,例如 LXC 或 OpenVZ,日志中会出现 /dev/net/tun 不存在的提示。该守护进程需要 TUN 设备来创建 tailscale0 接口,但容器未获得该设备。请让服务提供商为容器启用 TUN,或改用 KVM 方案,以获得独立的内核。在 KVM 上无需额外配置即可正常工作。

完成后,sudo tailscale up 会输出登录 URL,tailscale status 应列出您的计算机,并显示 100.64.0.0/10 范围内的地址。出现在该列表中的计算机可以作为后续配置的基础,例如从 VPS 发布私有子网,或将 VPS 用作出口节点。

FAQ

为什么 apt 会提示 Tailscale 软件源未签名?

因为 apt 下载了软件源索引,但无法使用 /usr/share/keyrings/tailscale-archive-keyring.gpg 验证其签名。通常是因为密钥环文件大小为 0:sudo tee 在 curl 未能下载任何内容前就截断了文件,而管道因 tee 成功而报告成功。运行 gpg --show-keys /usr/share/keyrings/tailscale-archive-keyring.gpg。正常的密钥环会输出一行 pub 和一行包含 Tailscale 名称的 uid;空文件或损坏的密钥环会输出 gpg: no valid OpenPGP data found.。请先将密钥下载到临时文件,在临时文件中检查,然后以模式 0644 将其复制到目标路径,使 _apt 用户可以读取该文件。

Tailscale URL 中应填写哪个 Ubuntu 代号?

使用 /etc/os-release 中 UBUNTU_CODENAME 的值。在 Ubuntu 24.04 中,该值为 noble;在 Ubuntu 26.04 中为 resolute。不要在基于 Ubuntu 的发行版上使用 lsb_release -cs:在 Linux Mint 22 上,它会输出 wilma,而 Tailscale 没有以该名称发布软件包,因此 apt 会在 dists/wilma/InRelease 上报告 404。编辑任何配置前,先使用 curl -sS -o /dev/null -w '%{http_code}\n' 针对 https://pkgs.tailscale.com/stable/ubuntu/dists/<codename>/InRelease 手动获取索引,确认选择的代号正确。

将 Tailscale 安装脚本通过管道传给 shell 执行是否安全?

这需要您有意权衡。该脚本来自 Tailscale,执行的操作与手动步骤相同:读取 /etc/os-release,写入相同的密钥环和相同的 /etc/apt/sources.list.d/tailscale.list,然后安装软件包。代价是您会以 root 身份执行服务器当时返回的全部内容,并且不会保留脚本副本。可以使用 -o install.sh 下载脚本,阅读后再决定是否运行。这样既保留便利性,也避免无法查看脚本内容。该脚本也无法解决软件源被阻断的问题,因为它使用的就是已经失败的相同 URL。

不使用 apt 软件源时,如何在 Ubuntu 上安装 Tailscale?

有两种方式。第一种是 Canonical 维护的 snap,即 sudo snap install tailscale。截至 2026 年 10 月,该 snap 的 1/stable 通道中包含 1.102.3,但不一定得到 Tailscale 官方认可。第二种是 pkgs.tailscale.com 上发布的静态 tarball。截至 2026 年 10 月,版本为 1.104.1,其中 amd64 文件名为 tailscale_1.104.1_amd64.tgz。使用 tarball 时,您需要自行安装 tailscale 和 tailscaled 程序,并自行通过 systemd 运行守护进程。代价是升级:没有 apt 软件包自动获取新版本,因此每次更新都必须手动完成。Ubuntu 的软件仓库不包含自有的 tailscale deb 软件包,因此在没有供应商软件源的计算机上,sudo apt install tailscale 会停留在 E: Unable to locate package tailscale。