使用 Cloudflare 让你的网站更安全

当有一天你和我一样在维护独立博客(或者其他网站)时,你一定更希望将精力聚焦于网站内容上,而非耗费大量时间来解决有关站点性能以及安全方面的问题。作为世界上最大网络的拥有者,Cloudflare® 为像我们一样的网站管理员推出免费层级的服务,提供网站性能与安全性方面的一站式解决方案。

在传统站点中,用户直接向暴露于公网中的源服务器建立连接,从而请求网页内容。站点服务器只需要拥有一个公网 IP,即可为来自世界各地的用户提供基础 Web 服务。但是,这种实现方式也有着显而易见的不足,包括:服务器更易受网络攻击、无法在更贴近用户的地域向用户提供内容,以及难以承受拒绝服务攻击(Denial-of-service attack)等。

事实上,有许多既有的解决方案用于缓解上述问题:如网站的搭建者可以通过在多个地域部署内容分发网路(CDN)或在多组服务器上任播(Anycast)网络地址的方式在尽量靠近用户的位置向他们呈递内容。通过部署网络防火墙与应用程序防火墙(WAF)来阻止特定模式的恶意流量。但不要忘记:上述提及的每一个部分都需要单独配置部署,除了耗费网站管理员的时间以外,增加的维护成本也不容忽视。

Cloudflare 通过向站点提供一个反向代理(Reverse Proxy)服务来解决上述问题。他们的思路很简单:由 Cloudflare 本身的服务器向最终用户呈递网页内容,而实际的内容由网站拥有者所控制的服务器(被称为“源服务器”)向 Cloudflare 提供。这样一来,有关站点性能、访问速度和安全性的问题则全部由 Cloudflare 处理——并且基础版本的服务是免费的:网站管理员只需要将注意力放置在经营网页内容本身即可。Cloudflare 官方撰写了一篇简明扼要的文章来描述他们产品的运行原理,感兴趣的话可以看看这里

Cloudflare 及其著名的橙色云图标

本博客于 2021 年末开始使用 Cloudflare 提供的服务优化访问质量。

将网站接入 Cloudflare

要使用 Cloudflare 提供的服务,需要在域名注册商处对域名进行配置:将域名解析系统(Domain Name System,DNS)服务器记录修改为由 Cloudflare 托管的服务器。网站管理员需要在 Cloudflare 官方网站注册账户并登录,然后根据页面提示操作即可,全程不到 5 分钟时间。如果你之前没有注册过域名,Cloudflare 提供了零加价的域名注册服务,只收取成本价格的费用,注册域名的价格比其他域名提供商处都要低。你可以在 Cloudflare 控制面板的“域名”一栏中找到注册入口。

如果你的域名针对某些子域设置了单独的域名服务器(Name Server,NS)记录,则需要注意在接入 Cloudflare 的免费层级后,这些设置将不再可用。Cloudflare 在其 Business 及以上层级提供了自定义域名服务器的有关支持。

……域名服务器(NS)记录指示哪个 DNS 服务器对该域具有权威性(即,哪个服务器包含实际 DNS 记录)…… DNS 服务器,上面存储了域的所有 DNS 记录,包括 A 记录、MX 记录或 CNAME 记录……

描述摘自 Cloudflare Learning Center

按照页面提示设置完毕后,网站管理员即可在“站点控制面板”中按需开启 Cloudflare 提供的相关功能了。本文接下来的部分将会对 Cloudflare 的重要功能进行介绍。

域名解析服务

由于已设置 Cloudflare 管理的服务器作为域名的 DNS 服务器,因此 Cloudflare 将负责管理并解析域名本身的解析记录。管理员可以在域名 DNS 面板中对该域名的解析记录进行设置,设置解析记录的方法与其他的解析服务提供商大致上是相同的。

不过与传统域名 DNS 服务商不同的是,当管理员设置 A、AAAA 与 CNAME 记录时,Cloudflare 的解析记录会询问管理员是否设置“橙色云”图标。这是由于 Cloudflare 服务的工作原理是基于反向代理的。当管理员设置橙色云图标时,用户首先访问到的是来自 Cloudflare 托管的服务器,Cloudflare 的服务器会根据访问策略将用户的请求重定向到网站的源服务器上。

使用橙色云记录时,用户解析对应域名获得的 IP 地址指向 Cloudflare 的服务器,而非源服务器——别忘了 Cloudflare 是个反向代理服务

如果对于特定的解析记录使用“灰色云”图标,Cloudflare 的 DNS 解析服务器会返回源服务器的 IP 地址给最终用户。这样一来,当用户的系统解析该域名时,会获得源服务器的 IP 地址:用户直接与源服务器之间建立连接。很显然,在“灰色云”图标下用户无法使用到 Cloudflare 提供的各种功能,并且由于直接获得了源服务器的 IP 地址,恶意用户可以直接构造对源服务器的攻击,以试图耗尽服务器资源。尽管如此,有一些特殊情形可能会用到“灰色云”图标:如网站的管理员希望用户访问 Web 服务以外的其他服务(因为 Cloudflare 免费层级的支持端口范围是有限的)、或将用户重定向到一个外部主机等。

再次强调,在“灰色云”情况下,源服务器 IP 地址会被解析,因此恶意攻击者可能会构造对源服务器的直接网络攻击(如 DDoS 攻击等)。一些高级攻击者还可能通过查阅域名的历史解析记录来猜测源服务器 IP 地址,即使已经在稍后将域名解析切换到橙色云图标也是如此。

HTTPS 与访问优化加速

如果站点域名是由 Cloudflare 托管的(“橙色云”图标,还记得吗),那么管理员可以准确控制 Cloudflare 访问源服务器,以及 Cloudflare 将内容呈递给用户时的优化方式。

HTTPS(SSL/TLS)支持

HTTPS 是一种安全地向用户呈递网页内容的传输协议,它使用 SSL/TLS 协议来加密数据包。Cloudflare 为站点的 HTTPS 支持提供了几种层级:

  • 关闭(不安全):在 Cloudflare 与源服务器,以及 Cloudflare 与用户之间都不主动应用加密链接
  • 灵活:加密 Cloudflare 与用户之间的流量,这样以来,用户访问站点时能够在地址栏看到“安全链接”标识
  • 完全:除“灵活”要求以外,还额外加密 Cloudflare 与源服务器之间的流量
  • 完全(严格):除“完全”要求以外,Cloudflare 还要求源服务器提供有效的证书

作为网站管理员,我们当然希望用户看到的内容在传输过程中均保持安全,我们推荐使用“完全(严格)”模式。值得注意的是,该模式要求源服务器本身能够提供有效的证书,“有效”意味着服务器证书满足以下两种情况之一:

如果你使用的是 Apache 或者 Nginx HTTP 服务器,那么可以考虑使用来自 Let’s Encrypt 颁发的免费证书。若对于证书的有效时长有要求,则可以考虑由 Cloudflare 生成的自签名 Origin CA 源证书,可以设置从最短 7 天到最长 15 年的有效期。

如果不希望用户直接通过连接站点源服务器的方式访问网站(即,只允许用户透过 Cloudflare 的方式访问),则还可以在源服务器的 HTTP 服务器应用程序(如 Apache 或 Nginx)上设置“经过身份验证的源服务器拉取”功能,以确保所有向源服务器发送的请求均来自 Cloudflare。

在 Cloudflare 控制面板中的“SSL/TLS”页,还提供了新版本 HTTP 协议与 TLS 协议有关的高级控制选项,网站管理员可以多加关注。

访问优化加速

在 Cloudflare 控制面板中的“速度”与“缓存”页中为用户提供了多种对于页面访问速度的优化加速选项。这些选项通过控制静态内容缓存以及 Cloudflare 向用户呈递内容的方式来优化用户访问站点的速度。

需要注意的是,Cloudflare 在全球 250 多个城市(2022 年数据)拥有靠近用户的服务器,在用户访问站点时,Cloudflare 的解析服务会通过任播(Anycast)技术由靠近用户地理位置的服务器为用户提供服务。然而,为个人用户提供的 Cloudflare 服务器组中并不包括位于中国大陆地区的服务器(Cloudflare 在国内与京东云进行合作,为拥有 ISP 许可证的企业用户在中国大陆提供服务)。所以,如果你的站点主要面向位于中国大陆的用户,请考虑或许可能在中国大陆地区设置单独的服务器来服务该地区的用户。

由于 Cloudflare 默认会对站点中的静态内容(例如图片和影音文件)进行缓存,特别需要注意的一点是,在开发过程中网站管理员可能需要开启“开发模式”,在该模式下,用户的访问请求将绕过缓存,以实时查看源服务器上的最新更改。请求量较大的情况下开启“开发模式”可能会对源服务器造成较大压力。

一个不是那么容易发现的坑是,如果你的站点同时托管页面所需的 css 文件等,并且在代码中启动了子资源完整性检查(SRI),则由于 Cloudflare 的一些优化选项可能会改写页面中的文件资源内容,导致资源的哈希校验不匹配。

防火墙与页面规则

Cloudflare 的网络曾缓解过规模最大的分布式拒绝服务(DDoS)网络攻击。他们产品的最大卖点是对于 DDoS (和其他)攻击的无计量免费缓解,即使对于免费层级的用户也是如此。这样一来,如果你的站点曾经或正在遭受攻击,将流量引导到 Cloudflare 是特别合适的选择。网站管理员可以通过设置多种防火墙与页面规则来针对特定流量进行过滤。

在 Cloudflare 中存在一个名为“流量序列”的概念,表明用户的请求在从 Cloudflare 到达源服务器的过程中都经过如下处理环节:

  • DDoS:缓解从网络层到应用层之间的不同种类 DDoS 攻击,其中对于 HTTP DDoS (L7)攻击的防护,用户还可以设置不同的规则敏感度以及质询方法。对于访问页面(而非 API)的请求,Cloudflare 还可能使用 JavaScript 质询来确定用户
  • 转换规则:对于免费层级的用户,最多可以定义 10 个相关规则,以实现 URL 重写、HTTP 请求/响应表头修改的功能
  • 页面规则:免费层级的用户最多可以定义 3 个页面规则。页面规则是一套 URL 模式-处理方式的规则集,比如,用户可以向符合某一个特定前缀的 URL 请求发送 301(永久重定向)HTTP 状态代码,也可以对特定的 URL 关闭或开启缓存
  • IP 访问规则:网站管理员可以按 IP 地址范围或自治系统编号(ASN)来实现单独的访问控制(允许、质询或阻止这些用户访问站点)
  • 自动程序:向来自已知的自动程序的访问请求进行 JavaScript 质询
  • 防火墙规则:在应用层(L7)使用 IP 地址、HTTP 表头、用户地域来对请求进行过滤,被阻止的用户将会看到来自 Cloudflare 托管的拒绝访问页面,免费用户最多可以创建 5 个防火墙规则

JavaScript 质询:JavaScript 质询页面将要求访问者等待 5 秒钟,让 Cloudflare 确定访问者是否来自真实的浏览器。质询要求访问者浏览器回答一道数学问题,计算该问题将需要一些时间。正确回答问题后,系统将记住该浏览器,并且不会再质询该浏览器。

——来自 Cloudflare 控制台(简体中文)的帮助文本

由于来自用户的请求首先被引导到 Cloudflare 托管的边缘服务器,在请求量大时,由 Cloudflare 执行防火墙规则比起来在源服务器上设置相应规则要方便地多。同时,如果你正在使用 Cloudflare Access 或 Cloudflare Worker,则相应规则也会应用到请求处理的过程中。

其他功能

在站点控制面板中,Cloudflare 还提供了一些未被归类在上述分类中的其他功能,包括可以查看请求量、请求地域,以及受威胁情况的数据看板,还有自动转发域电子邮件的功能等。Cloudflare 会不时推出一些新的有趣的功能供大多数用户体验。

如果你创建的防火墙规则较多,或希望使用来自 Cloudflare 的高级优化功能,可以考虑将站点计划从免费版本升级到某一适当版本,也可以考虑单独购买 Cloudflare 提供的特定功能(如图片和视频托管)。多说一句,个人免费用户在 Cloudflare 总体用户比例中占有不小份额,其竞品 Fastly 主要服务于付费企业用户。一些云服务提供商(如阿里云或 AWS)也有对应付费层级的服务,Cloudflare 提供的服务是我用过的体验最好的服务,且大多数小型站点均可使用其免费层级的服务。

法律与商标信息

本篇以信息及教育目的撰写的文章涉及到的内容包含 Cloudflare, Inc. 的相关产品,作者相信本篇文章中包含的 Cloudflare 字样、Cloudflare 橙色云与灰色云徽标以及相关产品的名称符合 Cloudflare 商标使用规范。如有问题,请通过博客中公布的任一联系方式联系我。