Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

连接到专用网络

可以将 GitHub 托管的运行器连接到专用网络上的资源,包括包注册表、机密管理器和其他本地服务。

注意:GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

关于 GitHub 托管的运行器网络

默认情况下,GitHub 托管的运行器有权访问公共 Internet。 但是,你可能还希望这些运行器访问专用网络上的资源,例如包注册表、机密管理器或其他本地服务。

GitHub 托管的运行器在所有 GitHub 客户之间共享,因此,你需要一种方法,在运行器运行你的工作流时,将你的专用网络仅连接到它们。 可以采用几种不同的方法来配置此访问,每个方法都有不同的优缺点。

将 API 网关与 OIDC 配合使用

借助 GitHub Actions,可以使用 OpenID Connect (OIDC) 令牌对 GitHub Actions 之外的工作流进行身份验证。 例如,可以在专用网络的边缘运行 API 网关,该网关使用 OIDC 令牌对传入请求进行身份验证,然后代表专用网络中的工作流发出 API 请求。

下图概述了此解决方案的体系结构:

OIDC 网关示意图

重要的是,不仅要验证 OIDC 令牌来自 GitHub Actions,而且还要验证它专门来自你预期的工作流,以便其他 GitHub Actions 用户无法访问专用网络中的服务。 可以使用 OIDC 声明创建这些条件。 有关详细信息,请参阅“使用 OIDC 声明定义云角色的信任条件”。

这种方法的主要缺点是,必须实现 API 网关来代表你发出请求,并在网络边缘运行它。

但也有很多优点:

  • 无需配置任何防火墙,也无需修改专用网络的路由。
  • API 网关是无状态的,因此可以水平缩放以处理高可用性和高吞吐量。

有关详细信息,请参阅 API 网关的参考实现(请注意,这需要针对你的用例进行自定义,并且尚未准备好按原样运行)和“关于使用 OpenID Connect 进行安全强化”。

使用 WireGuard 创建网络覆盖

如果不想为 API 网关维护单独的基础结构,可以通过在专用网络的运行器和服务中运行 WireGuard,在这两者之间创建覆盖网络。

此方法有许多缺点:

  • 若要访问在专用服务上运行的 WireGuard,需要工作流可以引用的已知 IP 地址和端口:可以是公共 IP 地址和端口、网络网关上的端口映射,或者动态更新 DNS 的服务。
  • WireGuard 无法即时处理 NAT 遍历,因此需要确定一种提供此服务的方法。
  • 此连接是一对一的,因此如果需要高可用性或高吞吐量,则需要在 WireGuard 之上构建它。
  • 需要为运行器和专用服务生成并安全地存储密钥。 WireGuard 使用 UDP,因此网络必须支持 UDP 流量。

也有一些优点,由于可以在现有服务器上运行 WireGuard,因此不必维护单独的基础结构,并且它在 GitHub 托管的运行器上得到了很好的支持。

示例:配置 WireGuard

此示例工作流将 WireGuard 配置为连接到专用服务。

对于此示例,在专用网络中运行的 WireGuard 实例具有以下配置:

  • 192.168.1.1 的覆盖网络 IP 地址
  • 1.2.3.4:56789 的公共 IP 地址和端口
  • 公钥 examplepubkey1234...

GitHub Actions 运行器中的 WireGuard 实例具有以下配置:

  • 192.168.1.2 的覆盖网络 IP 地址
  • 私钥存储为 WIREGUARD_PRIVATE_KEY 下的 GitHub Actions 机密
name: WireGuard example

on:
  workflow_dispatch:

jobs:
  wireguard_example:
    runs-on: ubuntu-latest
    steps:
      - run: sudo apt install wireguard

      - run: echo "$" > privatekey

      - run: sudo ip link add dev wg0 type wireguard

      - run: sudo ip address add dev wg0 192.168.1.2 peer 192.168.1.1

      - run: sudo wg set wg0 listen-port 48123 private-key privatekey peer examplepubkey1234... allowed-ips 0.0.0.0/0 endpoint 1.2.3.4:56789

      - run: sudo ip link set up dev wg0

      - run: curl -vvv http://192.168.1.1

有关详细信息,请参阅 WireGuard 的快速入门,以及有关如何安全存储密钥的“加密机密”。

使用 Tailscale 创建网络覆盖

Tailscale 是基于 WireGuard 构建的商业产品。 此选项与 WireGuard 非常相似,不同之处在于 Tailscale 更多的是完整的产品体验,而不是开源组件。

它的缺点与 WireGuard 类似:连接是一对一的,因此可能需要执行额外的操作以实现高可用性或高吞吐量。 你仍然需要生成并安全地存储密钥。 协议仍然是 UDP,因此网络必须支持 UDP 流量。

但是,与 WireGuard 相比,它也有一些优势:NAT 遍历是内置的,因此无需向公共 Internet 公开端口。 这是迄今为止启动和运行最快的选项,因为 Tailscale 提供了一个 GitHub Actions 工作流,只需一步即可连接到覆盖网络。

有关详细信息,请参阅 Tailscale GitHub 操作以及“加密机密”以了解如何安全地存储密钥。