工控网络基础入门篇之DNS 劫持和污染
GFW 本身是一个人人都知道它存在,却从来不会被官方承认的机构,就好像秘密警察部门一样。所以对 于它的工作方式,各方也都只能是通过分析和模拟来大致猜测,也许已经接近真相,但永远都不等于真 相。
首先你要明白 GFW 的目的是什么,它不是要阻止你访问所有的境外网站,也不是允许你访问所有 的境内网站。对于境外的网站,GFW 的封锁重点是: 新闻,社交,政治,色情,文件共享类网站。其他几种很好理解,社交类的原因很多社交类网站又是实际上的最大的即时新闻发布站点,文件共享类网站可以让人们很方便的传播一些不想看到的东西。
DNS 劫持和污染
如果从技术实现上来说,GFW 做有效的方式当然是 DNS 劫持和污染了,也许你对这个东西完全没概念,但实际上你这么多年来可能一直在被这东西祸害着。
我们前面已经说了,要访问一个网站,首先的步骤是通过 DNS 服务器解析这个网站域名对应的 IP, 可是如果 DNS 服务器返回给你的 IP 都是错的,你又怎么可能访问到网站呢? 好比你想从广州去北京,阻止你的最好办法不是半路截杀你,而是告诉你上船一路往南走。
GFW 的 DNS 劫持是造成劫持和污染的根源!
很多人可能对 GFW 的 DNS 污染的概念始终停留在 DNS 缓存投毒这个概念上,什么叫缓存投毒?
首 先要了解什么是 DNS 缓存。因为 DNS 系统设计的时候,就考虑到这是一个需要频繁响应的系统,所以一 条域名记录被查询到之后,都会在 DNS 服务器的缓存中驻留一段时间,这样下次查询的时候就直接从缓 存中读取记录而不需要再次进行递归查询了。
如果错误的记录进入了 DNS 服务器,这个错误的记录就会被保持一段时间,如果在缓存过期后又有 一次错误的信息进入,那么还是继续保留这错误的记录,这个过程如果一直重复,服务器就永远无法返 回正确的记录了,这就成了缓存中毒。而一般意义上的黑客的缓存投毒,是通过生日攻击这种方式进行 的,GFW 需要用这么低级的手段吗?
黑客需要发送生日攻击,目的是通过两边大量的数据碰撞猜到查询者发起的查询的 Transaction ID, 因为只有响应包的 TransactionID 和请求包的一样才会被查询者接受。但是 GFW 完全控制了网络的 对外出口网关,他还需要猜你的 TransactionID 吗? 他只要直接嗅探就行了,就好像你在自己的路由上用 TcpDump 抓取所有通过路由的网路数据一样,既然可以嗅探到你全部的 DNS 查询数据,GFW 想要伪造 一个响应包也就完全没有困难了。除了嗅探DNS 查询数据,其实所有的明文传输的密码(FTP,SMTP 等) 都是可以轻松被嗅探到的。
我们前面已经说了,DNS 是基于 UDP 协议的,而 UDP 这种不面向连接的协议是极度缺乏安全性的, 你完全不能保证当你向一个服务器查询DNS记录后,返回记录给你的真的就是那台DNS服务器。我们知 道,13 套根域名服务器系统没有一套是在我们这的,我们只有镜像,而.com,.net 这些顶级域名称服务器连镜像都没有,而一些域名的权威名称服务器更是毫无疑问的全部在国 外,所以 DNS 服务器在递归查询这些网站域名的 A 记录的时候,信息一定会经过 GFW 到国外。
现在 GFW 知道了你 (某台 DNS 服务器) 要向国外的某个服务器查询 t.com 的 A 记录,在国外服 务器返回正确的信息给你之前,GFW 就伪造一个响应包给你,告诉你 t.com 的服务器在新疆某个山 沟里,IP 是什么什么。再强调一次,UDP 包是无法判断来源的真实性的,而 GFW 伪造的包里所有信息 都符合 DNS 协议规范,DNS 服务器就接受了这个错误的记录。
图 2.1: DNS 劫持流程
那么国外的服务器就不会返回正确的信息过来了吗? 会,一定会,因为 UDP 虽然不安全,但基本上 还是可以送达的。但是你别忘了,错误的信息已经抢先进入了 DNS 服务器的缓存,后面再过来的数据 DNS 服务器已经完全当它不存在了。谁先到谁就是对的,这就是扯淡的 DNS 逻辑,而国外服务器再快, 也不可能快过守在边境的 GFW 网关,所以你在用 8.8.8.8 配合 dig 这些工具查询域名的时候会发现,也许 解析 taobao.com 花了 200 毫秒,而解析 t.com 只花了 30 毫秒,那是因为这个根本就是 GFW 在国内 发回给你的。
以上所描述的,GFW 抢先于境外服务器返回给你一个错误结果的行为,就叫做 DNS 劫持。根据观察分析,GFW 这个劫持行为是发生在所有对国外 IP 进行敏感域名查询的时候,不是说只有你在往 8.8.8.8 这些知名国外 DNS 查询的时候才会发生劫持,你也不要指望说能不能找到个比较低调没被 GFW 发现的 DNS 服务器 IP 可以不被劫持,没用的。GFW 甚至都不用判断目标 IP 是什么,只要是通过出口网 关往外面跑的,查询敏感域名的全部劫持,这个我可以很明确的告诉你。