工控网络基础入门篇之虚假 IP 劫持与空包劫持

在上一篇“DNS 劫持和污染”中,我们提到GFW 会返回一些错误信息,那么到底会返回一些什么样的错误信息给你呢? 

就目前各方面统计的信息来看,GFW 返回给你的 虚假信息,其实就是篡改了域名的 A 记录部分,把你指引导错误的 IP 就行了。准确的说,不只是 A 记 录,对于记录 IPV6 地址的 AAAA 记录他们也是一样会劫持的,相关信息参考本站文章:GFW 的 DNS 劫 持也会干扰 IPV6 的 AAAA 记录。目前还值的庆幸的是,GFW 返回的虚假记录只用了一些特定的 IP,我 们可以通过一些手段来过滤掉这些信息,从而获得正确的解析结果。 

目前已知的,GFW 用于 DNS 劫持污染的 IP 有 48 个,如下表:



关于为什么使用特定 IP 而不是随机 IP,可能的原因有以下几点: 

1、因为劫持工作量巨大,如果使用随机数的话,生成随机数的计算负担会更重 2、随机 IP 可能指向正常工作的网站,加上这种解析请求的数量巨大,会破坏全球网络的稳定性 

3、部分 IP 指向的是制作自由门等翻墙软件的公司,通过这种方式实际上是对他们发起 DDOS攻击。

空包劫持

除了返回错误的信息之外,我还观察到一次很特殊的 GFW 对境内 DNS 的空包劫持。没错,境内, 这也在提醒我们 GFW 不是简单的只工作在出国网关上,而是同时也分部在全国各个骨干网络上的。这次 劫持发生在我用114DNS 查询instagram 的一个 CDN 节点域名 “scontent-a.cdninstagram.com” 的时候。我们 的查询包默认是要求服务器做递归查询的,按标准服务器在返回包中也应该注明它知道了你发出了递归 的请求,可是 GFW 劫持了我向 114 的这个请求,返回了一个不需要递归请求的响应包,同时没有任何 A 记录,而 Reply Code 中的错误代码是没有错误。 

和不检查返回源的真实性一样,DNS 甚至都不会检查应答包中关于递归请求的部分是否发生了变化, 这样一个不需递归请求,没有 A 记录,没有无错误代码的结果就被 DNS 的解析器 (客户端,我们的路由 或者电脑) 接受了,因为格式完全符合协议规范啊,然后一个明明存在的域名就成了找不到 IP 的域名了。 

关于这个问题,具体细节参考文章GFW 的 DNS 劫持中的空包污染问题。空包劫持的问题,因 DNS、 ISP 不同有很大的区别,且针对的域名很少,总的来说这种行为是 GFW 的 DNS 劫持中的少数派。而对于 空包污染的过滤,规则很容易和迭代查询的数据包匹配上,所以会阻止本地发起的迭代查询的结果。但 我们的 OS 所发出的 DNS 请求默认都是递归请求,基本上不用担心这个问题,如果你在使用某些调试工 具 (例如 Dig+trace 选项) 的时候发现没有数据返回,请先禁用这个空包过滤规则。