gRPC 是一个远程过程调用(RPC)框架,允许客户端应用程序像在本地机器上运行一样调用远程服务器上的方法。您可以将 gRPC 服务器和客户端连接到 Cloudflare 的全球网络,从而更轻松地构建跨不同数据中心和环境使用服务的应用程序。
Cloudflare Tunnel 通过私有子网路由支持 gRPC 流量。目前不支持公共主机名部署。
在此示例中,我们将使用 cloudflared 守护程序将 gRPC 服务器连接到 Cloudflare,使用 Gateway 策略保护该服务器,并使用 Cloudflare One 客户端打开通往该服务器的 gRPC 通道。
-
要设置 gRPC Python 应用程序,请遵循此快速入门指南 ↗。
-
启动服务器:
~/grpc/examples/python/helloworld $ python3 greeter_server.py
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1721770418.373806 3677 config.cc:230] gRPC experiments enabled: call_status_override_on_cancellation, event_engine_dns, event_engine_listener, http2_stats_fix, monitoring_experiment, pick_first_new, trace_record_callops, work_serializer_clears_time_cache
Server started, listening on 50051要建立到 Cloudflare 的安全且仅出站的连接:
-
在 Cloudflare 仪表板中,转到 Networking(网络) > Tunnels(隧道)。
Go to Tunnels ↗ -
创建新隧道或编辑现有的
cloudflared隧道。
-
在 Cloudflare 仪表板中,转到 Networking(网络) > Routes(路由)。
Go to Routes ↗ -
选择Create route(创建路由) > Tunnel CIDR(隧道 CIDR)。选择您刚刚创建的隧道,输入服务器的私有 IP 或 CIDR 地址,然后选择Create route(创建路由)。
默认情况下,WARP 会排除发往 RFC 1918 地址空间 ↗的流量,这些 IP 地址通常用于私有网络,且无法从互联网访问。为了让 Cloudflare One Client 向您的 private network 发送流量,您必须配置分流隧道(Split Tunnels),以便将您的 private network 的 IP/CIDR 路由通过 Cloudflare One Client。
-
首先,检查您的分流隧道模式是设置为**Exclude(排除)还是Include(包含)**模式。
-
根据该模式编辑您的分流隧道路由:
如果您使用的是**Exclude(排除)**模式:
a. 删除包含您的 private network 的 IP/CIDR 范围的路由。例如,如果您的网络使用默认 AWS 范围
172.31.0.0/16,请删除172.16.0.0/12。b. 重新添加您的 private network 没有明确使用的 IP/CIDR 范围。对于上述 AWS 示例,您需要为
172.16.0.0/13、172.24.0.0/14、172.28.0.0/15和172.30.0.0/16添加新条目。这可确保只有发往172.31.0.0/16的流量通过 Cloudflare One Client 进行路由。您可以使用以下计算器来确定要重新添加的 IP 地址:
计算器说明
- 在 Base CIDR 中,输入您从分流隧道中删除的 RFC 1918 范围。
- 在 Subtracted CIDRs 中,输入您的 private network 所使用的 IP/CIDR 范围。
- 将计算器结果重新添加到您的分流隧道“排除”模式列表中。
通过缩小 Cloudflare One Client 中包含的私有 IP 范围,您可以降低破坏用户访问本地资源的风险。
如果您使用的是**Include(包含)**模式:
- 将所需的 Zero Trust 域或IP 地址添加到您的分流隧道“包含”列表中。
- 添加一条路由以包含您的 private network 的 IP/CIDR 范围。
您可以配置 Gateway 网络策略来阻止或允许对 gRPC 服务器的访问。以下示例由两个策略组成:第一个策略允许来自通过设备姿态检查的设备的 gRPC 连接,第二个策略阻止所有其他流量。确保 Allow(允许) 策略具有更高的优先级。
| 选择器 | 运算符 | 值 | 逻辑 | 操作 |
|---|---|---|---|---|
| Destination Port(目标端口) | is | 50051 |
And(且) | Allow(允许) |
| Destination IP(目标 IP) | is | 172.31.0.133 |
And(且) | |
| Passed Device Posture Checks(已通过的设备状况检查) | is | macOS firewall (Firewall) |
And(且) | |
| Passed Device Posture Checks(已通过的设备状况检查) | is | macOS disk encryption (Disk encryption) |
| 选择器 | 运算符 | 值 | 操作 |
|---|---|---|---|
| Destination IP(目标 IP) | in | 172.31.0.0/16 |
Block(阻止) |
有关设置 Gateway 代理的更多详细信息,请参阅使用 Gateway 过滤网络流量。
gRPC 客户端可以通过在设备上安装 Cloudflare One 客户端并注册到您的 Zero Trust 组织来连接到服务器。当客户端向通过 Cloudflare Tunnel 暴露的私有 IP 发出请求时,WARP 会将连接通过 Cloudflare 的网络路由到对应的隧道。
要设置 gRPC 客户端:
- 在您的设备上以“流量和 DNS 模式”部署 Cloudflare One 客户端。
- 创建设备注册规则以确定哪些设备可以注册到您的 Zero Trust 组织。
- 按照此快速入门指南 ↗在设备上安装 gRPC。
- 修改
greeter.py以指向您的 gRPC 服务器的私有 IP。这与在您的 Cloudflare Tunnel 路由中配置的私有 IP 相同。例如:
def run():
# NOTE(gRPC Python Team): .close() is possible on a channel and should be
# used in circumstances in which the with statement does not fit the needs
# of the code.
print("Will try to greet world ...")
with grpc.insecure_channel("172.31.0.133:50051") as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name="you"))
print("Greeter client received: " + response.message)- 在客户端设备上,确保 Cloudflare One 客户端处于
Connected状态。 - 运行 gRPC 客户端应用程序:
~/grpc/examples/python/helloworld $ python3 greeter_client.py
Will try to greet world ...
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1721771484.489711 4414247 config.cc:230] gRPC experiments enabled: call_status_override_on_cancellation, event_engine_dns, event_engine_listener, http2_stats_fix, monitoring_experiment, pick_first_new, trace_record_callops, work_serializer_clears_time_cache
Greeter client received: Hello, you!您可以查看隧道日志以验证请求是否按预期进入隧道并到达 gRPC 服务器。