Link(源站隧道)

由源站主动拨出。

你服务器上的连接器向我们的落地点建立连接并保持。请求经由这条连接到达。你的服务器不接受来自互联网的任何连接,其地址也不出现在任何地方。

01

它解决什么

把源站藏在 CDN 后面,前提是源站还得拒绝所有不经 CDN 而来的人。那是一条必须永远保持正确的防火墙规则;而地址一旦泄露过一次 —— 一条旧 DNS 记录、一个邮件头、一条证书透明日志 —— 就永远泄露了。

隧道让这个问题消失。没有入站端口可保护,也就没有可写错的规则;即使地址泄露,访问到的也是一台不会应答的服务器。

  • 在 NAT、CGNAT 之后都能用,也适用于没有固定地址的线路 —— 因为是它主动拨出。
  • 一个连接器可以同时挂两个不同城市的落地点,某个城市失联不会导致站点下线。
  • 回源走的地址只存在于我们网络内部,从互联网不可路由。
由你这一侧打开的隧道访客到达最近的位置,请求被交给我们网络内部的落地点。通往你服务端的连接是由你的服务端主动外拨并保持着的,没有任何东西向内拨号。访客最近的位置在我们的网络内部落地点没有公网地址落地点没有公网地址你的服务端不接受任何入站连接
没有任何东西向你的服务器拨号。连接器主动向我们网络内部的落地点建立连接并保持着,请求沿这条连接进来 —— 因此不存在需要保护的入站端口。
02

创建一条隧道

  1. 在控制台打开 CDN → Link 并创建隧道:名称、落地城市,以及要转发到的本地地址 —— 通常是 http://127.0.0.1:8080。
  2. 复制凭据。它只显示这一次,我们也无法再读回。
  3. 把连接器放到运行站点的那台机器上,用控制台给出的命令运行它。
  4. 把 Shield 站点指向这条隧道,而不是某个源站地址。
安装连接器
curl -fsSL https://dash.yunzheng.space/assets/orbit-link-linux-amd64 -o /usr/local/bin/orbit-link
chmod +x /usr/local/bin/orbit-link
运行 —— 控制台会填好你这条隧道的 endpoint 与 fingerprint
orbit-link --token lnk_… --endpoint 203.0.113.4:7844 --fingerprint sha256:… --local http://127.0.0.1:8080

已发布的构建包括 Linux(x86-64、arm64 与 ARMv7)、macOS(Apple 芯片与 Intel)以及 Windows。控制台里都有链接。

用 systemd 保持运行 —— 控制台会填好命令
[Unit]
Description=Orbit Link connector
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/orbit-link --token lnk_… --endpoint … --fingerprint … --local http://127.0.0.1:8080
Restart=always
RestartSec=5
DynamicUser=yes
StateDirectory=orbit-link

[Install]
WantedBy=multi-user.target
03

在容器中运行

连接器以容器镜像形式发布,支持 Linux x86-64、arm64 与 ARMv7。镜像内是与下载版相同的已签名构建,以非 root 用户运行,可使用只读文件系统,不需要 shell。

把设置保存在只有你能读取的文件里 —— 控制台会为你的隧道填好
# orbit-link.env  (chmod 600 orbit-link.env)
ORBIT_LINK_TOKEN=lnk_…
ORBIT_LINK_ENDPOINT=203.0.113.4:7844
ORBIT_LINK_FINGERPRINT=…
ORBIT_LINK_LOCAL=http://127.0.0.1:8080
用 Docker 运行
docker run -d --name orbit-link --restart unless-stopped --env-file orbit-link.env --network host \
  --read-only --cap-drop ALL --security-opt no-new-privileges \
  cr.yunzheng.space/orbit-link:1.3.0

在容器内,127.0.0.1 指的是容器自身。--network host 让连接器访问主机上的服务;若要访问另一个容器,请改用它的名称。

或者用 Docker Compose 与应用一起运行
services:
  app:
    image: your-app-image
  orbit-link:
    image: cr.yunzheng.space/orbit-link:1.3.0
    restart: unless-stopped
    env_file: orbit-link.env
    environment:
      ORBIT_LINK_LOCAL: http://app:8080
    read_only: true
    cap_drop: [ALL]
    security_opt: [no-new-privileges:true]
    depends_on: [app]
  • 不要把凭据写进镜像或命令行:通过 env 文件传入,或以 secret 挂载并把 ORBIT_LINK_TOKEN_FILE 设为其路径。
  • 镜像不会自行更新。标签有精确版本(1.3.0)、次版本线(1.3)与 latest;升级时更换标签即可。
  • Docker 能看到连接器的健康状态:隧道连通时显示为 healthy。
  • 执行 docker stop 时,连接器会先处理完正在进行的请求(最多 8 秒,ORBIT_LINK_DRAIN)再退出。
04

Kubernetes

提供两个 Helm chart。orbit-link 以 Deployment 运行一条隧道的连接器。orbit-link-controller 发布 Ingress 与 Gateway API 路由:你在集群里声明的每个主机名都经 Orbit Link 对外提供,不需要入站端口,也不需要负载均衡器。

一条隧道的连接器 —— 控制台会为你的隧道填好这些值
# orbit-link-values.yaml  (chmod 600 orbit-link-values.yaml)
tunnel:
  token: lnk_…
  endpoint: "203.0.113.4:7844"
  fingerprint: "…"
  local: http://my-app.default.svc.cluster.local:8080

helm install orbit-link oci://cr.yunzheng.space/charts/orbit-link \
  --namespace orbit-link --create-namespace -f orbit-link-values.yaml
  • 默认两个副本,分布在不同节点上,各自保持连接;同一网络地址后面的多个副本都能保持连接。
  • 以非 root 用户、只读文件系统运行;凭据以文件挂载,不经环境变量传递。
  • 就绪状态跟随隧道:连接建立后副本才就绪。滚动更新时,每个副本先处理完正在进行的请求再停止。
控制器 —— 使用仅限 Orbit Link 的 API 令牌(控制台 → API → 仅限 Orbit Link)
kubectl create namespace orbit-link
kubectl -n orbit-link create secret generic orbit-api --from-file=token=./orbit-api-token
helm install orbit-link oci://cr.yunzheng.space/charts/orbit-link-controller -n orbit-link \
  --set clusterName=my-cluster --set orbit.existingSecret=orbit-api
用 Ingress 发布服务
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
spec:
  ingressClassName: orbit-link
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app
                port:
                  number: 80
  • 发布的对象:类别为 orbit-link 的 Ingress,以及挂在 GatewayClass 为 orbit-link 的 Gateway 上的 HTTPRoute。支持按主机名与路径(Prefix 与 Exact)分发。
  • Ingress 的 status(或 Gateway 的 addresses)会给出每个主机名的 CNAME 应指向的名称。kubectl describe 会显示每个主机名的事件:已发布、已被占用或超出套餐上限。
  • 修改主机名或路径即时生效;删除 Ingress 或路由会从 Orbit 移除它的主机名。helm uninstall 会移除控制器创建的全部内容。
  • TLS 在 Orbit 边缘终止,主机名的 CNAME 生效后由边缘签发证书。
  • 多个控制器副本分工:其中一个负责变更,全部副本都承载流量。
  • 控制器与两个 chart 以 Apache License 2.0 开源:github.com/yunzheng2006/orbit-link-controller。
05

版本与更新

当前连接器版本为 1.3.0(2026-09-28)。下载:Linux x86-64、Linux arm64、Linux ARMv7、macOS Apple 芯片、macOS Intel、Windows x86-64。orbit-link --version 会显示你手上的版本。

  • 1.3.0(2026-09-28):同一网络地址后面可以为一个隧道运行多个连接器副本,例如 Kubernetes 中的多个副本。
  • 1.2.0(2026-09-28):停止前先处理完正在进行的请求;可提供健康检查;可从文件读取凭据;新增 Linux ARMv7 构建。
  • 1.1.2(2026-09-25):在屏蔽 UDP 的网络中,连接空闲一段时间后的请求不再失败。
  • 1.1.1(2026-09-25):因 UDP 不通而改走备用连接后,UDP 恢复时会自动切回。
  • 1.1.0(2026-09-25):修复在屏蔽 UDP 的网络中处理几次请求后停止工作的问题;可同时通过 IPv4 和 IPv6 连接;支持自动更新。
  • 1.0.0:首个版本。

从 1.1.0 起连接器会自动保持最新:启动时和每隔几小时检查一次新版本,只安装用我们发布密钥签名的构建,切换前先试运行新构建,新构建连不上隧道时自动退回上一版本。在 systemd 下更新暂存在它的 StateDirectory 里;手动运行时,在有权限的情况下直接替换自身文件。

如需固定版本,启动时加上 --no-update(或设置 ORBIT_LINK_NO_UPDATE=1)。控制台会标出连接器版本低于当前版本的隧道。1.0.0 版本不会自我更新,请手动替换一次为当前版本。
06

连接如何被保护

连接器拨的是一个地址而非主机名,因此没有名字可以让公共 CA 背书。取而代之的是对落地点公钥的钉定:命令行里的 fingerprint 是该公钥的 SHA-256,连接器拒绝与任何无法出示它的一方通信。

凭据的方向相反:落地点校验它并接受这条隧道。凭据错误与隧道不存在的拒绝是完全相同的 —— 二者的差别恰好是猜测者想要得到的信息。

签发新凭据会在约一分钟内断开仍在使用旧凭据的连接器。轮换前请先备好新凭据。丢失安装命令不构成轮换理由:endpoint 与 fingerprint 随时可以从隧道的 Install 按钮取回。
07

当 UDP 被阻断

连接器优先使用 UDP 7844 上的 QUIC,并在同一端口回退到 TCP。如果所在网络完全丢弃 UDP,加上 --tcp 直接走回退,不必等 QUIC 超时。

两种情况下都只需要出站连接。没有任何东西会主动连接你的服务器。

08

常见问题

我的服务器需要公网 IP 吗?

不需要,这正是重点。它只需要能建立出站连接 —— 家庭宽带或私有网络中的容器通常只能做到这一点。

连接器停止后会怎样?

隧道消失,其后的站点变为不可达。这里刻意没有公网兜底地址:保留一个恰恰会重新引入这个产品要防的泄漏。请用守护进程运行连接器 —— 控制台会给出 systemd unit。

一条隧道能服务多个站点吗?

可以。多个 Shield 主机名可以从同一条隧道回源;连接器把它们都转发到同一个本地地址,由你的服务器按 Host 头分派。

我的账户能用吗?

Link 按平台开启。如果控制台显示尚未开启,说明地址池还没分配 —— 请联系支持。

继续

相关文档

开始使用

Orbit 账户的组织方式、控制台各处的功能,以及从登录到让我们的网络开始应答一个域名的最短路径。

DNS 托管

建区、把注册商的 NS 指向我们、管理记录。含加权应答、带健康检查的记录、顶点 ALIAS 与区文件导入。

接入主机名

整域委派、单主机名委派,或加一条 CNAME 而完全不动现有 DNS。三者各自的代价与适用场景。

← 全部文档