跳转到内容
搜索文档

VPC 网络

最后更新 查看 MarkdownAgent 设置

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,后者要求您为每个目标主机和端口组合创建一个单独的绑定。

绑定到 Cloudflare Tunnel

通过其 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

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

在运行时使用 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

使用 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

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
服务注册 不需要 需为每个目标进行注册
使用场景 动态发现,全网络访问,到达跨账户的服务 固定的、编目的服务

后续步骤

这篇文档对您有帮助吗?