Zola教你玩:如何对抗GFW的域名劫持

前几天我说过,来自译言的《如何忽略防火长城》,非常精彩,这篇文章应该是GFW详细介绍的最好的文章。那篇文章里提到GFW的三种干扰网民访问网站的方法分別是关键字过滤、屏蔽境外网站IP和NS(Domain Name System)劫持,前两者比较常见,我就先不介绍如何对付前两种干扰方式,我先讲一下如何应付DNS劫持

要了解如何应付DNS劫持,首先必须了解DNS如何实现劫持。我还是先用我的语言通俗地介绍一下DNS如何工作的吧。

DNS如何工作

DNS是域名查询系统,当人们访问一个网站时,如访问www.zuola.com, 网页瀏览器要首先查询一下这个域名对应的IP是什么,DNS返回一个IP后,瀏览器才向那个IP发出数据包,一路上,路由器会按照路由表里的地址一路朝目 標IP发过去数据包,对方主机如果认为自己的主机有这么一个网站,於是返回响应,开始传递网页给瀏览器。如果DNS服务器返回一个假的结果给瀏览器,瀏览 器的访问请求就永远到不了真实的网站那里。这就是DNS劫持。

比如,我现在在湖南电信上网得到的IP和DNS缓存服务器参数是
IP Address:222.244.222.32
Gateway address:222.244.222.1
DNS Server:222.246.129.80, 59.51.78.210

这里的DNS服务器的IP是222.246.129.80和59.51.78.210,这是两台离我最近的DNS缓存服务器,我们可以来利用这两个 DNS服务器来查询世界上任何一个网站的域名,因为他开通了递归查询,也就是说,如果当前DNS服务器不知道这个域名,他会向上级DNS进行查询,开通递 归查询的DNS服务器也本身设置了另一个DNS服务器,遇到他不知道IP的域名他就会向上查询,如果上级的上级都不知道,就会查到域名的whois信息, 然后查whois信息里指定的DNS服务器,whois信息里指定的DNS服务器是权威服务器,返回的值就是“权威应答”。

什么情况下遇到非权威应答呢?那就是我们的上一级DNS服务器里缓存了DNS查询结果,DNS服务器就会马上返回一个IP,这时得到的应答就是非权 威应答,也就是说,可以这样划分,DNS服务器相对於某个具体的域名来说,可以分为权威DNS服务器和DNS缓存服务器。权威DNS服务器是在internic.net註册了的主机,DNS缓存服务器却是任何人都可以自己建立的服务器。

DNS如何变得不诚实

通常情况下,DNS缓存服务器是公正的敬业的值得信任的,会老老实实工作,但有些情况下却会做假。如最近炒的比较火的一个漏洞是DNS 协议的漏洞,人们可以伪造端口和TXID识别符均能匹配的UDP数据包来欺骗DNS服务器缓存一个虚假的结果,可以实现phishing, 比如当你访问你的邮箱或网上银行的时候,把你骗到一个假网站上面,但你看到你访问的网址地址却是准確无误的。还有一种情况下DNS缓存服务器会作假,比如 在DNS服务器里登记一些敏感网站的域名,然后给这些网站设置一些假的IP,这样就阻止使用当前DNS服务器的用户访问不到这些网站。当年我阻止公司同事 被3721流氓软件所害,就是这么乾的,当然,我需要让他们用DHCP获得的DNS服务器IP为我在公司设置的私有DNS缓存服务器IP。

实际上,我之前提到的222.246.129.80和59.51.78.210不是公正无私的DNS缓存服务器,他们会作弊,我演示给你看他们是怎么作弊的:

在Windows操作系统下的“开始”菜单里找到“运行”,然后输入cmd,出现一个黑色的命令行窗口,在这里我们输入
nslookup www.zuola.com 222.246.129.80

然后看到返回一个奇怪的结果

C:\Users\Zola>nslookup www.zuola.com 222.246.129.80
服务器:         222.246.129.80
Address:        222.246.129.80

非权威应答:
名称:    www.zuola.com
Address:  202.106.1.2

这个IP根本不是我的IP,我按向上箭头键重复执行这命令,会得到好几个不同的结果,如4.36.66.178  / 216.234.179.13 / 203.161.230.171  / 64.33.88.161 / 202.106.1.2  / 202.181.7.85  /  211.94.66.147,就是得不到正確的IP。网友看到这里可以亲手测试一下。如果nslookup www.zuola.com 后面不再添加IP或服务器域名,就意味著使用当前的DNS服务器来查询我的网站IP。

如果直接用权威DNS服务器来查询,

C:\Users\Zola>nslookup www.zuola.com ns1.oray.net
服务器:  ns1.oray.net
Address:  202.105.21.217

名称:    www.zuola.com
Address:  208.97.181.48

则马上得到了我域名的正確的IP。好了,到这里,我似乎可以总结陈述GFW在利用DNS劫持来制止其他中国网友访问我的网站了,但,事情还没完,我 还有更多发现:边界路由器上的GFW不仅能过滤网页中敏感內容,而且能干扰DNS查询並给出错误的IP地址,GFW早就实现了DNS”Cache 投毒”(cache poisoning)。DNS 缓存投毒的结果是,即便是在北京工作的时代周刊的记者使用了代理服务器,或是使用了MCI的VPN网络,他们仍然不能访问我的网站。

证明GFW使用”Cache 投毒”(cache poisoning)的过程很简单:

由於我的域名的whois里指定的权威DNS服务器是ns1.oray.net,这个服务器是中国公司的,这个NS服务器也在中国境內,当在中国境 內查询的时候,查询域名的A记录的UDP数据包就不需要出国,此时不受GFW影响,所以能查到我的真实IP为208.97.181.48。

现在,我登录美国Linux服务器的终端,由於ns1.oray.net 在中国境內,这个时候查询nslookup www.zuola.com ns1.oray.net就需要经过中国的网络边境线了,GFW就会捣蛋了,你看,

[zolazhou]$ nslookup www.zuola.com ns1.dreamhost.com(此服务器在美国)
Server:         ns1.dreamhost.com
Address:        66.33.206.206#53

Name:   www.zuola.com
Address: 208.97.181.48 (这里返回是正確的IP,因为没有越过GFW,不受GFW影响)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 64.33.88.161 (GFW干扰后给出的假IP地址,也许是一个honeypot)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 202.106.1.2 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 216.234.179.13 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 4.36.66.178 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 216.234.179.13 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 4.36.66.178 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 211.94.66.147 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 202.181.7.85 (GFW干扰后给出的另一个假IP地址)

[zolazhou]$ nslookup www.zuola.com ns1.oray.net
Server:         ns1.oray.net
Address:        202.105.21.217#53

Name:   www.zuola.com
Address: 209.145.54.50 (GFW干扰后给出的另一个假IP地址)

上图来看,国外的朋友访问我的网站也困难是因为他们的DNS请求会经过一次GFW,所以会得到一个假的IP地址並会到这些假IP上去取数据,当然不 会得到任何应答。也是时代周刊的记者都无法访问我的网站的原因。所以,一个小时前,我把我的权威DNS服务器改为美国Dreamhost公司的 ns1.dreamhost.com 的域名解析服务器了。国外的朋友访问我的网站就会得到正確的IP地址了,不会再受GFW的欺骗了。

这个时候,ns1.oray.net这个服务器不再为我工作了,国內的网友访问我的网站里却会总是被GFW所欺骗了:

C:\Users\Zola>nslookup www.zuola.com ns1.dreamhost.com
服务器:  ns1.dreamhost.com
Address:  66.33.206.206

名称:    www.zuola.com.lan
Addresses:  ca6a:102:0:f00::e095:1100
202.181.7.85 (又是假IP)

C:\Users\Zola>nslookup www.zuola.com ns1.dreamhost.com
服务器:  ns1.dreamhost.com
Address:  66.33.206.206

名称:    www.zuola.com.lan
Addresses:  d8ea:b30d:0:5600::e095:5800
209.145.54.50 (又是该死的假IP,DNS劫持)

C:\Users\Zola>nslookup www.zuola.com ns1.dreamhost.com
服务器:  ns1.dreamhost.com
Address:  66.33.206.206

名称:    www.zuola.com.lan
Addresses:  424:42b2:0:1000::e095:1200
64.33.88.161( 操!)

C:\Users\Zola>nslookup www.zuola.com 208.67.222.222 (即便是OPENDNS也不能解决问题,GFW照样来作弊劫持掉DNS结果)
服务器:  resolver1.opendns.com
Address:  208.67.222.222

名称:    www.zuola.com.lan
Addresses:  202.106.1.2
64.33.88.161  (又是这两个混蛋IP地址)

C:\Users\Zola>nslookup www.zuola.com 208.67.222.222
服务器:  resolver1.opendns.com
Address:  208.67.222.222

名称:    www.zuola.com.lan
Addresses:  216.234.179.13
4.36.66.178(一次还给俩假IP,操你妈的GFW)

如何被动应对DNS劫持

网友们读到这里,知道我承受多么残酷的封杀了吧?都怪我太有名了。根据我搜索上面的IP的结果,发现GFW使用此阴毒招数不是今年的事情了。在 2003年就有很多域名受到同样的待遇了。如果不是外宾,用脚都可以想到那些网站是什么类型网站,作为一个普通公民的个人网站,受到GFW如此狠毒的待 遇,估计我是头一个。

Google.cn也奉命屏蔽我的网站內容,GFW又使出如此残忍的手段来封杀我的网站,我有机会的话,我要当著胡锦涛总书记问下我在他眼中到底做 错了什么?GFW的主人到底害怕我什么?我觉得,要么直接给我一幅手銬好了,要么像对待Kevin Mitnick一样不准我接触电脑和网络好了。如果有国外记者看到我这段话,拜託转告一下胡锦涛这个问题。

好了,发泄一下怨气后还是得想想解决办法。还好我们有办法让DNS解析也通过代理服务器来完成。使用FireFox的用户可以下载TOR,然后安装FoxyProxy, 然后找到FoxyRroxy选项里的全局选项,把“使用SOCKS代理服务器来查找DNS”。面对GFW的大力封杀,我只好放弃国內流量了,尽量通过鼓励 RSS订阅和推广使用代理器来恢復自己的网站的功力好了。如果有可能,我改为英文BLOG来赚英文世界的广告费好了,反正写中文网志也赚不到什么钱,写英 文网志的话也不需要来自中国的流量。

如何主动应对DNS劫持

下面开始做一些针对GFW的猜测,眾所周知,UDP协议是一个无连接的协议,对数据包的到达顺序以及是否正确是不关心的,由於GFW会审查53端口 的数据包,所以给针对GFW进行DOS攻击提供了可能。如果有人开发类似病毒的软件不断的向国外IP隨机发出通往UDP53端口的敏感网址数据查询请求, 估计可以让GFW累得罢工,我会很乐意感染这种病毒,我相信很多恨GFW的人也乐意感染这个病毒。谁能在技术层面反驳我这个思路?

下一节介绍如何突破关键词过滤屏蔽IP的网络封锁手段。

25 thoughts on “Zola教你玩:如何对抗GFW的域名劫持”

  1. Pingback: Rojoro
  2. 我在国内可以用hotspot shield顺利登陆你的网站,GFW的功用只是拦截大陆网民获取外部信息的么?还有什么积极作用?如果没有的话你所说的新型拆墙病毒怎么还没有问世?黑客们加油!

  3. @shizhao 用其他网站做例子的话,全是法轮功网站啊,一时半刻找不到像我这样的普通BLOGGER的网站,太少人得到我的域名的这种待遇了,估计是upd数据包申查很消耗资料吧。

  4. 用简单的代理访问已经不行了,必需让http或https的访问也使用sock4/5代理,才能访问,我也是通过这篇文章,才知道连普通代理都能继续被屏蔽,暂时看来scok代理是无法被屏蔽的了是么?

  5. 我在江苏,对文中情况一一做了验证。

    查询本地、opendns、ns1.oray.net和dreamhost的dns服务器都尚能得到正确IP,说明目前还未受GFW影响;而从dreamhost上查询ns1.oray.net和zola结果相同,返回的IP被篡改。

    这说明从国内使用opendns并不可靠,因为跨界查询有可能被GFW篡改结果。

    另外,我这里208.97.181.48这个地址被封锁,无法ping通。

    对访客来说,解决DNS欺骗的最简单方法是在本机上用Hosts文件将www.zuola.com和208.97.181.48进行绑定,缺点是将来zola更换IP后得重新绑定。

  6. 我在江苏,对文中情况一一做了验证。

    查询本地、opendns、ns1.oray.net和dreamhost的dns服务器都尚能得到正确IP,说明目前还未受GFW影响;而从dreamhost上查询ns1.oray.net和zola结果相同,返回的IP被篡改。

    这说明从国内使用opendns并不可靠,因为跨界查询有可能被GFW篡改结果。

    另外注意到zola最后的例子中返回的域名www.zuola.com都被添加了.lan.

    最后,我这里208.97.181.48这个地址被封锁,无法ping通。

    对访客来说,解决DNS欺骗的最简单方法是在本机上用Hosts文件将www.zuola.com和208.97.181.48进行绑定,缺点是将来zola更换IP后得重新绑定。

  7. 感谢。让我学了不少新技术新知识。
    网络本身就是开放的自由的
    河蟹根本就是有悖于这些理念的,早晚要破产的,就算能多挣扎几下

  8. Pingback: Jack Ma
  9. Pingback: V Ma
  10. 主动攻击gfw也没用. 中贡无论如何都还有最后一条杀手锏,就是动用他们的宪兵–人民警茶.曾经有的记者只是报导了一点地方上的敏感新闻就被判了几十年.只要他们愿意,随我们怎么闹,他们最后一翻脸抓几个关起来杀一儆百,立刻没人再敢步后尘.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据