一些专业名词的介绍

HTTP(Hyper Text Transfer Protocol)

超文本传输协议,日常浏览的各种网页都是通过HTTP协议传输,但是它的传输过程没有加密,不安全。
目前所说的支持HTTP一般是指HTTP和HTTPS功能都可以实现,而不是单单支持HTTP。

TLS(Transport Layer Security)

安全传输层,它的前身是SSL,它实现了将报文加密后再交由TCP进行传输的功能。即HTTP + TLS = HTTPS

SNI(Server Name Indication)

服务器名称指示。SNI是为了解决一个服务器使用多个域名和证书的SSL/TLS的一个拓展,它允许服务器在同一个IP地址和TCP端口下支持多张证书,从而允许多个HTTPS,或其他服务在TLS的网站,可以在同一个IP地址下请求不同的服务。

简单来说,是用于在一台服务器的相同端口上部署不同证书的方法。服务器根据收到请求中的SNI域名来处理相应的请求,如果SNI域名为空,会按照预先设置好的默认域名处理请求。

CDN(Content Delivery Network)

内容分发网络,各个地区部署的服务器在一起形成的高速网络拓扑,用户在每个地区都能实现快速访问。CDN通过SNI响应不同的网站,同时也保护根服务器的安全。

Nginx

主流的高性能开源HTTP反向代理工具,主要用于反向代理、负载均衡和动静态资源分离。

反向代理

在根服务器前部署一台外层服务器做为网关,用户只能访问到外层服务器,从而保护内网服务器不被暴露。做为网关,也可以对报文分析和修改。

代理服务器和根服务器部署在一台主机上称为本地反代。

目前的主流屏蔽技术

这里粗略的讲一下技术至于更详细的,请自行百度一下

在目前的生活中,GFW屏蔽违规网站主要有两种方法:1.DNS污染,2.TCP重置攻击。

DNS污染

主要是检查HTTP报文中的关键字来拦截相应网站中的内容,浏览器访问时会出现ERR_CONNECTION_TIMED_OUT的错误,因为DNS会被指向一个不可访问的地址,访问也就超时了。DNS查询可以到达DNS服务器,但是如果和请求禁止的关键字匹配,**防火墙将在合法DNS回复之前注入虚假的DNS回复。对于这个问题的解决方法是在本地做好解析,通过修改本地的Hosts文件使用ip直连。

但是,在目前的生活中,使用DNS污染的方法在大型网站的屏蔽中已经很少见了,其主要原因是HTTPS会对浏览内容进行加密,报文检测关键字的方法也就失效了。

SNI审查方法

在正常情况下,TLS握手需要以下几个阶段

图1

在最开始的Clint Hello阶段,双方还没有商量好约定的加密方式,在报文中采用的是明文状态,其中的Extension字段中包含了SNI信息,也就是当前正在请求的域名,而这个信息可通过抓包得到。

在正常的情况下,服务端根据SNI中包含的域名,对客户端发送相应的域名证书,进行接下来的握手步骤,在协商结束后,开始通讯加密。

但是在这个过程中,GFW可以通过截获SNI中的域名,来判断客户端请求的网站的合法性,并进行检测和阻断,阻断的方式是TCP重置攻击。这个手段被称为基于深度数据包检测的 SNI 阻断。

TCP重置攻击是使用一个单一的数据包来执行。攻击者制作并发送一个伪造的TCP重置包来干扰用户和网站的连接,欺骗通信双方终止TCP连接。
目前GFW会抢先发送RST报文,来中断这种连接。这个技术也被称之为TCP关键字阻断

一种可行的解决方案

SNI是在一个服务器的相同端口上部署不同证书的方法,我们熟知的 Cloudflare 在启用 CDN 后提供的证书就是基于 SNI 部署的。 实现 SNI 的重要过程之一,就是在客户端与服务器建立连接的时候就发送要连接的域名,以便服务器可以返回一张颁发给指定域名的证书。

这个过程中,如果用户请求了一个不存在的域名后,服务器会发送一张默认证书给客户端以便连接能够继续

而这种通过混淆 Server Name 来绕过阻断的方法叫做域前置(Domain fronting)。简单来说就是在Client Hello阶段不携带SNI或者携带无效的SNI,隐藏真实的连接网站来规避互联网审查。

目前对Steam、Pixiv、Github等大型网站都有效.

Domain fronting的工作原理

用户使用合法的域名向DNS请求CDN的IP,然后向CDN发起请求。因为在处理HTTPS请求时,CDN会首先将它解密,并根据HTTP Host的值做请求转发,所以用户想要访问一个非法网站,可以使用一个CDN上的合法的域名作为SNI,然后使用作为HTTP Host与CDN进行HTTPS通信。由于HTTP Host只能被转发看到,而审查者是看不到的,故CDN会放过这条请求,并将HTTP请求根据HTTP Host重新封装,发往实际请求的服务器。这种情况下,客户端实际通信的对象是不怎么合法的网站,但在流量监控设备看来,客户端是在与合法网站通信,即客户端将流量成功伪装成了合法通信的流量。

图2

这种方法在被封锁的站点与无害站点为同一个大型服务提供商时较为可行,例如由内容分发网络提供的服务。此时审查者通常很难区分被伪装流量与合法流量的特点,迫使审查者选择放行所有看似无害的流量,或者选择彻底封锁此域的流量。而彻底封锁可能带来显著的附加损害。


假墙(伪墙)攻击解决方法大全

1.什么是假墙攻击?

假墙攻击是指利用 GWF 的功能对网站发动攻击的一种方式。

黑客们在国内架设一台服务器 A,在国外架设一台服务器 B。然后通过修改服务器 A 的 hosts 文件将要攻击的网站如 www.xxx.com 指向服务器 B 上,然后在服务器 B 上创建非法内容的网站,并且绑定域名 www.xxx.com

这样只要通过服务器 A 访问 www.xxx.com 就会“错误”的转向黑客架设好的违法网站上,而不是 www.xxx.com 设置的正确服务器。

然后黑客在服务器 A 上通过发包软件,大量发送携带违法关键词的请求到 www.xxx.com 网站上,这样即有非法的请求,又确实能访问到非法的结果,GWF就会通过 tcp 阻断的方式将 www.xxx.com 网站临时屏蔽,如果黑客持续进行这种发包攻击,那么网站就会反复的被临时封禁,也就导致了长时的无法访问。

2.怎么判断是否被假墙攻击?

如果你的网站频繁甚至长时间无法访问,检查发现域名解析正常、WEB服务正常、国外访问正常、域名没有被墙也没有被污染、服务器的 80 和 443 端口无法访问,那么基本上是受到了假墙攻击。

检测网址:https://www.boce.comhttps://support.dnspod.cn

通过前者检查国内访问情况以及域名是否被墙、被劫持,DNS是否被污染。通过后者检查 80 和 443 端口服务是否正常。

3.遇到假墙攻击怎么解决?

本站通过实践找到了以下三种解决假墙攻击的方案:

方案一:域名备案并使用国内服务器。

因为假墙攻击是利用了 GWF 的功能,因此最有效的方法就是将受到攻击的域名备案然后使用国内服务器,因为 GWF 是设计用来针对服务器在境外的网站的。

优点:一劳永逸,绝对有效。

缺点:备案时间较长,尤其假墙攻击一般面向的网站都或多或少有一些违规内容可能无法进行备案。

方案二:DNS智能解析+多IP服务器。

这个方案需要用到大量的IP,至少100以上,以及一款支持 API 的 DNS,这里以阿里云企业 DNS 为例,解决方式还可以细分为两种:

一是通过 API 循环解析,设置每分钟切换一个解析 IP。

二是通过阿里云的全局流量管理功能,设置多个解析 IP 池,并对每个解析 IP 每分钟检查一次,如果这个 IP 无法访问,那么智能切换成其他正常的 IP 进行解析。

这样就可以有效的解决假墙的问题,因为 IP 比较多,是要超过墙的速度的。

优点:全程可控,命运掌握在自己手里,适合爱折腾的站长。

缺点:成本较高,DNS 及 大量的 IP 都要花钱,另外也比较考验技术,因为要自己开发代码调用 API 或者设置全局流量管理及智能解析等功能,同时受各地 DNS 服务器缓存时间的影响,必然有一部分用户还是会受到影响。

方案三:使用抗假墙的 CDN 。

哪里有需求,哪里就有市场,目前市面上已经有一些提供抗假墙功能的 CDN 服务商了。