CDN技术浅谈


为什么要使用CDN?

       网络已经成为生活中必不可少的一部分,无论是清早手机翻看的新闻八卦,还是公交地铁里刷的停不下来的短视频,又或是你闲逛的购物网站,热追的电视剧,都与 CDN 有着密不可分的联系。无论你在互联网上做什么,或者消费什么类型的内容,其实每个文本字符、每一帧图像背后都会有 CDN 的助力。

       CDN(Content Delivery Network,即内容分发网络)主要通过将访问内容缓存在边缘节点,缩短用户与网站的距离,来提高站点渲染速度和性能。很显然,CDN 发挥的作用主要由边缘节点来呈现,边缘节点作为用户与源站的桥梁,其实不仅仅只起到加速的作用,同时还可以作为恶意访问的“屏障”。

CDN架构图

CDN架构图

一、CDN访问控制

IP黑白名单

由于某些行业竞争激烈,因此常常会遇到一些竞争对手利用恶意 IP 占用网站资源,影响网站访问。为了能够保护站点数据和流量负载,需要网站运营者对这些恶意 IP 进行屏蔽。

若需要禁止某些 IP 或只允许某些 IP 访问,可以使用 IP 黑白名单功能。并且在同一时间内,CDN只支持生效一种规则,比如:要么禁止某些 IP 访问,要么允许某些 IP 访问。支持 * 通配符,如 10.11.12.*,将禁止或只允许10.11.12.0 ~ 10.11.12.255范围的 IP 访问。

地区访问限制

地区访问限制是指根据加速网站的需求,允许或禁止特定区域的终端用户对网站资源的访问。即网站指定地区,允许该地区终端用户访问,而限制其他地区用户访问,或者相反。

防盗链

在讲防盗链之前,先来了解一下什么是盗链。

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向终端用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。

简单来说,就是其他网站上“盗”用了你网站的资源,去增加他的网站点击率,但最后流量却算在你身上,让你花“冤枉钱”。这个当然不能忍!怎么办?由于各网站性质不同(游戏/新闻等),需求也是不尽相同的。

Referer防盗链

最常用的防盗链手段,就是通过对 HTTP 请求中的Referer Header进行判断,来决定用户是否可以访问该资源。

白名单:仅允许名单中的域名网站访问文件,其他域名网站都不允许访问。

黑名单:仅禁止名单中的域名网站访问文件,其他域名网站都允许访问。

Referer 为空:若禁止即不允许用户直接访问该资源,因为直接在浏览器的地址栏中输入一个资源的 URL 地址,请求是不会包含 Referer 字段的。

User-Agent防盗链

HTTP 请求 Header 中的User-Agent字段,是一段浏览器或者设备标识的字符串。对于网站本身来说,有时需要让一些资源只能在某些浏览器或者设备上才能访问。

CDN 支持针对 HTTP 请求头中的User-Agent信息,禁止或者允许符合特定User-Agent规则的请求。具体的使用场景例如:某客户端拥有自己专属的客户端对资源进行下载,该下载工具在请求时,使用了定制的User-Agent名称,或只允许此类User-Agent请求资源,此时可以配置User-Agent白名单就可以实现。

Token防盗链

Token 防盗链是提供时效性访问的。通过设置访问密钥和过期时间来达到加密文件的目的。只有按照算法成功计算出 Token 才能进行访问。比如网站有些内容,希望付费才能访问,且规定访问有有效期,就可以通过 Token 防盗链来实现。

回源鉴权

如果不希望对方知晓你的防盗链规则原理,或者 CDN 无法满足的特殊防盗链需求,也许也需适合你的防盗链选择就是回源鉴权了。

回源鉴权是一种高级的防盗链方式,需要在源站配置一台鉴权服务器,并设置鉴权方式。之后 CDN 边缘节点每次接受到请求之后,都会回用户源站的鉴权服务器进行验证,验证通过之后才认为是合法请求,CDN 才会继续提供服务。

回源鉴权适用于对防盗链有很高实时性要求的场景,当然因为每次请求都需要鉴权服务器的验证,在开启该功能时也需要考虑到访问量过大时鉴权服务器的压力。

IP访问限制

可以针对单个 IP 在单位周期时间内的访问频率设置一定的阈值,将超过该阈值的 IP 的访问进行直接拦截,从而达到访问限制的目的。

当前的单 IP 访问频率只支持针对 CDN 单个边缘节点生效,当达到设定的阈值时,异常访问的客户端 IP 将加入黑名单中,并可以设定生效时间,在该时间周期内,所有该 IP 的访问都会被拦截。

浏览器缓存配置

Cache-Control: max-age=600
Expires: Tue, 24 Aug 2021 06:58:41 GMT
Date: Tue, 24 Aug 2021 06:48:41 GMT
Last-Modified: Thu, 12 Aug 2021 12:42:42 GMT

CC防护

攻击一直都是让网站管理者头疼的问题,特别面对恶意的 DDoS 攻击时。CC 攻击(Challenge Collapsar)是 DDoS的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向受害网站不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。

CC 防护主要是针对 CC 攻击的一种应用层攻击防护,该功能通过自定义匹配规则对目标资源进行监控,当请求频率达到触发频率时,对疑似攻击请求进行校验,校验通过则允许访问;校验不通过,则直接禁止访问。

CORS跨域共享

基于业务场景添加 HTTP 头部,包括 HTTP 请求头和 HTTP 响应头,例如:添加跨域配置。具体规则描述如下:

if($_HOST == www.example.com){
  ADD_Response_Header Access-Control-Allow-Origin "*"
}

刷新预热

全站加速提供资源的刷新和预热功能。通过刷新功能,可以强制全站加速节点回源并获取最新文件;通过预热功能可以在业务高峰之前预热热门资源,提高资源访问效率。

反向代理中的IP传递

["HTTP_X_REAL_IP"] => string(31) "2409:896a:31:bc6a:2:1:7447:a924"
["HTTP_X_EDGE_RETRY_TIMES"] => string(1) "-"
["HTTP_X_FORWARDED_FOR"] => string(31) "2409:896a:31:bc6a:2:1:7447:a924"
["HTTP_X_REQUEST_ID"] => string(32) "5b16d20b4133036df1a1e272c116caf8"
["HTTP_CLIENT_IP"] => string(31) "2409:896a:31:bc6a:2:1:7447:a924"

应用服务器收到的是

["x-real-ip"] => string(31) "2409:896a:31:bc6a:2:1:7447:a924"
["x-forwarded-for"] => string(31) "2409:896a:31:bc6a:2:1:7447:a924"
["x-request-id"] => string(32) "5b16d20b4133036df1a1e272c116caf8"
["client-ip"] => string(31) "2409:896a:31:bc6a:2:1:7447:a924"

二、CDN常用头部控制

  1. If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
  2. If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。
  3. If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器 该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
  4. If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
  5. If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
  6. Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT
  7. Location:WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。例如:Location:http://i0.sinaimg.cn/dy/deco/2008/0528/sinahome_0803_ws_005_text_0.gif</a>
  8. Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。例如:Pragma:no-cache
  9. Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。
  10. Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546-
  11. Referer:浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。例如:Referer:http://www.sina.com/

三、DNS解析

(1)DNS服务器类型

权威DNS 指域名在域名注册商处所设置的 DNS 服务器地址。该地址决定了该域名的解析管理权(新增,删除,修改等)。比如DNSPod的权威服务器:*.dnspod.net, *.dnsv3.com等。当域名设置权威服务器并设置了解析记录后,客户端请求域名时,权威服务器将返回该域名的对应的解析记录信息。

LocalDNS 是DNS查询中的第一个节点。Local DNS作为客户端与 DNS 域名服务器的中间人。客户端发送DNS查询时,Local DNS将使用缓存的数据进行响应,或者将向根域名服务器发送请求,接着向根域名服务器发送另一个请求,然后向权威DNS发送最后一个请求。收到来自包含已请求 IP地址的权威DNS服务器的响应后,Local DNS将向客户端发送响应。 在此过程中,Local DNS将缓存从权威DNS服务器收到的信息。当一个客户端请求的域名IP地址是另一个客户端最近请求的IP地址时,Local DNS 可绕过与域名服务器进行通信的过程,并仅从第二个客户端的缓存中为第一个客户端提供所请求的记录。

公共DNS 指面向所有互联网用户的全球公共递归域名解析服务。和仅使用本地LocalDNS的传统解析服务相比,公共解析服务,一般具备更加“快速”、“稳定”、“安全”互联网访问。

(2)MX和CNAME解析记录冲突问题

在递归进行解析查询时,各记录类型之间是有优先级的,所以在主机记录相同、解析线路相同的情况下,有几种记录类型不能共存使用,否则会给用户造成配置风险,导致业务不可用的情况发生。

以下拿CNAME记录和MX记录的冲突来举例:假设为come.com配置如下两条记录

记录类型 主机记录 记录值
MX @ mx1.hichina.com
CNAME @ www.liaocheng.co

结论 按照RFC标准协议CNAME优先级最高,所以在解析请求过程中,会优先返回CNAME解析记录结果,这样设置的结果导致用户无法请求到MX记录,直接对客户的邮箱业务造成使用影响。所以对于这类情况,云解析DNS会通过记录冲突的提示方式,来帮助用户避免这种配置风险。

解析冲突解决办法 1:最简单的办法就是,可以通过使用URL转发记录来解析CNAME记录和MX记录冲突问题,这个种办法少有DNS服务商可以免费提供,不想花钱继续下边看其他的办法。 2:使用A记录代替CNAME,然后在服务器上做301跳转。 3: 使用二级域名做MX记录。

四、CDN常用计费方式

流量计费

适用于域名流量曲线波动较大,且有带宽尖峰的用户。

峰值带宽计费

适用于域名稳定的业务流量曲线比较平稳。

五、CDN服务商

国外

CloudFlare、Akamai

国内

阿里云、腾讯云、百度智能云、百度云加速、网宿、蓝汛、白山云、又拍云、七牛云、青云、猫云、多吉云


参考文献

CDN访问控制的那些事

如何选择适合自己网站的防盗链

高性能利器:CDN我建议你好好学一下!