运营商劫持

一、运营商劫持

运营商是指那些提供宽带服务的 ISP,包括三大运营商中国电信、中国移动和中国联通,还有一些小运营商。运营商都是提供最基础的网络服务,网络运营商为了卖广告或者其他经济利益,有时候会直接劫持用户的访问,目前,运营商比较常见的劫持方式有两种,分别是 DNS 劫持,HTTP 劫持。

二、劫持分类

1. DNS 劫持

DNS 劫持也可以理解为用户的请求去往了错误的 DNS 服务器进行查询解析,返回来的目的主机 IP 是运营商的中间服务器 IP,访问该服务器会一致性的返回 302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过 iframe 打开用户原来访问的地址。

2. HTTP 劫持

在运营商的路由器节点上,使用旁路设备设置协议检测,一旦发现是 HTTP 请求,而且是 html 类型请求,则拦截处理。后续做法往往分为 2 种,1 种是返回 302 让用户浏览器跳转到另外的地址,还有 1 种是在服务器返回的 HTML 数据中插入 js 或 dom 节点(广告),浏览器收到 302 代码后就会跳转到错误的地址,或者修改了的 HTML 有广告,随后返回的真正数据到达后反而会被丢弃。

三、HTTP 劫持的防御

旁路设备中检测http协议的模块比较简单,一般只会检测TCP连接建立后的第一个数据包,如果其是一个完整的http协议才会被标记;如果并非是一个完整的http协议,由于无法得到足够多的劫持信息,所以并不会被标记为http协议。

所以,防止劫持的办法是:

  1. 终端拦截所有响应包,判断ip来自黑名单(劫持的中间ip)则丢弃返回包。

    运营商劫持 HTTP 请求后,并不是完全丢弃请求包,而是做了复制,一份继续发给目标服务器,另外一份做劫持处理直接返回 302。因为这个 302 会比目标服务器的正常返回早得多,所以用户浏览器会只认第一个 302,而丢弃后到的正常返回。如果先把第一个 302 丢弃,等待后续正常返回,则问题解决。

  2. 终端拦截请求包,并拆包发送。

    运营商一般判断是否劫持,通过判断是否 HTTP 请求。 一般只会检测 TCP 连接建立后的第一个数据包,如果其是一个完整的 HTTP 协议才会被标记;如果并非是一个完整的 HTTP 协议,由于无法得到足够多的劫持信息,所以并不会被标记为HTTP协议。所以,只要将 HTTP 请求分拆到多个数据包内,就能躲过一部分劫持。