CDN系列学习文章(七)——DNS&HTTP劫持篇

当你打开网页或者APP时,发现有些内容与当前业务几乎没有什么联系,而且这些内容有明显的营销或广告意图,这种场景大概率是劫持现象了。

1.为什么要劫持?

所谓劫持,顾名思义,正常通道被拦截。这里通道就是用户请求和响应的消息通道,劫持并不是阻塞消息通道,而是非法指向一些不合理节点或者返回一些不合理响应。

为什么会有劫持呢?归根到底利益驱动。一方面涉及到运营商之间网间结算的问题,这部分费用对小运营商来讲很昂贵,因此为了节省成本,小运营商会对某些域名流量进行劫持。另一方面做广告或者有针对性的引导,很多是劫持者为了插入广告而获利才做的劫持。

2.如何定义劫持?

劫持种类有很多,在CDN业务内常见有DNS劫持(域名劫持)和HTTP劫持(内容劫持)。

DNS劫持(域名劫持)

这类劫持就是DNS解析到的IP节点并非是该业务CDN覆盖节点IP,运营商为了节约省间或者运营商网间结算费用,将大流量域名内容缓存在自己节点,当用户发起DNS解析,直接解析到自己缓存节点。这类劫持现象是访问的资源可能不是最新的,有滞后性。该类劫持,CDN业务客户反馈,一般通过第三方(博睿&听云服务商)进行验证识别。

HTTP劫持(内容劫持)

  • 302劫持。用户正常的请求能够请求到CDN节点,但是正常请求返回200OK,通信链路修改HTTP响应头为302,并插入location字段,导致用户强制跳转到非法节点响应。流程如下:
302劫持流程
  • 内容劫持。用户正常的请求能够请求到CDN节点,但是正常请求返回200OK,经过http请求被标示,并通过旁路设备改写HTTP响应内容(例如HTML插入iframe),抢先回包策略,响应给用户。
HTTP响应劫持

3.如何预防劫持?

针对CDN场景下的劫持,根据数据链路有以下几种方案

  • 针对DNS劫持。由于LDNS解析是不可控的,这边建议业务使用HTTPDNS,然后DNS请求,来规避DNS劫持。各家云厂家都有成熟的HTTPDNS的SDK&API调用模式。详见https://cloud.tencent.com/document/product/379
  • 针对HTTP劫持。全站业务使用HTTPS方案,注意这里指的是全站,并不是其中一个业务域名
  • CDN防劫持方案。1)全链路HTTPS 2)对内容的MD5验证 3)回源直接IP回源,减少回源链路DNS劫持。4)中间链路私有协议SDN传输。