配合Cloudflare Tunnel使用Cloudflare Load Balancer




English version: Use Cloudflare Load Balancer with Cloudflare Tunnel – Frank’s Weblog

Cloudflare Load Balancer是Cloudflare提供的一个全球负载均衡产品。它可以以传统方式(域名或IP地址)连接源服务器,还可以与Cloudflare Tunnel集成,以创建一个无缝和安全的网络基础设施。

将Cloudflare Tunnel与Cloudflare Load Balancer一起使用的配置与传统方式相比略微复杂,我们需要正确地配置域名和Host头,以确保路由和监控的正常工作。

在这篇文章中,我们将用一个例子来演示如何配置将Cloudflare Load Balancer与Cloudflare Tunnel一起使用。

在开始之前,确保你理解HTTP协议中Host头的作用,下面是一些参考资料:

What is HTTP “Host” header? – Stack Overflow

Host names – IBM Documentation

一个谜之CORS Bug的调试过程 – Frank’s Weblog

步骤

这个示例将使用如下的配置:面向访客的网站网址及源服务器的应用中的配置的网址均为:example.com[*]。两个通过Cloudflare Tunnel提供服务的源为origin0.example.comorigin1.example.com

[*]:假设源服务器中的应用由nginx提供服务,那么该nginx的server_nameexample.com

安装Cloudflare Tunnel

请参考官方教程在源服务器上安装cloudflared:Via the dashboard · Cloudflare Zero Trust docs

如果你要在Kubernetes上运行Cloudflare Tunnel,请参考:在Kubernetes中部署Cloudflare Tunnel – Frank’s Weblog

配置Cloudflare Tunnel

在一个cloudflared客户端连接到Cloudflare后,将会自动创建一个Tunnel,并分配一个UUID作为Tunnel ID。在这个示例中,我创建了两个Tunnel,其中一个名为primary,Tunnel ID为aa57***ba18;另一个名为replica,Tunnel ID为ad8c***47f5

本文仅展示primaryTunnel的配置,另一个Tunnel的配置与之相似。

为Tunnel创建一个Public hostname。

将其Hostname设置为origin0.example.com,将HTTP Host Header设置为example.com

在另一个Tunnel origin1.example.com上重复这些步骤。

在创建Public hostname的同时,Cloudflare会自动为子域名origin0.example.com创建一个指向(UUID).cfargotunnel.com的DNS记录。因为这些源服务器将会在负载均衡器背后,所以我们不需要这些DNS记录。为了保障源服务器的安全,可以将这些DNS记录删除。

负载均衡器和源服务器池(Origin Pool)

在完成上述配置后,创建一个负载均衡器和源服务器池(Origin Pool)。将源服务器地址(Origin address)设置为(UUID).cfargotunnel.com,将下方Host header对应的Header value设置为Public hostname中的Hostname,这里是origin0.example.com

这个配置有一些反直觉。(UUID).cfargotunnel.com是该Tunnel的网络地址,这个地址使Cloudflare Load Balancer在网络中找到正确的主机。我们在上一步骤已经将Public Hostname配置为origin0.example.com,这是该“Public Hostname”的虚拟地址[1]。我们这里需要将Host设置为相同的值,才能确保Tunnel能够将请求转发到对应的”Public Hostname”。当请求到达Public Hostname后,因为我们在HTTP Settings中设置了HTTP Host Header为example.com,Tunnel将会使用example.com作为HTTP Host header将请求转发给上游服务,在这里是http://nginx:80

源服务器池监控

要使源服务器池监控正常工作,需要在Advanced health check settings中将Host头配置为example.com[2]

Health Check

监控(Monitor)和健康检查(Health Check)是两个完全不同的功能。Health Check(Traffic -> Health Checks)是一项付费功能,且与Load Balancer无关。Health Check的使用请参考官方文档:Overview · Cloudflare Health Checks docs

Tunnel副本(Replication)不是负载均衡

Tunnel副本(Replication)[3]经常被和负载均衡混淆,但是Tunnel副本不是负载均衡。

一个Cloudflare Tunnel可以有多个连接器(connector),见下图。每个连接器都指向同一个Tunnel。这确保了在其中一个连接器发生故障时,Cloudflare仍然可以通过其他连接器和源服务器保持通信。我们把这些额外的连接器/Cloudflared客户端称为副本

Multiple connectors in same tunnel

Tunnel的多个连接器可以位于不同的服务器甚至可以位于不同的地理区域,但是副本不提供任何流量控制(traffic steering),负载均衡器则可以。当一个请求到达Cloudflare时,Cloudflare网络将选择任何可用的源服务器连接。如果一个连接失败,Cloudflare将重试其他连接,但不能保证选择哪个连接。

小结

下图概括了一个数据包的生命周期中所途径的Cloudflare Load Balancer及Tunnel中每个组件的配置。

References

[1] Virtual hosting – IBM Documentation

[2] Load balancers · Cloudflare Zero Trust docs

[3] Tunnel availability and failover · Cloudflare Zero Trust docs




Posted

in

by

Comments

发表回复/Leave a Reply

您的电子邮箱地址不会被公开。/Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.