VPC Networks 允许您的 Workers 访问您私有网络中的任何服务,而无需预先注册单个主机或端口。您可以绑定到特定的 Cloudflare Tunnel 以到达该隧道后面的任何服务,或绑定到 Cloudflare Mesh 以到达通过 Cloudflare Tunnel 或 Mesh 宣告的任何 Mesh 节点、客户端设备、子网路由或主机名路由,或通过 Cloudflare WAN 入口(GRE、IPsec 或 CNI)可达的目的地。
在运行时,您传递给 fetch() 的 URL 或传递给 connect() 的地址决定了目的地 —— 任何可通过绑定的 Cloudflare Tunnel 或通过 Cloudflare Mesh 访问的主机名或 IP 地址。对于 HTTP 流量使用 fetch(),对于原始 TCP 连接(Redis、MQTT、自定义协议和其他非 HTTP 服务)使用 connect()。这不同于 VPC Services,后者要求您为每个目标主机和端口组合创建一个单独的绑定。
通过其 UUID 直接引用特定的 Cloudflare Tunnel:
{
"vpc_networks": [
{
"binding": "MY_VPC",
"tunnel_id": "550e8400-e29b-41d4-a716-446655440000",
"remote": true
}
]
}[[vpc_networks]]
binding = "MY_VPC"
tunnel_id = "550e8400-e29b-41d4-a716-446655440000"
remote = true必须将 remote 标志设置为 true,以在本地开发期间启用远程绑定。
Cloudflare Mesh(以前称为 WARP Connector)通过 Cloudflare 的全球网络连接您的服务、设备和 Workers。当您使用 network_id: "cf1:network" 将 Worker 绑定到 Cloudflare Mesh 时,您的 Worker 可以到达:
- 您账户中的任何 Mesh 节点或客户端设备
- 通过 Cloudflare Tunnel 或 Cloudflare Mesh 宣告的子网路由和主机名路由
- 通过 Cloudflare WAN 入口(GRE、IPsec 和 CNI)可达的目的地
- 通过 Cloudflare Gateway 的公共 Internet 目的地 — 强制执行您现有的 Zero Trust 流量策略,并将流量记录在 DNS、HTTP 和 Network 日志中
所有这些都不需要指定特定的 Cloudflare Tunnel UUID。
在以下情况下使用 cf1:network:
- 您的 Workers 需要通过多个 Cloudflare Tunnel、Mesh 节点或 Cloudflare WAN 入口访问私有服务
- 您希望从一个 Worker 访问您的整个私有网络,而无需管理单独的 Cloudflare Tunnel 绑定
- 您的私有网络拓扑可能会改变(新连接、新节点、新路由),并且您不想每次都更新 Worker 配置
- 您希望发送到公共目的地的 Worker 出口流量流经 Cloudflare Gateway 以实现策略执行和可见性
使用 network_id: "cf1:network" 绑定到 Cloudflare Mesh:
{
"vpc_networks": [
{
"binding": "MY_VPC",
"network_id": "cf1:network",
"remote": true
}
]
}[[vpc_networks]]
binding = "MY_VPC"
network_id = "cf1:network"
remote = true在运行时使用 fetch() 访问网络中的任何 HTTP 服务:
export default {
async fetch(request: Request, env: Env) {
// Access a service by private IP
const response = await env.MY_VPC.fetch("http://10.0.1.50/data");
// Access another service on a different port
const dbResponse = await env.MY_VPC.fetch("http://10.0.5.42:5432");
return response;
},
};当 VPC Network 无法与您的目标服务建立连接时,fetch() 会抛出异常。
使用 connect() 打开到任何私有目的地的原始 TCP 连接。这对于 Redis、Memcached、MQTT 或自定义二进制协议等非 HTTP 协议很有用:
export default {
async fetch(request: Request, env: Env) {
// Open a TCP connection to a private Redis instance
const socket = await env.MY_VPC.connect("10.0.1.50:6379");
// Write a Redis PING command
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("PING\r\n"));
await writer.close();
return new Response(socket.readable);
},
};当 VPC Network 无法建立 TCP 连接时,connect() 会抛出异常。
VPC Networks 和 VPC Services 都将 Workers 连接到私有基础设施,但它们做出了不同的权衡。
- 使用 VPC Services,当您有一组已知的目标并希望每个绑定都限定于特定主机和端口时。
- 使用 VPC Networks,当您需要更广泛的访问(整个 Cloudflare Tunnel 或整个 Cloudflare Mesh)并希望您
fetch()调用中的 URL 控制运行时的路由时。
下表总结了差异:
| 功能 | VPC Networks | VPC Services |
|---|---|---|
| 范围 | 单个 Cloudflare Tunnel,或 Cloudflare Mesh 和 Cloudflare WAN 路由 | 特定主机 + 端口 |
| 配置 | tunnel_id(单个 Cloudflare Tunnel)或 cf1:network(账户范围) |
service_id |
| 协议 | HTTP (fetch()) 和 TCP (connect()) |
HTTP (fetch()) 或 TCP(通过 Hyperdrive) |
| 服务注册 | 不需要 | 需为每个目标进行注册 |
| 使用场景 | 动态发现,全网络访问,到达跨账户的服务 | 固定的、编目的服务 |