2017年8月3日星期四

为何 shadowsocks 要弃用一次性验证 (OTA)

前些天,shadowsocks 提出了 SIP004 草案,旨在使用 AEAD 算法 取代原先的不安全的 流加密 + OTA,并弃用了一次性验证 (OTA)。
新协议的提出对于 shadowsocks 是一个非常非常重大的改进,因此我写了这篇博文为看不懂洋文的友们科普一下「为什么 OTA 会被这么快被弃用」以及「为什么应该使用新协议」。

一、OTA 是什么

OTA(One Time Auth,一次性验证),是之前 shadowsocks 为了增强安全性,抵抗 CCA(Chosen-ciphertext Attack,选择密文攻击)而加入的实验性功能。
我觉得应该很多人都听过这玩意 —— 就算不知道 OTA 是啥好歹也在 shadowsocks 各分支的客户端上看到过「一次性验证」的开关吧?虽然这个名字确实起得有点让人不明所以就是了(笑)。
那么下面我来科普下当初为什么要加入 OTA 功能。

二、原协议的弱点

原 shadowsocks 协议的这个漏洞其实早在 2015 年就被 @breakwa11 提出了。当时正值 @clowwindy 被喝茶之际,此 issue 下闹得沸沸扬扬撕逼不断,过了好一段时间后才开始有正经的技术讨论。
如果你想要了解一下当时的情况可以去看看 这个 issue (因breakwa11被人肉事件,shadowsocksr相关项目已被其本人删除,要了解当时情况,可以查看此处ShadowSocks协议的弱点分析和改进),我这里简略概括一下当时提出的漏洞。

2.1 shadowsocks 协议

原 shadowsocks 协议 的 TCP 握手包(加密后)的格式是这样的:
+-------+----------+
|  IV   | Payload  |
+-------+----------+
| Fixed | Variable |
+-------+----------+
其中的 IV(Initialization Vector, 初始化向量)是使用随机数生成器生成的一个固定长度的输入值。通过引入 IV 能够使相同的明文和相同的密钥产生不同的密文,让攻击者难以对同一把密钥的密文进行破解。
shadowsocks 服务端会用这个 IV 和 pre-shared key(预共享密钥,通常是用户设置的密码)来解密 TCP 数据包中的 payload
解密后的内容格式如下:
+--------------+---------------------+------------------+----------+
| Address Type | Destination Address | Destination Port |   Data   |
+--------------+---------------------+------------------+----------+
|      1       |       Variable      |         2        | Variable |
+--------------+---------------------+------------------+----------+
其中 Address Type (ATYP) 是地址类型,占一个字节,有三个可能的取值:010304,分别对应 IPv4hostnameIPv6 类型的地址。这些都是 RFC1928 中定义的标准,有兴趣可以去看看。
握手完成后 shadowsocks 中继就会工作在流模式下,后续的所有 TCP 数据包不会再带上 IV,而是使用握手时协商的那个 IV
说完了原 shadowsocks 协议的内容,下面说说该协议的不足之处。

2.2 原协议的缺陷

正如上表所示,原始 shadowsocks 协议 TCP 握手包中的 IV 字段是 Fixed(定长)的。不同的加密算法 IV 长度不同,对于 rc4-md5 和 aes 系列等常用算法,这个长度是 16 字节。各加密算法的详细信息可以在 官方文档 - Cipher 查看。
而服务端为了判断数据是否有效,会检查数据包中表示地址信息的那个字节,看它是不是上面提到的三个可能取值。如果是,就尝试解析后面的地址和端口进行连接;如果不是,立即断开连接。
正是 shadowsocks 服务器的这个行为使得主动探测成为可能。

2.2.1 主动探测的原理

该方法由 @breakwa11 提供
一般来讲,「表示地址类型的那个字节」是被加密后发送的,所以第三方无法精确的修改它。但是不巧的是,shadowsocks 所有的加密方式都是 stream cipher流加密),而这种加密方式的特点就是「明文数据流与密钥数据流一一对应」
通俗地讲,即对应修改了某个位置的密文(根据加密模式的不同,可能影响到后面其他密文块的解密,也可能影响不到,但在这里这个性质并不重要),如果预先知道了明文的模式,虽然无法解密还原出内容,但可以修改密文中的特定字节,起到修改解密后的明文的效果。
根据流加密的这个特性,坏东西们就可以通过伪造 TCP 数据包来主动探测 shadowsocks 服务器了。攻击者只要暴力尝试修改加密后的数据包中 IV 之后紧接着的那个字节(如果使用的加密算法 IV 长度为 16 字节,那么就修改第 17 个字节),穷举 2^8 = 256 种可能性,如果被测试的服务器有一种到三种情况下没有立即关闭连接,就可以判断出这台机子的这个端口开放的是 shadowsocks 服务。
或许这种主动探测方法正在被 GFW 大规模应用,谁知道呢?你正在使用的原版 shadowsocks 代理随时有可能被封锁。

2.2.2 防范主动探测

经过讨论后上述漏洞被证明是 确实存在 的,所以现在大部分的 shadowsocks 分支都已经加入了针对这种探测方法的对抗措施(e.g. shadowsocks-libev v2.5.5+),即「随机超时抵抗」而不是立即断开连接,配合自动黑名单等机制可以有效减少被探测到的风险。
但是这种方法总归不是长久之计,要怎么办呢? 

三、OTA 闪亮登场

上述情况下主动探测能够得逞的原因是服务器没有对收到的数据包进行校验,随便哪个阿猫阿狗发来的数据包,不管有没有被恶意篡改过,原来的 shadowsocks 服务器都会做出同样的反应。
这时 @madeye(现在的 shadowsocks 维护者)提出了 One Time Auth 即「一次性验证」的提案,给原 shadowsocks 协议加上了数据包验证。

3.1 OTA 协议

开启了 OTA 后的 shadowsocks 握手包(加密前)是这样的:
+------+---------------------+------------------+-----------+
| ATYP | Destination Address | Destination Port | HMAC-SHA1 |
+------+---------------------+------------------+-----------+
|  1   |       Variable      |         2        |    10     |
+------+---------------------+------------------+-----------+
可以看到它添加了一个 HMAC-SHA1 字段,这个字段是将除了 DATA 通过 HMAC-SHA1 算法(以 IV + PSK 作为 key)生成的。并且数据包头部的 ATYP 添加了一个标志位用于指示 OTA 是否开启(ATYP & 0x10 == 0x10)。
+----------+-----------+----------+----
| DATA.LEN | HMAC-SHA1 |   DATA   | ...
+----------+-----------+----------+----
|     2    |     10    | Variable | ...
+----------+-----------+----------+----
握手完成后,接下来的 TCP 数据包均在原始协议的包上添加了 DATA.LEN(包长度)和 HMAC-SHA1 字段。这样,服务器就可以对数据包进行完整性校验,也就可以识别出被篡改过的数据包了。

3.2 OTA 的缺陷

OTA 增强了安全性,可以防范 CCA,也解决了原版协议数据包容易被篡改的问题,听起来很美好,不是吗?
但是,对于这个协议的实现,shadowsocks-libev 及其它大部分分支均假定第一个数据包必须包含整个带了 SHA1-MAC 的头部,否则断开连接。
OK,又一个可以通过服务器行为进行主动探测的地方。不过这种主动探测也可以通过上面提到的「随机超时抵抗」来进行防范,真正可怕的在下面:
该方法由 @breakwa11 提供
还记得我们上面提到的 stream cipher(流加密)的特点吗?攻击者可是使用同样的套路修改数据包中的 DATA.LEN 字段,然后通过观察服务器的反应来判断这是否是一个 shadowsocks 服务器。
举个栗子,如果攻击者恶意构造 DATA.LEN 的高位字节密文,使得解密后 DATA.LEN 的数值变得特别大(但是后面的 DATA 的大小并没有改变),shadowsocks 服务器就会继续等待那些实际上并不存在的数据传输完成直到超时。因此只要在发送恶意数据包后观察服务器是不是「不会断开连接且至少等待 1 分钟无任何数据包」即可确定该服务器是否开启了 shadowsocks 服务。
没错,这样的检测方法比检测原版协议还要神不知鬼不觉,甚至不会在服务端留下任何可疑的痕迹。OTA 当初是为了给原版协议的流加密加上一个认证以增强安全性,殊不知这带来了更大的隐患,这也是为什么 shadowsocks-org 要急急忙忙弃用 OTA 的原因。

四、新协议 AEAD

4.1 之前协议的缺陷汇总分析

原版 shadowsocks 协议最大的缺陷就是未对数据包完整性进行校验,再加上流加密的特点,导致了攻击者可以通过穷举的方式修改密文进行基于服务器行为的主动探测。
OTA 协议虽然通过在数据包尾部附上 HMAC-SHA1 字段对 DATA 的完整性进行了验证,但是包首部的 DATA.LEN 用于计算偏移的指示 DATA 长度的字段并没有经过验证。这导致了攻击者可以通过构建高位的 DATA.LEN 密文进行更隐蔽的主动探测。
因此,在这次新协议草案的讨论过程中参照了 shadowsocksR 协议的一个重要改进 —— 对 DATA.LEN 进行单独校验,参见:ShadowsocksR 协议插件文档

4.2 AEAD 是啥

在通常的密码学应用中,Confidentiality(保密)用加密实现,消息认证用 MAC(Message Authentication Code,消息验证码)实现。这两种算法的配合方式,引发了很多安全漏洞,过去曾经有 3 种方法:
  1. Encrypt-and-MAC (E&M)
  2. MAC-then-Encrypt (MtE) <- 即 OTA 的做法
  3. Encrypt-then-MAC (EtM) <- 新协议的做法
然而后来人们发现,E&M 和 MtE 都是有安全问题的,所以 2008 年起, 逐渐提出了「用一个算法在内部同时实现加密和认证」的 idea,称为 AEAD (Authenticated Encryption with Associated Data)。在 AEAD 这种概念里,cipher + MAC 的模式被一个 AEAD 算法替换。
使用了 AEAD 算法的新协议本质上就是更完善的 stream cipher + authentication,虽然它依然使用的是流加密,但是通过更完善的数据包完整性验证机制杜绝了上面所述的可被篡改密文的可能性。
注:截至本文发布时新协议都是使用的 流加密 + 认证,不过 AEAD 的设计使得它能够使用块加密,因此上面说的并不是绝对的。
而为了实现认证加密(Authenticated Encryption),新协议必须要将 TCP 流分割成不同的 chunk 并分别验证。如对新协议的数据包定义有兴趣可以查阅 官方文档 - AEAD,本文不再深入。

4.3 新协议支持的 AEAD 算法

目前 shadowsocks-libev 已经支持 如下的 AEAD 算法,其他分支也正在跟进中:
  • AES-128-GCM
  • AES-192-GCM
  • AES-256-GCM
  • ChaCha20-IETF-Poly1305
  • XChaCha20-IETF-Poly1305
这些新的加密算法本质上就是 流加密 + 验证,原先的其他单纯的流加密算法均不适用于新协议。

4.4 新协议的优缺点

使用了 AEAD 算法的新协议能够解决上面描述的 Original/OTA 协议的所有问题,可以有效防范 CCA 和中间人攻击,减少被主动探测的风险。我能想到的唯一的缺点大概就是性能了,但是它又能影响多少呢?Benchmark 参考在 这里
shadowsocks 原本就不是为「加速网络」而生的项目,它的初衷是「突破网络审查并提供安全的加密访问」。是继续使用很可能会被 GFW 封锁的原协议呢,还是选择使用更安全的新协议呢,相信各位看官心中自有定夺.

五、写在后面

写这篇文章之前我对密码学的了解也就是一点皮毛程度而已,所以这篇文章也是我边查资料边写出来的。为了不让自己误人子弟,我非常谨慎查阅了相关资料并向他人请教(衷心感谢 @breakwa11 和 @madeye 对本文的审阅和提出的建议!)
但是所谓「金无足赤,人无完人」,如果文章中仍有什么错误的地方,欢迎在下方评论区批评指正。
大家都不容易,谨以此文敦促 shadowsocks 用户 / 开发者们尽快使用 / 支持新协议。

六、参考链接



2015年1月2日星期五

防火长城架构

前几天看到一篇文章:如何忽略防火长城。这篇文章是我迄今为止看到过的技术性最强的和GFW相关的文章。
我一直以为,GFW这个系统是安装在每个出口主干路由器里的,所有的封包都在路由器里被监测和分析,然后直接在路由里采取一定的策略,例如丢弃封包。但是这篇文章指出,GFW是独立于路由器的。ISP的出口路由器上并不存在GFW这个系统,仅存在一个封包转发器。如果是GFW在和路由同一个内网通过混杂模式来获取封包数据,甚至不需要封包转发程序,但是这样的设计会导致扩展性下降。
整个过程是这样的:客户端发出封包,主干路由接收到后,并不会对这个封包做任何处理。这个封包无论是否存在非法内容,都会被传送到服务器端。但是与此同时,路由器会把这个包复制一份到GFW。GFW接受到拷贝的封包之后,如果发现有违禁内容,就会同时向客户端和服务器端发出几个flag为rst(REST)的封包。也就是说,客户端和服务器端,所有的封包传递,都是按正常来进行的,只不过如果存在违禁内容,GFW就会发送干扰包,导致客户端或者服务器端异常中断连接。
那篇文章还提到了一个跨越GFW的方法,就是在客户端和服务器端都利用iptables等防火墙工具来过滤rest包。GFW之所以要往两端发送REST,也正是因为可以通过这种简单的手段来忽略GFW。如果只发送REST给客户端,那么我要穿墙,就太简单了,只需要自己过滤REST包就OK。但是两端都发送的话,导致穿墙成本增加。因为像flickr,他们估计就不愿意为了我一个人而去给服务器增加这个防火墙规则,当然如果全体大陆人民去要求,他们还是会考虑的。而要设置这样的防火墙,也不是每个用户都能做到的,例如我妈妈就做不到。
GFW这样的架构,可以很方便的对GFW进行改进和升级,增加硬件,而不需要对出口路由进行修改。而新的出口路由加入,也不需要对其植入GFW。而路由器不需要进行复杂的关键词过滤逻辑处理,几乎没有性能上的下降。这种平行的设计,使得GFW扩展性很好,简直就是低耦合设计的一个典范。
我看完文章之后利用tcpdump和curl也做了一下试验,通过tcpdump的抓包来看,确实如文中所说,有REST包的回馈。而且一次就发送3或者4个。可惜我没有国外的服务器,否则就可以验证一下文章所提到的翻墙方法了。
那篇文章给出的防火墙规则:
linux的话
iptables -A INPUT -p tcp –tcp-flags RST RST -j DROP
如果是BSD家族(包括mac osx),一般可以
ipfw add 1000 drop tcp from any to me tcpflags rst in
我上面提到的REST包,就是TCP包的头部信息里,RST位被置为1。具体可以看维基百科的TCP条目
所谓的混杂模式,就是网卡不过滤经过的包,全部接纳扔给操作系统。我们一般用的网卡都会过滤掉mac地址不属于本机的包的,这个是在link层完成的,而不是IP这层。现在很多机房里的监测系统,都是利用混杂模式来实现的。

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