【对象存储】搭配CF带宽联盟实现流量免费

绾秋 发布于 2024-09-15 350 次阅读


CloudFlare 乃是全球闻名遐迩的 CDN 服务提供商,其与众多云服务商共同构建的带宽联盟,为末端用户赋予了极为可观的流量优惠。本文将紧密结合博主在 Backblaze(B2)以及阿里云 OSS 使用过程中的实践探索,简洁明了地展示在搭配运用 CloudFlare CDN 以及保护源对象存储方面的一些技巧,期望大家能够心生喜爱。

概述
★ 带宽联盟
带宽联盟是由CloudFlare主导组建的旨在节省云计算服务商间数据流量开销的组织,换句话说就是节省IDC间的流量传输,减少各IDC通过基础ISP向互联网传输资源支付的费用。在这个联盟中,受益最大的就是CF和末端用户,CF借此巩固自身的互联网带宽权益地位,更有底气向ISP压低带宽价格,用户则获得了来自服务商的流量费用豁免。目前根据实际测试,带宽联盟的流量节省方式主要是CF与服务商构建对等互联或选择低价的ISP/IXP完成互联。

虽然加入带宽联盟的服务商有二十余家,不过是否向末端用户提供优惠仍取决于各服务商自身的政策。值得一提的是,像AWS和Google这样在互联权益地位很高的服务商,对带宽联盟基本是持拒绝或仅提供基础支持的态度,这是因为利益的冲突驱使他们不愿向CF转让自己的权益优势,从IDC的角度来看这是无可厚非的。
官方文档
✡ 支持的服务商
正如上文所言,并不是所有参与带宽联盟的服务商都向用户提供这样的优惠,以下推荐是博主和朋友亲自测试确认的结果,欢迎大家进行补充。
(1)阿里云:阿里云OSS已确认除迪拜和中国大陆的地域外流量传出至CF边缘节点不计费。计费项目包括存储费用和请求费用,国内版产品定价(点击前往),国际版产品定价(点击前往)。注意,仅有国际版客户拥有每月1亿次的免费读请求额度。其优点是功能完善,地域众多且网络对大陆友好,有各类资源包供选购;缺点是费用偏高,计费方式复杂。
阿里云官方文档
(2)Backblaze(B2):Cloud Storage已确认流量传出至CF边缘节点不计费。计费项目包括存储费用(0.005/G·月)及列目录、读取的B/C类请求费用(0.004/万次),产品定价(点击前往)。其优点是价格非常友好且计费灵活;缺点是地域不可选、功能很少、可用区网络质量较差。
官方文档
(3)DigitalOcean:Spaces Object Storage已确认流量传出至CF边缘节点不计费。计费项目只有存储费用,不计请求费用,但需要选择5USD/月的基础套餐,产品定价(点击前往)。博主并没有亲自使用这个服务因此不做过多评价,显而易见的优点是计费非常简单;缺点是不够灵活,仅有一种包计费模式。
官方文档
二、连接CloudFlare
连接到CloudFlare需要为存储桶绑定域名,然后在CloudFlare设置CNAME到桶域名。像阿里云OSS、腾讯云COS等经过自行开发的是可以直接通过相应的域名绑定页面进行绑定,其余的AWS S3、Scaleway之类的是通过设置bucket名称为域名进行绑定,只有B2选择的方式非常特别。

另外建议为自定义的域名在CloudFlare添加一条页面规则,将SSL设置为灵活(即HTTP回源),因为多数对象存储不支持自定义域名SSL访问,选用HTTPS回源的话是不必要的(但是B2是不允许HTTP访问的就必须要设置为HTTPS回源)。其余的页面规则可以按照自己按照其需求自行添加,在此不做赘述。

✫ 阿里云OSS等
阿里云绑定自定义域名很简单,在【传输管理】-【域名管理】中,点击绑定域名按流程即可完成绑定。需要在CloudFlare指向的桶域名,也可以在概览中的外网访问Bucket域名找到。

☆ Backblaze
B2选择的绑定方式就非常特别了,在bucket文件管理页面上传一个文件,点击右侧信息按钮可以在其中获得Friendly URL,将你的域名CNAME指向链接中域名比如f004.backblazeb2.com后,就可以将链接中域名替换为自己的域名实现访问。B2的服务器是向任意域名接入,bucket间域名公用仅以目录区分,这样存在的隐患十分明显,文件链接完全公开而且自定义域名可被其他用户使用

CloudFlare近期的【转换规则】可以完美解决这个问题,在【创建转换规则】下选择【重写URL】,传入匹配建议如图选择相应主机名,随后在路径下找到重写到,选择Dynamic动态模式,按如图修改 /file/lms-example 为即需要隐藏的目录填入框内即可。这样访问链接中bucket路径便被隐藏了,既美观也减少了被滥用的可能。
#隐藏目录中/file/lms-example部分
concat("/file/lms-example", http.request.uri.path)
同样的,利用转换规则隐藏部分目录也可以用于其他的对象存储服务商,因为绝大多数的对象存储公共访问链接是有迹可循的,被有心之人找出并利用可能会产生巨额的流量费用。我们可以在bucket中新建一个用于存放对外访问的文件夹,然后与B2的操作一样将该目录通过动态重写隐藏掉,这些可以自行发挥。
S3协议的bucket在公开读的权限下会默认展示桶内文件列表和路径,特征明显而且并不友好。绝大多数的对象存储都支持设置静态网站index.html和错误页404.html的设置,比如阿里云OSS在【基础设置】-【静态页面】下。ps:可用使用AI自主生成页面或者用宝塔面板生成的页面


显然,像B2这种简单粗暴的是又一次没有这样的功能,可以如图使用URL重写规则将主页静态定向至index.html。404页面的功能没有一个比较好的办法,不过B2的友好访问链接不会展示目录列表和bucket信息,影响并不大。

✭ 隐藏bucket标头
在对象存储的标头中会包含有一些bucket信息,可以通过控制台的Network选项卡暴露出来,也是对对象存储特征的一个暴露点。

通过CloudFlare转换规则中的【修改响应头】,能够简单地实现响应头的去除,同时还可以加入跨域请求头等需要的标头。

目前B2和OSS可以隐藏的标头大致如下,其他对象存储请根据实际情况去查看和配置,在此就不一一列出了。
① 阿里云OSS │ ② Backblaze B2 │
x-oss-hash-crc64ecma │ x-bz-content-sha1 │
x-oss-object-type │ x-bz-file-id │
x-oss-request-id │ x-bz-file-name │
x-oss-server-time │ x-bz-info-src_last_modified_millis │
x-oss-storage-class │ x-bz-upload-timestamp │
➤ 禁止访问文件
同样的,通过页面规则中的URL重写功能,我们也能够实现诸如对特定目录、特定后缀(如图.php)的禁止访问,重写至错误页面即可。不过需要注意的是,转换规则是下方规则优先级更高,而页面规则是上方规则优先级更高。

CloudFlare安全规则
✫ 页面规则
CloudFlare页面规则前文有提到,免费版提供3条规则,在这里也可以设置一些边缘缓存有效期、缓存内容等等细致的配置。博主来自对象存储的静态资源一般进行如下的配置,如果有特殊的需要可以自行结合实际去探索。

✬ 防火墙规则
CloudFlare防火墙有5条免费的防火墙规则,入口在【防火墙】-【防火墙规则】,能够实现很细致的安全规则,比如图中配置即为开启验证码。其他的项目在这里暂时不做过多的讲解,等后续有时间,我们再展开详细聊一聊CloudFlare防火墙的规则应用。

本页面博客搬运自我的朋友“秦林”的博客