Skip to content

使用 Cloudflare Tunnel 以及解决缓存问题

Updated: at 10:50

上次打算使用Cloudflare给我的家用服务器提供一个外部链接,以绕过运营商的80/443端口封禁。然而我发现这玩意要绑定信用卡才能用,然而我没有信用卡,于是就不了了之了。

偶然发现

今天又想到用Cloudflare tunnel来给我新部署的transfer.sh服务添加一个不用ipv6就可以访问的外部链接,于是就又打开了Cloudflare面板的Zero Trust页面。此时我已经完全忘记了这玩意需要信用卡。打开之后才想起来,然而我一路使用下来发现,这东西不需要信用卡了?

简直是意外惊喜。根据我之前看的使用Cloudflare Tunnel教程,我是没有记错的,这个东西就是需要绑定信用卡才能用。

Zero Trust主页显示的是:

您看似还在使用旧的 计划。请参阅我们的[更新计划],充分利用 Cloudflare Zero Trust。

而点击那个更新计划的链接后,跳到的页面显示我目前的计划是:

还未选择计划。请选择计划,以免您的帐户中断。

也就是说这是某个bug状态?

需求

需要一个Cloudflare账户,以及一个托管到Cloudflare上的域名。可能需要一张双币信用卡来提供付款方式。

开始部署

部署就很简单了,在 Cloudflare Zero Trust 页面中选择边栏的网络-tunnels,进入隧道界面。

点击创建隧道选择隧道类型中选择Cloudflared,右边的WARP Connector应该是创建一个端到端的连接,类似VPN,而非实现类似FRP的内外穿透服务。

进入下一步,根据提示的步骤,目前是在为隧道命名的步骤。

选择隧道类型 > 为隧道命名 > 安装并运行连接器 > 路由隧道

在**隧道名称(必需)**填入自己想要的名称即可。

然后点击保存隧道,进入安装并运行连接器步骤。

选择您的环境中选择自己要进行穿透的服务器或者主机的操作系统架构

目前支持的操作系统和架构

然后根据安装并运行连接器中的提示在自己的系统中安装cloudflared应用,这一步应该不会出现什么问题。

安装好后运行服务,就能自动连接到你的隧道

在当前页面下方的Connectors中可以看到目前连接的设备,也可以退出之后在隧道页面中创建的隧道状态中查看,显示正常就说明已经连接上。

创建路由

在隧道配置中选择已发布应用程序路由,点击添加已发布应用程序路由

主机名中,填写自己想要的子域名称,在中选择自己的域名,路径中可填写想要更改的应用路径。

如:
子域test选择example.com,路径填写route,那么之后想要访问应用就要进入以下URL
test.example.com/route

由于Cloudflare会自动提供SSL加密,于是如果是网页应用,完整的URL就是
https://test.example.com/route

服务中,填写自己想要公开的内网服务类型和URL地址,就是在本地服务器上所指向的地址,一般是localhost加上端口,如https://localhost:8001

下面的其他应用程序设置暂时搞不懂,请自行尝试。

点击保存按钮后,就创建了一个通往内部应用程序的路由。

之后在外部访问https://test.example.com/route,就可以直接访问内部的https://localhost:8001

之后还可参照其他教程添加一个验证界面。

缓存问题

使用Cloudflare Tunnel会自动添加CDN缓存功能,遵循Cloudflare的缓存设置。

然而这个缓存只会根据请求URL进行存储,而不会检测请求头。

于是,如果同一个URL先后请求了html和png或者其他类型,Cloudflare只会对最先请求的文件进行缓存,第二个请求将会直接命中缓存,返回上一个请求的数据,造成错误。

浏览器请求的是image/png的数据,返回的却是text/html。

解决

粗暴的解决方案

只需要在缓存设置的Cache Rules中添加规则,把整个网站都取消缓存就可以了。

精细一点的解决方案

Cache Rules添加规则,细致地筛选出错误的那一部分请求,取消其缓存。

完美的解决方案

Cache Rules中的缓存密钥(可选)设置中,设置标头(可选),将之前请求中不同的请求标头都添加进去,缓存的时候就会根据不同的标头进行多次缓存了。

然而这玩意需要Enterprise计划,免费版无法使用,这就很难受了。只能选择上面的方案或者套一层其他厂商的CDN了。


Previous Post
B860AV2.1刷Armbian
Next Post
第一次数据丢失