2014-03-03

未备案域名的 HTTP 请求拦截

在国内使用域名搭建网站必须要备案,如果使用未备案的域名进行服务几小时内就会被封掉, 那么功夫网是基于什么原理进行封禁的呢?下面分析一下:

首先我们看一下正常情况下 HTTP 请求流程, 如下图所示:

未备案域名使用 Chrome 访问时可以看到如下所示的错误提示: 其中ERR_CONNECTION_ABORTED 意思是说 TCP 连接被中断了。

现在开始在服务端和客户端分别抓包, 对 TCP 数据包进行分析然后继续定位 TCP 断开连接的原因,如下图所示 x.16 是服务端 IP, x.67 是客户端 IP

从如上两个数据包截图分析中可以发现当客户端发起 HTTP GET 请求后, 客户端和服务器端分别收到了很多“对端”发过来的 RST 数据包, 这就是导致 TCP 断开连接的主要原因。这些 RST 数据库很有可能就是中间的网络设备发送过来的。

问:为什么当客户端发送 GET 请求之后才开始发送 RST,而不是 TCP 建立连接的时候进行干扰? 答: 如下图所示, 当客户端发起 GET 请求之后会在 HTTP 的 header 里面带上要请求的域名, 这时候服务器端才能知道想要请求的是哪个域名的服务,同理这时候功夫网也知道了你想要访问的是哪个域名, 如果发现没有备案就进行 RST 干扰。

思考:这个情况可以避免吗? 答:如果使用 HTTPS 方式提供服务可以避免, 因为 HTTPS 请求的时候 HTTP 的 header 部分是加密的, xxx 就不知道请求的是哪个域名了,如下图所示, Google 现在就是这么做的: