2015年1月2日星期五

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的人也乐意感染这个病毒。谁能在技术层面反驳我这个思路?

转载自:周曙光的网络日志-http://www.zuola.com/weblog/2008/08/1151.htm

没有评论:

发表评论