SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-09-09

如何在VPS上自托管Outline VPN服务器

在自己的VPS上运行Outline VPN服务器,而非Outline wiki应用。了解安装步骤、访问密钥、管理API端口,以及Shadowsocks无法隐藏的连接信息。

Outline VPN 服务器是什么

要自行托管 Outline VPN 服务器,需要在自己的 VPS 上运行两个组件:Shadowsocks 代理服务器,以及位于其前端的小型 REST(表述性状态转移)管理 API。您可以通过 Outline Manager 桌面应用管理这两个组件。该应用会生成由 ss:// 表示的访问密钥,您可以将这些密钥发送给其他人。选择 Outline 的原因是,可以从封锁 VPN 的网络访问互联网。它并非为最高吞吐量而设计。

首先需要澄清一个容易混淆的问题,因为搜索结果经常将它们混为一谈。Outline VPN 是本页介绍的网络审查规避工具,位于 getoutline.orgOutline 也是一个自托管 wiki 和知识库的名称,但它位于不同的域名,由不同的团队维护。两者只有名称相同,除此之外没有任何关系。如果您要找的是那个 wiki,那么本页并不适用。

Outline VPN 由谁维护

许多指南仍将 Outline 称为 Google 的产品。项目初期确实如此,但现在已经不是。Outline 于 2018 年由 Google 旗下的孵化机构 Jigsaw 发布。截至 2026 年 8 月,项目官网声明 Outline 归独立非营利组织 Outline Foundation 所有,其代码位于 GitHub 上的 OutlineFoundation 组织中。决定是否信任该项目时,这一点很重要:现在的治理归属与 2018 年不同。错误说明所有者的指南,很可能也引用了已经迁移的代码仓库路径。

安装程序实际写入服务器的内容

安装脚本不会编译任何内容,而是运行 Docker 容器。

  • shadowbox,来自镜像 quay.io/outline/shadowbox:stable。这是管理服务器,数据平面运行的是项目的 Shadowsocks 后端 outline-ss-server
  • watchtower,按定时器轮询是否有更新的 shadowbox 镜像,默认每小时一次;发现更新后会重启容器。
  • 一个自签名 TLS(传输层安全)证书及其私钥,写入服务器的状态目录。由于未使用公共证书颁发机构,管理器不会验证证书链,而是通过 SHA-256 指纹固定该证书。

状态数据位于 /opt/outline 下,持久化文件位于 /opt/outline/persisted-state 中。

对于 Watchtower,应根据需求做出明确选择,而不是忽略其影响。自动更新镜像意味着安全修复无需手动操作即可生效,但也意味着你已审核过的版本可能在一夜之间发生变化,而你可能还没有阅读相应的变更日志。请根据更重要的需求进行选择。如果希望自行控制升级,请删除 Watchtower 容器,并按自己的计划拉取新镜像。

安装程序实际检查的前置条件

  • 64 位 x86 机器。 脚本会以 Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machine 终止。ARM VPS 方案无法使用默认镜像,因此购买方案前请先检查架构。
  • Docker。 如果未安装 Docker,脚本会提供安装选项,并输出 Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'.。如果已安装 Docker,但 daemon 已停止,脚本会失败,并提示确认 docker daemon 是否正在运行。使用 sudo systemctl enable --now docker 启动,然后重新运行安装程序。
  • 脚本能够自行发现的公网 IPv4 地址。 脚本会查询外部服务(当前为 icanhazip.comipinfo.io 和一个 Google 端点),获取应写入管理 URL 的地址。位于 NAT(网络地址转换)之后,或出站 HTTP 被阻止的主机,无法完成此查询。此时必须使用 --hostname 提供地址。
  • 通过 sudo 使用 root。

项目文档将 Ubuntu 20.04 LTS 或 Debian 10 列为受支持的基础系统。由于所有组件都在容器中运行,较新的 Ubuntu 通常也能工作,但这不属于项目测试的标准路径。

安装 Outline VPN 服务器

这是项目在 developer.getoutline.org 自有文档中提供的命令,内容读取于 2026 年 8 月。请自行访问该地址并获取最新命令,不要信任任何指南(包括本文)中的副本:代码仓库已经迁移过一次,使用这行命令的过期副本会从已归档路径安装。

sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh)"

运行前先阅读脚本。将远程 URL 通过管道传给 root shell,意味着会执行该 URL 在当前时刻提供的全部内容。先查看脚本只需 1 分钟:

wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh | less

使用 3 个可选标志可以自行指定值,而不是接受自动生成的值:

Usage: install_server.sh [--hostname <hostname>] [--api-port <port>] [--keys-port <port>]

  --hostname   The hostname to be used to access the management API and access keys
  --api-port   The port number for the management API
  --keys-port  The port number for the access keys

不要预期端口号固定不变。 不指定 --api-port--keys-port 时,脚本会分别为它们随机选择大于 1023 的端口。Outline 没有固定的知名端口。任何直接给出具体端口号的指南,引用的都是其自身的安装结果,而不是您的安装结果。请从本次运行的输出中读取端口号。

安装成功后,脚本会输出以 CONGRATULATIONS! Your Outline server is up and running. 开头的横幅,并要求您将下面这一行(包括花括号)复制到 Outline Manager 界面中。该行的格式如下:

{"apiUrl":"https://<your ip>:<api port>/<random secret>","certSha256":"<fingerprint>"}

随后脚本会准确告诉您需要开放哪些端口,并填入它选择的端口号:

Make sure to open the following ports on your firewall, router or cloud provider:
- Management port ${API_PORT}, for TCP
- Access key port ${ACCESS_KEY_PORT}, for TCP and UDP

如果关闭终端后丢失了该配置行,它仍保存在服务器上。sudo cat /opt/outline/access.txt 会重新输出该配置行。

打开管理器前,先确认容器确实正在运行:

sudo docker ps

您应看到 shadowboxwatchtower,两者的状态都应为 Up。持续重启的 shadowbox 容器意味着管理器始终无法连接,sudo docker logs shadowbox 会说明原因。

为什么不应随意公开管理 API 端口

再次查看 apiUrl。其中没有用户名,也没有密码。该 URL 中的随机路径片段就是身份验证机制,仅此而已。任何能够访问管理端口并知道该路径的人,都可以读取服务器上的所有访问密钥,并将其全部删除。

脚本自身提供的 UFW 建议(ufw 是 Ubuntu 上的简单防火墙)会将管理端口开放给整个互联网:

sudo ufw allow ${API_PORT}/tcp

这样配置很方便,但开放范围超过了实际需要。访问密钥端口必须对公网开放,因为用户需要从那里连接。管理端口只需要允许运行 Outline Manager 的位置访问。请缩小允许范围:

sudo ufw allow <keys port>/tcp
sudo ufw allow <keys port>/udp
sudo ufw allow from <your admin ip> to any port <api port> proto tcp

更好的做法是在公网防火墙上保持管理端口关闭,并通过现有的私有隧道访问它。如果您已经完成了 VPS 上自托管 WireGuard VPN 的构建,Outline 服务器可以加入该隧道,并且只在隧道地址上响应 API。这样,扫描您的公网 IP 时,只会发现访问密钥端口,不会发现其他端口。请记住,大多数服务商除了服务器上的防火墙外,还在控制面板中提供网络防火墙;两者都必须配置一致。

关于该配置行,还有两点需要注意。Outline 文档称其为敏感信息,并要求仅通过加密信道与需要管理访问权限的人员共享,不要通过普通电子邮件或聊天工具发送。撤销已共享的配置确实很困难:对于手动安装的服务器,文档规定的使已共享管理配置失效的方法是完整重新安装,这还会重置您签发的所有用户访问密钥。请像对待服务器的 root 密码一样对待该字符串,因为实际上它的作用就是如此。

签发和撤销访问密钥

Outline Manager 可通过按钮创建密钥。底层实际是通过 HTTP 请求访问 secret API 路径,因此可以将其脚本化:

API="https://SERVER_IP:API_PORT/SECRET_PATH"  # the apiUrl from access.txt
curl -k "$API/access-keys"
curl -k -X POST "$API/access-keys"
curl -k -X PUT "$API/access-keys/3/name" -H 'Content-Type: application/json' -d '{"name":"anna-laptop"}'
curl -k -X DELETE "$API/access-keys/3"

由于证书是自签名证书,因此必须使用 -k;否则 curl 会以 SSL certificate problem: self-signed certificate 停止运行,且不会发送请求。API 还支持为每个密钥设置数据限额:使用 PUT /access-keys/{id}/data-limit 设置限额,使用 DELETE /access-keys/{id}/data-limit 取消限额。这样可以防止某人的手机备份耗尽整个月的带宽配额。

每个人使用一个密钥。 这条规则决定了其他操作是否可行。撤销密钥就是删除密钥。服务器会立即停止接受该密钥,因此某人离开后,运行删除命令即可立即移除其访问权限。假设10个人共用一个密钥,则无法只移除其中一人。删除该密钥后,10个人都会无法使用,你还要花一晚上重新签发9个密钥。将每个密钥命名为持有者的名称,才能安全地执行删除命令。

请明确删除操作不会做什么。ss:// 字符串是你已经发送给某人的秘密。删除密钥会使服务器停止接受该字符串,这是你能够控制的部分。但它不会收回你发送该字符串时使用的消息。因此,如果密钥泄露,应删除该密钥并签发一个新的密钥,不要假定泄露的副本已经消失。

Outline 是代理,不是完整隧道

这正是从 WireGuard 转过来的用户容易感到意外的区别。Shadowsocks 通过代理转发 TCP 和 UDP 连接。服务器上不会创建网络接口,也没有对端地址、路由表条目,服务器后方也不存在可访问的子网。outline-ss-server 支持 TCP 和 UDP,因此浏览器、应用和 DNS 都可以通过它工作。ping 则不支持,因为 ICMP(Internet Control Message Protocol,互联网控制消息协议)不属于 Shadowsocks 代理转发的内容。使用 curl https://ifconfig.me 进行测试,并确认它返回的是服务器地址,而不是您自己的地址。

这些限制的影响需要明确说明。您无法像 WireGuard 对端访问 10.20.0.0/16 那样访问 Outline 服务器后方的私有网络,因为 Outline 没有可下发的路由。您也无法使用它将两台服务器互联。客户端之间不存在点对点流量。这也排除了常见的家庭场景:手机通过隧道将相机胶卷同步回自托管的照片服务器。因此,如果您的目标是实现这一点,请先根据 PhotoPrism 与 Immich 的比较选择服务器,再为其配置可路由的 VPN,而不是代理。如果您需要的是具有地址和路由的实际网络,Outline 就不是合适的工具,WireGuard 与 OpenVPN 的比较会是更好的起点。

混淆的作用与局限

Shadowsocks 从第一个字节开始就会加密并进行身份验证。它没有明文握手、没有协议版本字段、没有证书交换,也没有固定标头。在网络传输中,连接看起来只是流向高位端口的一串随机字节。这正是 Outline 的全部依据:经过调优、用于识别 WireGuard 握手或 OpenVPN 第一个数据包中操作码的 DPI(深度数据包检测)设备,在这里没有可匹配的内容。outline-ss-server 还提供重放保护,通过 --replay_history 启用。它可以阻止一种主动探测:审查方重放捕获的数据包,观察服务器的响应。

下面说明它明确无法解决的问题。

  • 它不会隐藏流量特征。 您的流量仍会持续发往同一个地址,且流量量级可能维持数小时。即使无法读取负载内容,时间和流量分析仍然有效。
  • 它不会让您匿名。 您的服务提供商知道租用服务器的人是谁,通常还持有您的付款信息;您访问的每个网站也都会看到服务器的地址。租用 VPS 与购买 VPN 服务的区别说明了为什么使用实名注册的服务器会改变威胁模型,而不是消除威胁。
  • 服务器地址被封锁后,它无法继续工作。 如果审查方封锁了服务器的 IP,混淆就没有意义,因为没有数据到达服务器,也就没有数据可供混淆。
  • 它无法阻止密钥共享。 发布在公共群聊中的密钥可以被审查方获取和使用,这会直接告诉对方应封锁哪个地址。

最后两点说明,大规模规避封锁需要准备多个地址,轮换使用,并谨慎分发。这正是 Tor 项目设计网桥要解决的问题。因此,如果对手封锁地址的速度快于您租用服务器的速度,请先阅读Tor 网桥和可插拔传输如何分发未公开的入口点,再租用第二台 VPS。

在 Outline 与其他方案之间进行选择

当网络会丢弃 VPN 协议,且您要帮助的人员不会编辑配置文件时,选择 Outline。您只需发送一段字符串,对方再将其粘贴到应用中。这是真正的优势,也是 Outline 存在的主要原因。

当网络允许 WireGuard 通过时,选择 WireGuard。它速度更快,在内核中运行,并可提供可路由的网络,同时需要维护的组件少得多。完整部署方法请参阅WireGuard VPN 服务器指南

当对手阻断的是地址而不是协议,或者您除了可达性之外还需要匿名性时,选择网桥或可插拔传输。

当您要解决的是设备集群管理问题,而不是审查规避问题时,选择带控制平面的网状网络。手动分发密钥和分配地址,在管理大约十几台设备后就难以扩展。自行托管 NetBird 服务器可以替您处理这些管理工作。如果您不想运行控制平面,请先查看Tailscale 免费计划的实际范围,因为家庭或小型团队的设备集群通常可以纳入其中,而且无需支付运行费用。

FAQ

Outline VPN 与 Outline wiki 是同一个项目吗?

不是。这是两个互不相关、仅名称相同的项目。Outline VPN 是位于 getoutline.org 的审查规避工具,由 Shadowsocks 服务器和 REST 管理 API 组成,并通过 Outline Manager 桌面应用进行管理。Outline wiki 是面向团队的自托管知识库,使用不同的域名。搜索“self-host Outline”时会同时返回这两个项目。复制任何安装命令前,请先确认域名。

Outline VPN 仍然是 Google 的产品吗?

不是,截至 2026 年 8 月已不再是。Outline 于 2018 年由 Jigsaw 启动。Jigsaw 是 Google 旗下的孵化机构,旧版指南中的“Google VPN”说法就源于这段历史。该项目的官方网站目前声明,Outline 归独立的非营利组织 Outline Foundation 所有,其源代码仓库位于 GitHub 上的 OutlineFoundation 组织下。

Outline 服务器使用哪些端口?

没有固定答案,这是有意设计的。除非向安装程序传入 --api-port--keys-port,否则它会随机选择一个大于 1023 的端口用于管理 API,再选择另一个端口用于访问密钥。运行结束时,安装程序会打印这两个端口,并提示您在服务器防火墙和服务商的网络防火墙上开放管理端口的 TCP 访问,以及访问密钥端口的 TCP 和 UDP 访问。如果您丢失了这些输出,sudo cat /opt/outline/access.txt 会返回包含管理端口的管理 URL。

可以使用 Outline 访问我的私有网络吗?

不可以。Shadowsocks 代理 TCP 和 UDP 连接,而不是建立 Layer 3 隧道,因此服务器没有通往其后网络的接口或路由。WireGuard 对等端可以配置 AllowedIPs = 10.20.0.0/16,以访问该地址范围。Outline 没有等效设置,因为它没有可用于路由的功能。需要访问私有网络时,请使用 WireGuard;需要访问公网时,再使用 Outline。

如何移除某人的访问权限?

在 Outline Manager 中删除其访问密钥,或使用 DELETE /access-keys/{id} 调用管理 API 删除。服务器会立即停止接受该密钥。只有在每个人都持有自己的密钥时,这种方式才能正常工作。因此,请为每个人创建一个密钥,并使用该人员的名称命名。撤销管理访问权限则复杂得多:对于手动安装的服务器,如果管理配置已经共享,文档建议的修复方法是完整重新安装;这会同时重置所有用户密钥。

#outline-vpn#shadowsocks#vpn#censorship-circumvention#自托管#Docker