VPC Services 是 Workers VPC 的核心构建块。它们代表私有网络中 Workers 可以通过 Cloudflare Tunnel 访问的特定资源。
您可以使用绑定从 Workers 连接到 VPC Services。使用其 fetch 函数向 VPC Service 发出的每个请求都将被安全地路由到私有网络中配置的服务。
VPC Services 强制执行将请求路由到其预期服务而不会暴露整个网络,从而保护您的工作负载并防止服务器端请求伪造 (SSRF)。
拥有 Connectivity Directory Bind(连接目录绑定) 角色的成员可以从 Workers 绑定到现有的 VPC Services。创建 VPC Services 需要 Connectivity Directory Admin(连接目录管理员) 角色。
一个 VPC Service 包含:
- Type(类型):
http用于 HTTP/HTTPS 服务,或tcp用于 TCP 服务(例如,PostgreSQL、MySQL) - Tunnel ID(隧道 ID):提供网络连接的 Cloudflare Tunnel
- Hostname or IPv4/IPv6 address(主机名或 IPv4/IPv6 地址):用于从隧道路由到私有网络中服务的主机名,或 IPv4 和/或 IPv6 地址
- Ports(端口):对于
http类型,HTTP 和/或 HTTPS 端口配置(可选,默认为 80/443)。对于tcp类型,TCP 端口(必需)。 - Application protocol(应用程序协议)(仅限 TCP):可选地,指定
postgresql或mysql以指示 TCP 服务的应用层协议 - TLS certificate verification mode(TLS 证书验证模式):可选地,配置到源站的连接如何验证 TLS 证书
- Resolver IPs(解析器 IP):可选地,可以提供一个特定的解析器 IP — 当未提供时,
cloudflared会将 DNS 流量引导到当前配置的默认系统解析器。
HTTP VPC Services 允许 Workers 对私有 HTTP/HTTPS 端点进行 fetch() 请求。
请求在飞行途中是加密的,直到它们通过隧道到达您的网络,无论提供给 fetch 的 URL 中使用的是哪种方案。如果使用 http 方案,则会从隧道与服务建立明文连接。
https 方案可用于在您的网络内,在隧道与您的服务之间进行加密连接。当指定 https 方案时,提供给 fetch() 操作的主机名将用作服务器名称指示 (SNI) 值。
VPC Services 默认允许使用 http 和 https 方案。您可以仅为 http_port 或 https_port 提供值以强制使用特定方案。
当 Workers VPC 无法与您的服务建立连接时,fetch() 会抛出异常。
TCP VPC Services 允许连接到基于 TCP 的服务,如 PostgreSQL 和 MySQL 数据库。将 tcp 服务类型与 --tcp-port 一起使用以公开 TCP 服务。
您可以选择指定一个 --app-protocol(postgresql 或 mysql)以指示应用层协议。其他 Cloudflare 产品(如 Hyperdrive)使用此元数据,以使用支持的有线协议定位 TCP 服务。
TCP VPC Services 与 Hyperdrive 结合使用,将 Workers 连接到私有数据库。完整指南请参阅使用 Workers VPC 连接到私有数据库。
当使用 https 方案时,隧道会验证源服务提供的 TLS 证书。Workers VPC 信任以下证书类型:
- 公共信任证书 — 由知名公共证书颁发机构(例如,Let's Encrypt、DigiCert)颁发的证书。
- Cloudflare Origin CA 证书 — 由 Cloudflare 颁发的免费证书,可加密 Cloudflare 与您的源站之间的流量。浏览器不信任 Origin CA 证书,但在连接到您的私有服务时,Workers VPC 信任这些证书。
如果您的源服务出示的证书不是由公共信任的 CA 或由 Cloudflare Origin CA 颁发的,则 TLS 握手将失败,并且 fetch() 将抛出异常。
在创建或更新 VPC Service 时,可以通过设置 --cert-verification-mode 选项来配置到源服务的连接如何验证 TLS 证书。这适用于 HTTP 和 TCP 服务类型。
| 模式 | 描述 |
|---|---|
verify_full |
验证完整的证书链和主机名(默认) |
verify_ca |
仅验证证书链,跳过主机名验证 |
disabled |
不验证服务器证书 |
这些配置代表了用于创建 VPC Service 的 REST API的预期契约,VPC Service 是更广泛的连接目录中的一种服务类型。
以下是使用自定义 HTTP 和 HTTPS 端口以及 IPv4 和 IPv6 地址的 HTTP VPC Service 的示例。
{
"type": "http",
"name": "human-readable-name",
// Port configuration (optional - defaults to 80/443)
"http_port": 80,
"https_port": 443,
// Host configuration
"host": {
"ipv4": "10.0.0.1",
"ipv6": "fe80::",
"network": {
"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
},
},
}以下是使用主机名的 HTTP VPC Service 示例。使用主机名时,提供包含可选 resolver_ips 的 resolver_network。
{
"type": "http",
"name": "human-readable-name",
// Port configuration (optional - defaults to 80/443)
"http_port": 80,
"https_port": 443,
// Hostname Host (with DNS resolver)
"host": {
"hostname": "example.com",
"resolver_network": {
"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
"resolver_ips": ["10.0.0.1"], // Optional
},
},
}以下是 PostgreSQL 数据库的 TCP VPC Service 示例。
{
"type": "tcp",
"name": "my-postgres-db",
"tcp_port": 5432,
"app_protocol": "postgresql", // Optional: "postgresql" or "mysql"
"host": {
"ipv4": "10.0.0.5",
"network": {
"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
},
},
}以下示例使用 verify_ca 证书验证模式创建 TCP 服务。
{
"type": "tcp",
"name": "my-postgres-db",
"tcp_port": 5432,
"app_protocol": "postgresql",
"host": {
"ipv4": "10.0.0.5",
"network": {
"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
},
},
"tls_settings": {
"cert_verification_mode": "verify_ca",
},
}创建 VPC Service 后,您可以将其绑定到您的 Worker:
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "my-worker",
"main": "src/index.js",
"vpc_services": [
{
"binding": "PRIVATE_API",
"service_id": "e6a0817c-79c5-40ca-9776-a1c019defe70",
"remote": true // 当为 true 时,利用[远程绑定](/workers/local-development/#remote-bindings)允许在本地开发期间访问 VPC Service。
}
]
}"$schema" = "./node_modules/wrangler/config-schema.json"
name = "my-worker"
main = "src/index.js"
[[vpc_services]]
binding = "PRIVATE_API"
service_id = "e6a0817c-79c5-40ca-9776-a1c019defe70"
remote = true您可以拥有多个 VPC 服务绑定:
{
"vpc_services": [
{
"binding": "PRIVATE_API",
"service_id": "daf43e8c-a81a-4242-9912-4a2ebe4fdd79",
"remote": true
},
{
"binding": "PRIVATE_DATABASE",
"service_id": "453b6067-1327-420d-89b3-2b6ad16e6551",
"remote": true
},
{
"binding": "INTERNAL_CACHE",
"service_id": "6c39b574-237e-49f4-852a-cea5a93ed8f9",
"remote": true
}
]
}[[vpc_services]]
binding = "PRIVATE_API"
service_id = "daf43e8c-a81a-4242-9912-4a2ebe4fdd79"
remote = true
[[vpc_services]]
binding = "PRIVATE_DATABASE"
service_id = "453b6067-1327-420d-89b3-2b6ad16e6551"
remote = true
[[vpc_services]]
binding = "INTERNAL_CACHE"
service_id = "6c39b574-237e-49f4-852a-cea5a93ed8f9"
remote = trueWorkers VPC 使用以下账户角色:
Connectivity Directory Read:查看 Workers VPC 服务和隧道。Connectivity Directory Bind:列出、读取并在 Workers 中绑定(binding)VPC 服务。Connectivity Directory Admin:创建、更新和删除 VPC 服务,并通过 VPC 网络绑定(binding)直接绑定到隧道。
有关角色定义,请参阅角色。
如果您的角色最近已更新,但命令仍然失败,请刷新 Wrangler 身份验证:
npx wrangler logout
npx wrangler login如果您使用 API 令牌(CLOUDFLARE_API_TOKEN)进行身份验证,请确保该令牌属于具有所需角色的用户。
- 使用 Terraform 配置 VPC Services 以将 VPC Services 作为基础设施进行管理
- 为您的环境设置 Cloudflare Tunnel
- 了解有关 Service Binding API 的信息
- 参阅常见用例的示例