Skip to main content

连接到专用网络

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

关于 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 操作以及“加密机密”以了解如何安全地存储密钥。