> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Devin Connect

> Devin Connect 让 Devin 以私有方式访问内部系统：将 gateway 部署为策略代理，通过仅出站隧道或 AWS PrivateLink 接入。

<Note>
  Devin Connect 目前处于**早期访问**阶段，功能和配置可能会发生变化。如果你有意参与早期访问，请联系你的 Cognition 账户团队。
</Note>

Devin Connect 让 Devin 会话能够访问内部系统 (源代码管理、制品 registries、内部 API) ，而无需为每个资源单独打通网络链路。你只需在自己的网络内部署一个轻量级 gateway，Devin 即可通过私有连接访问它。

**当前 gateway 版本：v0.0.2**

<h2 id="what-devin-connect-does">
  Devin Connect 的作用
</h2>

Devin Connect 包含两个部分，二者独立配置。

**位于你网络内部的策略代理。** Gateway 是一个采用默认拒绝允许列表的 HTTP CONNECT 代理。它接收针对 `host:port` 的连接请求，对照你的 route 进行校验，使用你自己的 DNS 解析名称，拨通目标地址，并转发不透明的字节流。Gateway 和 Devin 基础架构都不会终止或检查 Devin 虚拟机与你的服务之间的 TLS，且每一条连接都会记录审计日志。

**从 Devin 到该代理的私有通路。** Devin 必须在双方都不向公共互联网暴露任何内容的前提下访问该代理。实现方式有两种，代理在两种方式下的行为完全一致：

* **反向隧道**：Gateway 通过 TLS 向 Devin 侧的端点发起出站连接，Devin 再通过该隧道下发连接请求。你的网络无需开放任何入站通道，也不需要对接任何云服务商。
* **AWS PrivateLink**：你在 Gateway 前置一个 Network Load Balancer 和一个 VPC Endpoint Service，Cognition 则在你的专用租户 VPC 中通过 Interface VPC Endpoint 接入。流量始终保持在 AWS 骨干网内，Devin 通过私有 IP 直接连接 Gateway。

请在下方的[连接模式](#connectivity-modes)选项卡中选择其一；本页其余内容对两种方式均适用。

两种方式下都成立的特性：

* **专用的 single-tenant VPC。** 你的 Devin 部署运行在独立的 VPC 中 (参见[客户专属部署模型](/zh/enterprise/deployment/overview#customer-dedicated-deployment-architecture)) 。Devin 虚拟机通过 Cognition 配置的出口控制，将发往你已 route 目标的流量导向 Gateway。
* **默认拒绝，双重强制执行。** route 会在 Gateway 侧和 Devin 侧同时强制执行，因此仅修改一侧的配置无法扩大访问范围。为某个目标配置 route 绝不会扩大会话的权限：会话的 [security profile](/zh/product-guides/security-profiles) 仍然必须允许该访问。
* **应用层 TLS 端到端。** Gateway 只转发不透明的字节流。
* **DNS 始终保留在你的网络内部。** route 目标由你的解析器解析 (默认使用 Gateway 主机的系统解析器，也可使用你配置的 nameservers) 。
* **一次部署覆盖所有已 route 的目标。** 你只需在 Devin 设置中添加主机名和 IPv4 地址范围，而无需为每个服务单独搭建链路。

<h3 id="choosing-a-connectivity-mode">
  选择连接模式
</h3>

| | 反向隧道 | AWS PrivateLink |
| - | - | - |
| 入站暴露 | 无；由 Gateway 主动向外发起连接 | 互联网上无暴露；Endpoint Service 仅 Cognition 的账户可访问 |
| 云端要求 | 任意可出站访问 `:443` 的网络 | Gateway 必须运行在 AWS 中，并配备 NLB 和 VPC Endpoint Service |
| 连接的身份验证 | 由 Devin 签发的 注册令牌 | Endpoint Service 上的 AWS 账户主体 |
| 流量路径 | 公共互联网 (TLS) ，或你的 VPN / Transit Gateway 挂载 | AWS 骨干网 |
| 跨区域 | 不适用 | 在 Endpoint Service 上启用后即可支持 |

<h2 id="configure-devin-connect">
  配置 Devin Connect
</h2>

两种模式均在 Devin web app 中完成配置：进入企业设置中的 “Devin Connect” 页面即可，拥有相应 admin 角色的用户均可访问。一个账户可以拥有多个 gateway，每个 gateway 负责 route 各自的一组目标：最多一个反向隧道 gateway，另可添加任意数量的 PrivateLink gateway。

1. 选择 “Add gateway”，为其命名并选择连接方式：“Tunnel” 对应反向隧道，“Direct” 对应 AWS PrivateLink。如选择 “Direct”，还需填写 interface endpoint 的 DNS 名称和端口 (参见 [AWS PrivateLink](#connectivity-modes) 选项卡) 。
2. 在 gateway 卡片上，针对 Devin 需要通过该 gateway 访问的每个目标，选择 “Add destination” 进行添加：目标可以是精确的主机名，也可以是 IPv4 地址或 CIDR (例如 `10.20.0.0/16`) 。不支持通配符。每个目标只能属于一个 gateway。
3. 对于隧道 gateway，选择 “Generate token” 完成注册。注册令牌仅显示一次，Devin 不会存储该令牌；你可以随时通过 “Regenerate token” 轮换或撤销令牌。Direct gateway 没有需要进行身份验证的隧道，因此无需执行此步骤。
4. 对于隧道 gateway，复制适用于你所用平台的部署代码片段 (Docker、Kubernetes、AWS ECS、基于 ECS 或 EC2 的 Terraform，或 Linux 主机) 。该代码片段包含根据 gateway 目标生成、可直接运行的 `config.yaml`，因此每次更改目标后都需重新复制。

每个隧道 gateway 的卡片还会显示其当前连接状态以及最后在线时间。

<h3 id="hostname-and-ipv4-destinations">
  主机名和 IPv4 目标
</h3>

* **主机名**根据会话所连接的名称进行匹配，该名称从 TLS SNI 或 HTTP `Host` 标头中读取。因此，主机名只能 route TLS 和明文 HTTP 流量。Gateway 会使用你的 DNS 解析该名称。
* **IPv4 地址和 CIDR** 根据连接的目标 IP 进行匹配，因此可以 route 任意 TCP 协议，包括 SSH 和数据库连接。对于这类 route，Devin 不会解析你的内部名称：会话需要通过 IP 地址连接，或者由你在环境中提供名称解析，例如在[蓝图](/zh/onboard-devin/environment/blueprints)中配置的 `/etc/hosts` 条目。

在 Gateway 自身的 `config.yaml` 中，使用 `ipv4` 规则来允许 IPv4 目标；生成的代码片段中已包含这些规则。

<h2 id="connectivity-modes">
  连接模式
</h2>

<Tabs>
  <Tab title="反向隧道">
    <Frame caption="从你网络中的 gateway 到你专属 Devin VPC 的仅出站连接">
      <img src="https://mintcdn.com/cognitionai/pakAWPD9ouZl-d-T/images/gateway-architecture.svg?fit=max&auto=format&n=pakAWPD9ouZl-d-T&q=85&s=73c8490d5db855c0230952ca725feb0e" alt="Devin Connect reverse tunnel architecture" width="900" height="480" data-path="images/gateway-architecture.svg" />
    </Frame>

    Gateway 会向你的 tenant endpoint `<customer>.gateway.devinenterprise.com:443` 拨出 N 条 TLS 隧道，你无需开放任何入站端口。已注册的隧道只承载 Devin 侧向你的 Gateway 发起的数据流，并不构成通往 Devin 的入站通路。

    注册流程如下：

    1. Devin 在 "Devin Connect" settings page 上为你签发隧道 gateway 所用的 enrollment token。
    2. 你将该 token 安装到 Gateway 主机上 `tunnel.auth_token_file` 指向的路径。
    3. Gateway 拨号连接 `<customer>.gateway.devinenterprise.com:443`，校验 Devin 边缘节点的 server 证书，并出示该 token。
    4. 边缘节点验证该 token (与存储的摘要做恒定时间比较；原始 token 绝不会保存在 Devin 侧) 并注册该隧道。此后，Devin 侧对该 gateway 各目标地址的拨号都会经由该隧道传输。

    隧道使用 `tunnel` 配置段进行配置，且不设置 `listen` 地址，因此 Gateway 主机完全不会暴露任何 proxy 端口：

    ```yaml theme={null}
    tunnel:
      endpoint: acme.gateway.devinenterprise.com:443
      gateway_id: gw-1
      # 注册令牌，单行；每次尝试连接时都会重新读取，
      # 因此无需重启即可轮换。
      auth_token_file: /etc/devin-gateway/tunnel-token
      # carrier: websocket   # 默认值；设为 `direct` 可禁用 WebSocket 帧封装。
      # ca_file: corp-ca.pem # 仅在企业 TLS 检查代理对边缘连接
      #                      # 重新签发证书时才需要。
      # egress_proxy:        # 客户出口 HTTP CONNECT 代理（如有需要）。
      #   addr: proxy.corp.example:3128
    ```

    | 字段 | 说明 |
    | - | - |
    | `endpoint` | 你的 tenant endpoint，即 `<customer>.gateway.devinenterprise.com:443`。 |
    | `gateway_id` | 此 Gateway 实例的标识符，用于 logs 和 metrics。 |
    | `auth_token_file` | 单行 enrollment token 文件的路径。 |
    | `carrier` | `websocket` (默认) 或 `direct`。两者在同一 TLS 连接内运行的协议完全相同；`websocket` 会额外加上 HTTP Upgrade 帧封装，适用于不支持透传原始 TLS 的出网路径。 |
    | `ca_file` | 用于验证 Devin 边缘证书的 PEM CA bundle，仅当处于会重新签发证书的企业 TLS 检查代理之后时才需要。 |
    | `egress_proxy` | 你的出网 HTTP CONNECT 代理 (`addr`，可选 `auth`) ，仅在出站流量必须经由代理时配置。 |
    | `connection_pool` | `size` (1-16 条隧道，可重载) 和 `max_streams_per_connection` (2-2048) 。 |

    此模式的额外检查清单项：

    * 允许 Gateway 出网访问 `<customer>.gateway.devinenterprise.com:443` 以及你已加入 allowlist 的内部服务。无需配置任何入站规则。
    * 将 enrollment token 存放在你的 secret 管理器中，并以文件形式挂载。切勿将其写入 images、纳入 version control 的 config 或 logs；Gateway 也绝不会记录它。
    * 你还可以向 Cognition 提供出网 CIDR 网段，以在 IP 层面限制该公共 endpoint (属于纵深防御；enrollment token 仍是身份验证的关口) 。
  </Tab>

  <Tab title="AWS PrivateLink">
    <Frame caption="Devin 通过 AWS PrivateLink 访问网关">
      <img src="https://mintcdn.com/cognitionai/v9tdcDMHoLlrePLV/images/gateway-privatelink-architecture.svg?fit=max&auto=format&n=v9tdcDMHoLlrePLV&q=85&s=8e026d75fd8336033d4a82ab1c4bf3a5" alt="Devin Connect PrivateLink architecture" width="900" height="480" data-path="images/gateway-privatelink-architecture.svg" />
    </Frame>

    网关通过本地 HTTP CONNECT 监听器提供 allowlist 代理，Devin 则经由 PrivateLink 访问该监听器：

    1. 在你的 AWS VPC 的私有子网中部署网关，并配置 `listen` 地址。
    2. 在网关前放置一个 Network Load Balancer，将其目标指向监听端口，并基于该 NLB 创建 VPC Endpoint Service。
    3. 将 Cognition 的 AWS 账户添加为 allowed principal，并把 endpoint service 名称发送给 Cognition。
    4. Cognition 会在你的专用租户 VPC 中创建 Interface VPC Endpoint，并将其 DNS 名称发送给你。此时会向你的 endpoint service 发起连接请求，由你批准 (若你已在该服务上启用自动接受，则会自动通过) 。
    5. 在“Devin Connect”设置页面添加一个使用“Direct”连接方式的网关，填写 interface endpoint 的 DNS 名称和监听端口，并添加该网关需要服务的目标地址。同时在网关的 `routes` 中配置相同的目标地址。

    由于该 endpoint service 仅可由 Cognition 的账户使用，且 NLB 只在你的 VPC 内部，因此不存在公开监听器。访问授权由 endpoint service 上的 AWS 主体以及网关自身的默认拒绝 allowlist 共同控制。

    网关配置需将 `listen` 设置为 NLB 所指向的端口：

    ```yaml theme={null}
    schema_version: 1
    admin_listen: 0.0.0.0:9090

    # NLB 所指向的本地 HTTP CONNECT 监听器。
    listen: 0.0.0.0:8443

    routes:
      - name: devin
        rules:
          - hostname: "git.corp.example"
          - hostname: "api.corp.example"
        ports: [443]
    ```

    需要提供给 Cognition 的信息：

    * VPC Endpoint Service 名称，例如 `com.amazonaws.vpce.us-west-2.vpce-svc-0abc123`。
    * NLB 对外暴露的侦听器端口。
    * 确认 Cognition 的 AWS 账户已被列为允许的主体。
    * 如果你的 Devin 租户所在区域与 Gateway 所在区域不同，请确认该 endpoint service 是否支持 Devin 租户所在区域。

    此模式的额外检查项：

    * 将 NLB 目标部署在多个可用区中运行。
    * 如果你的服务与 Devin 租户不在同一区域，请在 endpoint service 上启用跨区域支持，具体步骤与[专用部署私有网络](/zh/enterprise/deployment/dedicated_saas_private_networking#cross-region-privatelink-if-your-services-are-in-a-different-region)中的一致。
  </Tab>
</Tabs>

<h2 id="configuration-reference">
  配置参考
</h2>

Gateway 通过单个 YAML 文件进行配置，该文件会经过严格校验并采用故障即关闭策略：校验未通过的配置将被整体拒绝，此前的配置继续生效。系统每 5 秒轮询一次该文件，并支持热重载。

```yaml theme={null}
schema_version: 1

# Admin 监听器（/healthz、/readyz、/metrics）。
admin_listen: 127.0.0.1:9090

# 数据平面监听器。仅适用于 PrivateLink（direct）模式：无 `tunnel` 段时为必填，
# 有 `tunnel` 段时将被拒绝。
# listen: 0.0.0.0:8443

# 用于解析路由目标的客户侧 DNS（省略时使用系统解析器）。
dns:
  nameservers: ["10.0.0.2:53"]
  timeout: 5s

# 默认拒绝的允许列表。rules 支持主机名及 ipv4/ipv6 CIDR。
# 省略 ports 表示任意端口。
routes:
  - name: scm
    rules:
      - hostname: "git.corp.example"
      - hostname: "artifacts.corp.example"
    ports: [443]
  - name: internal-api
    rules:
      - hostname: "api.corp.example"
    ports: [443]
  - name: build-hosts
    rules:
      - ipv4: "10.20.0.0/16"
    ports: [22]

# 通向 Devin 侧边缘节点的出站隧道。在 PrivateLink 模式下请省略。
tunnel:
  endpoint: acme.gateway.devinenterprise.com:443
  gateway_id: gw-1
  auth_token_file: /etc/devin-gateway/tunnel-token
```

<h3 id="routes-allowlist">
  Routes (允许列表)
</h3>

未被任何路由匹配的流量一律拒绝；路由列表为空则拒绝所有流量。路由按顺序求值，以首个匹配项为准。

| 字段 | 说明 |
| - | - |
| `name` | 唯一的路由名称；会出现在连接审计日志中。 |
| `rules` | 目标匹配规则；只要任一规则匹配，该路由即匹配。`hostname` 匹配不区分大小写。`ipv4`/`ipv6` CIDR 规则仅匹配直接使用字面 IP 发起的连接。 |
| `ports` | 允许的目标端口。省略则表示任意端口。 |
| `upstream_proxy` | 可选的上游 HTTP CONNECT 代理，该路由的流量将经其链式转发 (`addr`、可选的 `auth`) 。 |

hostname 按请求中的原样匹配，且在 DNS 解析之前进行，因此 policy 作用于名称本身，而非它恰好解析到的 IP。

<h3 id="listeners">
  监听器
</h3>

| 字段 | 说明 |
| - | - |
| `admin_listen` | 用于 `/healthz`、`/readyz` 和 `/metrics` 的 Admin 监听器。 |
| `listen` | 数据平面的 HTTP CONNECT 监听器。PrivateLink 模式下需设置；隧道模式下可省略，因为此时连接请求仅通过已通过身份验证的隧道传入。 |
| `dial_timeout` | 连接上游目标的超时时间 (默认 10s) 。 |

<h3 id="dns">
  DNS
</h3>

| 字段 | 说明 |
| - | - |
| `nameservers` | 用于解析路由目标的 DNS 服务器 (`ip:port`) 。省略时使用 Gateway 主机的系统解析器；由于 Gateway 运行在你的网络内部，这也是最常见的情况。 |
| `timeout` | 单次查询超时时间 (默认 5s) 。 |

如果你的 DNS 将主机名路由解析为回环地址、链路本地地址或未指定地址，这些路由会被拒绝，因此已加入允许列表的名称无法被指向 Gateway 主机自身或元数据端点。

<h2 id="running-the-gateway">
  运行 Gateway
</h2>

Gateway 以容器镜像的形式发布，其中包含一个静态二进制程序 (该镜像基于 `FROM scratch` 构建，并以非 root 用户运行) 。请将配置文件挂载到 `/etc/devin-gateway/config.yaml`，在隧道模式下还需将令牌文件挂载到 `tunnel.auth_token_file` 指向的位置。

```bash theme={null}
gateway serve --config /etc/devin-gateway/config.yaml
gateway validate-config --config config.yaml   # 严格的配置校验
gateway doctor --config config.yaml            # JSON 格式的诊断摘要
```

`admin_listen` 上的运维端点：

* `/healthz` 用于进程存活状态。
* `/readyz` 用于就绪状态。
* `/metrics` 用于 Prometheus 指标。

两种模式通用的部署检查清单：

* 在私有子网中运行 Gateway。
* 将 `/healthz` 和 `/readyz` 接入你的 orchestrator 健康检查。
* 保持 Devin 设置中每个 gateway 的目标地址与其 Gateway 配置中的 route 同步；仅在一侧被允许的目标地址无法访问。

<h2 id="logging-and-siem-integration">
  日志与 SIEM 集成
</h2>

Gateway 将日志输出到 stdout。当 stdout 不是终端时 (容器环境中通常如此) ，日志会以 JSON 行格式输出，便于机器解析。要将日志接入 SIEM，只需使用所在平台的标准日志管道：容器日志驱动或 Agent (CloudWatch Logs、Fluent Bit、Vector、Datadog Agent 等) 负责收集 stdout，并像转发其他工作负载日志一样将其转发出去。Gateway 无需任何针对 SIEM 的专门配置。

连接审计事件包括：

* `conn_open` 和 `conn_close`，包含目标主机和端口、匹配到的路由名称、客户端地址、各方向传输的字节数以及持续时长。
* `deny`，包含目标地址和原因 (例如没有匹配的允许列表路由) 。

注册令牌不会被记录，payload 内容也不会被记录。

如需在不使用 Gateway 的情况下实现按服务的私有连接，请参阅[专用部署私有网络](/zh/enterprise/deployment/dedicated_saas_private_networking)。如需了解各类部署模型，请参阅[部署概览](/zh/enterprise/deployment/overview)。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.