Sukka's Blog

童话只美在真实却从不续写

ISP 经常搭设缓存服务器为了加速大流量传输、减少发往骨干网方向的流量。我们可以利用运营商架设的这些缓存服务器,用来加速一些国内的大文件下载,或者用来改善文件在部分地区的下载(比如 Chrome 离线包的下载)。

这类 SNI 代理的特点就是可以用 http://{ip}/{path_to_file} 的方法访问(注意,仅支持 HTTP 请求时返回 200 的文件),所以根据这个特性就可以把这些缓存服务器找出来。
首先找一个支持 HTTP 访问的图片文件,最好是小文件、还是 CDN(因为这样速度比较快,而且运营商的 SNI 缓存代理服务器可以快速回源并缓存)。这样的图片文件很好找,我直接把我的头像上传到微博图床,得到这个 http://ws2.sinaimg.cn/large/0072Lfvtly1ftyzouv1h6j3020020glm.jpg

有了这个,就可以写个可以在浏览器 Dev Tools 的 console 里运行的脚本啦。

/*!
* SNI Proxy Scanner Tool for /24 (Dev Tools Console Version)
* Author: SukkaW
* Link: https://blog.skk.moe/post/isp-sni-cache/
* Usage: ip 的格式为 1.1.1 即省略最后一位和点,执行 test('ip'); 使用 console.log(success) 输出结果
*/
window.success = [];
function test(ip) {
for(var idx=0;idx<256;idx++){
var el = document.createElement('img');
el.src = '//' + ip +'.' + idx + '/ws2.sinaimg.cn/large/0072Lfvtly1ftyzouv1h6j3020020glm.jpg';
el.setAttribute('ip', ip + '.' + idx);
el.onload = function() {window.success.push(this.getAttribute('ip'))};
}
console.log(window.success)
}

注意在通过 HTTP 访问的页面的 console 里运行,这样可以避免 Mixed Content 和 CSP 导致的图片无法加载的问题。这样的网页也挺好找,不是嘛,你要是找不到,可以试试 http://news.baidu.com/

一个很有趣的问题,上面这段代码是我两分钟里弄出来的,所以只支持扫描一个 /24 中的 SNI 代理服务器。那么怎么从浩瀚的 IPv4 池里定位运营商的 SNI 缓存服务器 IP 呢?使用搜索引擎搜索类似 运营商缓存 运营商 SNI 这种关键词,看看之前有没有人发现了个别的运营商 SNI 缓存服务器的 IP,然后这个 /24 和相邻的 /24 之中多半都有成片的缓存服务器。而且一个很有趣的发现,就是运营商把这些缓存服务器上的 IP 收回后会被分配给 CDN,有的时候在 CDN 的成片的 IP 段中寻找,常常也能找到惊喜。比如我已经扫完了 120.52.72.0/24 了,之前这里面有不少联通的缓存服务器,现在这个段回收以后给了河北廊坊,其中不少 IP 变成了 CDN 的 IP。

在寻找运营商的 SNI 缓存服务器的时候还能发现很多有趣的现象,比如会发现运营商的 SNI 缓存服务器绝大部分都是 HTTP 1.0;如果无法回源并缓存的文件,有的会返回 404 的状态码但是有的会返回 502;有时你还可以在一些报错页面找到域名 ispcache.cn

当然老在 console 里复制上述代码总是太麻烦,所以我写了一个页面专门来做这个: https://lab.skk.moe/sni 使用这个页面就可以快速扫描运营商的缓存服务器了。

需要注明的一点是,有的 SNI 缓存服务器不能通过 http://{ip}/{path_to_file} 的方式去使用,必须使用 hosts 添加、DNS 污染的方式使用,;还有的运营商学聪明了怕自己的缓存服务器被滥用、就上线了缓存 key、更换非常规端口等方式;这样的缓存服务器我的这个扫描脚本自然是没法找到的了。

本文作者 : Sukka
本文采用 CC BY-NC-SA 4.0 许可协议。转载和引用时请注意遵守协议!
本文链接 : https://blog.skk.moe/post/isp-sni-cache/

本文最后更新于 天前,文中所描述的信息可能已发生改变