Devin Connect 目前处于早期访问阶段,功能和配置可能会发生变化。如果你有意参与早期访问,请联系你的 Cognition 账户团队。
Devin Connect 的作用
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。
- 专用的 single-tenant VPC。 你的 Devin 部署运行在独立的 VPC 中 (参见客户专属部署模型) 。Devin 虚拟机通过 Cognition 配置的出口控制,将发往你已 route 目标的流量导向 Gateway。
- 默认拒绝,双重强制执行。 route 会在 Gateway 侧和 Devin 侧同时强制执行,因此仅修改一侧的配置无法扩大访问范围。为某个目标配置 route 绝不会扩大会话的权限:会话的 security profile 仍然必须允许该访问。
- 应用层 TLS 端到端。 Gateway 只转发不透明的字节流。
- DNS 始终保留在你的网络内部。 route 目标由你的解析器解析 (默认使用 Gateway 主机的系统解析器,也可使用你配置的 nameservers) 。
- 一次部署覆盖所有已 route 的目标。 你只需在 Devin 设置中添加主机名和 IPv4 地址范围,而无需为每个服务单独搭建链路。
选择连接模式
配置 Devin Connect
两种模式均在 Devin web app 中完成配置:进入企业设置中的 “Devin Connect” 页面即可,拥有相应 admin 角色的用户均可访问。一个账户可以拥有多个 gateway,每个 gateway 负责 route 各自的一组目标:最多一个反向隧道 gateway,另可添加任意数量的 PrivateLink gateway。- 选择 “Add gateway”,为其命名并选择连接方式:“Tunnel” 对应反向隧道,“Direct” 对应 AWS PrivateLink。如选择 “Direct”,还需填写 interface endpoint 的 DNS 名称和端口 (参见 AWS PrivateLink 选项卡) 。
- 在 gateway 卡片上,针对 Devin 需要通过该 gateway 访问的每个目标,选择 “Add destination” 进行添加:目标可以是精确的主机名,也可以是 IPv4 地址或 CIDR (例如
10.20.0.0/16) 。不支持通配符。每个目标只能属于一个 gateway。 - 对于隧道 gateway,选择 “Generate token” 完成注册。注册令牌仅显示一次,Devin 不会存储该令牌;你可以随时通过 “Regenerate token” 轮换或撤销令牌。Direct gateway 没有需要进行身份验证的隧道,因此无需执行此步骤。
- 对于隧道 gateway,复制适用于你所用平台的部署代码片段 (Docker、Kubernetes、AWS ECS、基于 ECS 或 EC2 的 Terraform,或 Linux 主机) 。该代码片段包含根据 gateway 目标生成、可直接运行的
config.yaml,因此每次更改目标后都需重新复制。
主机名和 IPv4 目标
- 主机名根据会话所连接的名称进行匹配,该名称从 TLS SNI 或 HTTP
Host标头中读取。因此,主机名只能 route TLS 和明文 HTTP 流量。Gateway 会使用你的 DNS 解析该名称。 - IPv4 地址和 CIDR 根据连接的目标 IP 进行匹配,因此可以 route 任意 TCP 协议,包括 SSH 和数据库连接。对于这类 route,Devin 不会解析你的内部名称:会话需要通过 IP 地址连接,或者由你在环境中提供名称解析,例如在蓝图中配置的
/etc/hosts条目。
config.yaml 中,使用 ipv4 规则来允许 IPv4 目标;生成的代码片段中已包含这些规则。
连接模式
- 反向隧道
- AWS PrivateLink
从你网络中的 gateway 到你专属 Devin VPC 的仅出站连接
<customer>.gateway.devinenterprise.com:443 拨出 N 条 TLS 隧道,你无需开放任何入站端口。已注册的隧道只承载 Devin 侧向你的 Gateway 发起的数据流,并不构成通往 Devin 的入站通路。注册流程如下:- Devin 在 “Devin Connect” settings page 上为你签发隧道 gateway 所用的 enrollment token。
- 你将该 token 安装到 Gateway 主机上
tunnel.auth_token_file指向的路径。 - Gateway 拨号连接
<customer>.gateway.devinenterprise.com:443,校验 Devin 边缘节点的 server 证书,并出示该 token。 - 边缘节点验证该 token (与存储的摘要做恒定时间比较;原始 token 绝不会保存在 Devin 侧) 并注册该隧道。此后,Devin 侧对该 gateway 各目标地址的拨号都会经由该隧道传输。
tunnel 配置段进行配置,且不设置 listen 地址,因此 Gateway 主机完全不会暴露任何 proxy 端口:此模式的额外检查清单项:
- 允许 Gateway 出网访问
<customer>.gateway.devinenterprise.com:443以及你已加入 allowlist 的内部服务。无需配置任何入站规则。 - 将 enrollment token 存放在你的 secret 管理器中,并以文件形式挂载。切勿将其写入 images、纳入 version control 的 config 或 logs;Gateway 也绝不会记录它。
- 你还可以向 Cognition 提供出网 CIDR 网段,以在 IP 层面限制该公共 endpoint (属于纵深防御;enrollment token 仍是身份验证的关口) 。
配置参考
Gateway 通过单个 YAML 文件进行配置,该文件会经过严格校验并采用故障即关闭策略:校验未通过的配置将被整体拒绝,此前的配置继续生效。系统每 5 秒轮询一次该文件,并支持热重载。Routes (允许列表)
未被任何路由匹配的流量一律拒绝;路由列表为空则拒绝所有流量。路由按顺序求值,以首个匹配项为准。
hostname 按请求中的原样匹配,且在 DNS 解析之前进行,因此 policy 作用于名称本身,而非它恰好解析到的 IP。
监听器
DNS
如果你的 DNS 将主机名路由解析为回环地址、链路本地地址或未指定地址,这些路由会被拒绝,因此已加入允许列表的名称无法被指向 Gateway 主机自身或元数据端点。
运行 Gateway
Gateway 以容器镜像的形式发布,其中包含一个静态二进制程序 (该镜像基于FROM scratch 构建,并以非 root 用户运行) 。请将配置文件挂载到 /etc/devin-gateway/config.yaml,在隧道模式下还需将令牌文件挂载到 tunnel.auth_token_file 指向的位置。
admin_listen 上的运维端点:
/healthz用于进程存活状态。/readyz用于就绪状态。/metrics用于 Prometheus 指标。
- 在私有子网中运行 Gateway。
- 将
/healthz和/readyz接入你的 orchestrator 健康检查。 - 保持 Devin 设置中每个 gateway 的目标地址与其 Gateway 配置中的 route 同步;仅在一侧被允许的目标地址无法访问。
日志与 SIEM 集成
Gateway 将日志输出到 stdout。当 stdout 不是终端时 (容器环境中通常如此) ,日志会以 JSON 行格式输出,便于机器解析。要将日志接入 SIEM,只需使用所在平台的标准日志管道:容器日志驱动或 Agent (CloudWatch Logs、Fluent Bit、Vector、Datadog Agent 等) 负责收集 stdout,并像转发其他工作负载日志一样将其转发出去。Gateway 无需任何针对 SIEM 的专门配置。 连接审计事件包括:conn_open和conn_close,包含目标主机和端口、匹配到的路由名称、客户端地址、各方向传输的字节数以及持续时长。deny,包含目标地址和原因 (例如没有匹配的允许列表路由) 。

