GFW和DNS污染

GFW简介

在地址栏输入网址后回车发生的情况

如果DNS缓存中以及hosts文件中没有请求的域名信息,那么客户端就会向本机设置的域名服务器发送一个请求,由于本机设置的域名服务器是8.8.8.8,是国外的一个域名服务器,那么请求数据包就需要经过GFW

假设DNS请求数据包格式如下,

直接拦截非法DNS请求

当该数据包经过GFW时,GFW会对数据包的内容进行查看,当发现了该数据包是一个请求 google.com 域名的DNS请求时,正常情况下GFW就在这个地方把数据包拦截下来,不让你进行解析

DNS污染(劫持)

假设GFW没有拦截请求google域名ip的DNS数据包,那么数据包就能正常到达目的域名服务器,服务器经过一系列查找,最后将google域名ip信息返回给客户端,但是中间仍需要经过GFW

假设返回的数据包如下,在经过GFW时,GFW发现返回数据包中的内容不合法,它就会做一些手脚,

比如将域名服务器返回给的域名ip更改为一个不存在的ip,

然后这个被更改后的数据包会返回到客户端,但是由于这个ip是不存在的,客户端无法连接到该ip,因为这个拓扑图中是没有这个9.9.9.8服务器的,也就是说,互连网中没有一台路由器能够找得到这台服务器

TCP重置攻击

上面两种情况是由于我们不知道google的ip,需要向域名服务器发送DNS请求可能引发的情况。但是输入域名回车的时候,客户端是先查看本机的DNS缓存,然后再检查hosts文件,若这两种方式都没发现域名ip信息,最后才会发送DNS请求

我们可以把google域名和ip的映射关系添加到hosts文件中,这样的话,当我们访问google域名的时候,客户端直接就能知道域名的ip地址,而不需要再向DNS域名服务器发送请求了,

假设此时客户端向google发送的数据包形式如下,

当这个数据包经过GFW,GFW会解析到应用层的流量数据,当检测到不合法的ip或者内容时,GFW可能会直接把这个数据包给拦截丢弃,也可以伪装成google服务器,将数据包中的ip修改,然后再返回给客户端