[摘要] 国内运营商DNS劫持现象真的很严重,今天在家从 redis 官网下载 redis 最新版本时居然下载失败,稍微瞅了眼,尼玛,居然又是被运营商(歌华有线)劫持了,小爷正好今天闲着,把我曾经遇到的运营商DNS劫持现象列举一下,对不良运营商劫持的可耻行为予以严正声明和谴责。
案例一:
也就是今天遇到的情况,我从redis官网下载stable版本,发现居然给劫持到了这样一个地址:http://119.90.25.22/download.redis.io/redis-stable.tar.gz
下面是几个当时的截图:
下载被劫持的效果:
看一下运营商缓存的webserver http header:
劫持 https baidu的效果
劫持 https 支付宝的效果(一不小心发现了支付宝用的Tengine-2.1.0 嘻嘻)
案例二:
我们曾经对公司的一款手机端App应用做过分析,通过App的访问行为进行日志打点,由于下载域名走的CDN,重点是对该产品的CDN下载失败情况做了统计分析,下面是下载被劫持情况:
IP 失败次数 占比 运营商 117.146.116.26 1229 0.093343% 中国 新疆维吾尔自治区 乌鲁木齐市 运营商 : 移动 117.146.116.21 1170 0.0888619% 中国 新疆维吾尔自治区 乌鲁木齐市 运营商 : 移动 10.2.254.51 299 0.0227091% 局域网 | 对方和您在同一内部网 (客户端IP:43.240.57.73 天津市联通) 60.191.124.236 135 0.0102533% 中国 浙江省 杭州市 运营商 : 电信 (客户端IP:125.116.215.18 浙江省 宁波市 电信ADSL) 60.191.124.247 46 0.00349372% 中国 浙江省 杭州市 运营商 : 电信 219.233.31.83 31 0.00235446% 中国 上海市 运营商 : 有线通 (122.225.36.255 浙江省 嘉兴市 电信) 219.233.31.84 29 0.00220256% 中国 上海市 运营商 : 有线通
(1)能看到中国移动劫持现象非常严重,为了节约网间流量,各省移动分公司分别找了不同的CDN厂商或者自己做了一层 cache 缓存,针对一些大文件的下载进行了可耻的DNS劫持,主要是针对.zip .apk .ipa .exe .png .jpg等后缀的文件进行劫持。如果说为了节约运营商的网间结算成本,我们也能理解,但是你这层cache好用也行,我们测试的情况是经常域名给劫持到你们缓存节点了,但是cache不工作,用户根本下载不了,严重影响了用户的体验,一些偏远省份的移动分公司劫持现象尤为严重,新疆移动就更不必说了。
(2)从IP地址看居然还有局域网的,这种IP是如何来的我就不得而知了。
案例三:
教育网也有劫持现象,之前记录过这样一个下载,通过跟踪下载路径,很明显是被教育网劫持了。
$ wget -S http://www.sudops.com/Packages.bz2 --2016-12-12 17:14:05-- http://www.sudops.com/Packages.bz2 Resolving www.sudops.com... xxx.xxx.xxx.xxx Connecting to www.sudops.com|xxx.xxx.xxx.xxx|:80... connected. HTTP request sent, awaiting response... HTTP/1.0 302 Found Location: http://58.135.196.199:80/AESd/MLPhCwEZRV-i71-IOJkw41h_/Packages.bz2 Connection: Close Location: http://58.135.196.199:80/AESd/MLPhCwEZRV-i71-IOJkw41h_/Packages.bz2 [following] --2016-12-12 17:14:06-- http://58.135.196.199/AESd/MLPhCwEZRV-i71-IOJkw41h_/Packages.bz2 Connecting to 58.135.196.199:80... connected. HTTP request sent, awaiting response... HTTP/1.1 200 OK Server: ATS/3.2.0 Date: Wed, 12 Dec 2016 09:14:06 GMT Content-Type: application/octet-stream Content-Length: 280210 Last-Modified: Wed, 12 Dec 2016 12:14:17 GMT ETag: "5655a619-44692" Expires: Fri, 31 Dec 1970 16:00:00 GMT Cache-Control: no-cache Age: 0 Connection: keep-alive Via: http/1.1 ts-lx-edu (ApacheTrafficServer/3.2.0 [c sSf ]) Length: 280210 (274K) [application/octet-stream] Saving to: ‘Packages.bz2’ 100%[============================================================================>] 280,210 --.-K/s in 0.08s 2016-12-12 17:14:06 (3.37 MB/s) - ‘Packages.bz2’ saved [280210/280210] $ curl cip.cc/58.135.196.199 IP : 58.135.196.199 地址 : 中国 北京市 数据二 : 北京市 | 教育信息网
还有一些令人深恶痛绝劫持现象:
(1)一些小运营商 ISP(小区宽带)也是劫持大户。这些运营商劫持更为恶劣,有时候会通过劫持将原下载包进行替换,严重干扰的一些公司产品的正常运营行为,属于恶意推广,必须进行严惩。
(2)一些免费的Wifi也是劫持大户,有些公司会为一些公共场所(商场、酒店、餐馆等等)提供免费的wifi设备,无线AP接入等等,当然他们是不会做亏本买卖的,这些设备提供方或者施工方会通过wifi进行劫持或者推送他们的广告或者推广应用,也有可能搜集用户信息,所以那些不可信任免费的wifi尽量少用。
对于如何规避劫持现象目前没有什么特别好的办法,我了解的可行方案的有两个:
(1)HTTPDNS
一些大公司的APP产品使用的比较多。简单的说,用户下载一个地址(URL)的时候首先会请求一个ip地址,这个地址会根据用户的所属地、运营商网络情况等返回最快的下载地址,由于这个请求的流量非常小,而且是动态生成,运营商一般不会进行劫持,然后用户通过返回的结果再进行第二次请求,这次是真正的下载,这样就避免了DNS解析这层,也就防止了运营商的劫持。
(2)HTTPS
使用HTTPS的话,由于没有对应的证书,所以按照目前运营商的能力是无法劫持的,所以建议所有的web站点、下载地址、api接口等等全部走HTTPS,绝不给运营商可乘之机。