从2017开始,登录steam就变成了一个时灵时不灵的玄学问题,我之前发了一篇关于Steam登录不了的原理文章,但是由于我没有考虑最新的SNI阻断攻击,所以删除了前一篇文章,重新组织一下介绍一下其中的技术原理。
起初,GFW通过DNS污染以及HTTP报文关键字检测来拦截访问Steam社区内容。
关键字检测又被称为被动网络过滤器,其原理是通过检测互联网报文中的IP和内容信息,当发现关键IP时,介入该连接中,伪装成连接一方向另一方发送reset数据包,即TCP重置攻击,从而断开连接。
DNS是域名解析服务,因为以steam为例,当我们访问steamcommunity.com时,我们会向DNS服务器请求这个域名对应的IP地址,从而连接到steam服务器。
DNS污染是指用户访问地址时,需要先向DNS服务器请求域名解析,攻击者服务器伪装成DNS服务器,向用户发回错误的IP地址。这种污染主要通过篡改递归DNS服务器上的缓存内容实现,因为DNS协议本身不检查IP是否正确,容易遭到攻击,浏览器访问会出现
ERR_CONNECTION_TIMED_OUT错误,因为DNS会被指向一个不可访问的地址,访问也就超时了。解决方法也不难,需要在本地就做好域名解析,通过修改Hosts文件直连steam的IP访问。
但是这不是结束,2018年开始,Steam社区默认采用HTTPS链接(即安全加密连接),所有的浏览内容都会被加密,报文关键字检测的方法也就失效了。随后出现了更深层次的审查方法,也就是要详细介绍的SNI检测阻断。
TLS,又名安全传输层,它的前身是SSL,它实现了将报文加密后再交由TCP进行传输的功能,即HTTP + TLS = HTTPS,现在几乎所有的网站都是以HTTPS来保护连接安全。正常情况下,TLS握手在Client Hello阶段,由于双方还未协商好加密方式,报文仍然是明文状态,其中Extension字段包含了SNI信息,也就包含了当前正在访问的域名steamcommunity.com,可以抓包获取到。正常情况下,服务端根据这个域名发送相应的域名证书,进行接下来的握手步骤,在协商完后开始使用加密通信。
但是,SNI已经暴漏,审查机构会对当中的域名进行检测和阻断,也就是最开始关键字检测提到的TCP重置攻击,通过对双方发送RST报文使连接重置,如果是浏览器访问就会出现ERR_CONNECTION_RESET错误。
现如今SNI阻断是最常用的墙的方法,Steam和Github都是被这种方法阻断的,解决这类问题有两种比较常用的方法,第一个是本地反向代理,第二个是虚拟专用网。
本地反向代理技术,是将Steam社区等域名添加到Hosts文件中并指向localhost,这里的localhost仅做为一个本地安全跳板,供Nginx(HTTP反向代理工具)正常监听的同时又能防止流量外泄。Nginx将监听到的数据中的SNI信息去除(从而规避过滤),再送向CDN的IP,使用IP而不使用域名是为了防止DNS污染,既实现完整通信又不被DNS污染和SNI阻断终止。
虚拟专用网技术,即大家耳熟能详的Virtual Private Network(未批恩),可以把它形象地理解成一个管道,它的作用是在公有网络中构建专用的虚拟网络,连接双方在管道地两端进行通信,从而规避检查,大家常用的小黑盒加速器就是使用了虚拟专用网。
最后,很感谢昨天一位大佬指出SNI的错误,我一开始把SNI阻断归到了关键字检测里,但是其实这两种技术不完全相同,我一直以来就认为小黑盒是一个非常开放而包容的社区,大家不仅一起交流游戏的乐趣,还分享生活乐趣,交流知识,我也希望以后可以给大家带来更多网络安全和密码学的分享,如果还有错误希望有大佬指出