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

中国政府的网络封锁技术方案与网民的反网络封锁技术方案

目录:

  1. GFW是什么
  2. 网络封锁的技术方案
    • 内容审查
    • 屏蔽IP
    • DNS劫持
  3. 反网络封锁的技术方案
    • 使用SSL加密对抗关键字审查
    • 给网站换IP避开IP屏蔽
    • 用tor来避开DNS干扰
    • 使用在线RSS阅读器来

GFW是什么

GFW是Great Fire Wall的缩写,是金盾工程。这个工程由若干个部分组成,实现不同功能。防火长城主要指中国政府监控和过滤互联网内容的软硬件系统,由服务器和路由器等设备,加上相关的应用程序所构成。
首先,需要强调的是,由于中国网络审查广泛,中国国内含有“不合适”内容的的网站,会受到政府直接的行政干预,被要求自我审查、自我监管,乃至关闭,故GFW的主要作用在于分析和过滤中国境内外网络的资讯互相访问。
GFW对网络内容的过滤和分析是双向的,GFW不仅针对国内读者访问中国境外的网站进行干扰,也干扰国外读者访问主机在中国大陆的网站,本文讨论GFW屏蔽国外网络上传播的内容的方法及相应的对策。

网络封锁的技术方案

GFW在网络上封锁的技术方案有:
  1. 内容审查
  2. 屏蔽IP
  3. DNS劫持
GFW如何屏蔽网络上传播的内容?网络上封锁的具体方式:
  1. 内容审查
    GFW的内容审查针对HTTP传输协议的默认端口的80端口,HTTP传播的内容是明文的内容,没有经过加密,GFW是一个IDS[Intrusion detection system (入侵检测系统)],GFW有一个敏感字名单,若在中国大陆访问境外的主机的HTTP的数据流里发现敏感字眼,就在两台主机间伪造一个"reset”信号,导致双方主机以为对方中止了请求。如用Firefox浏览器访问
    http://newsvote.bbc.co.uk/chinese/
    http://knol.google.com/k/-/-/3jhi1zdzvxj3f/2 就会出现以下画面:

  2. 屏蔽IP

    屏蔽IP是GFW通过路由器(router)来控制的,在通往国外的最后一个网关上加上一条伪造的路由规则,导致通往某些被屏蔽的网站的所有IP数据包无法到达。路由器的正常工作方式是学习别的路由器广播的路由规则,遇到符合已知的IP转发规则的数据包,则按已经规则发送,遇到未知规则IP的数据,则转发到上一级网关。GFW的路由器按黑名单(blacklist)来转发特定的IP数据包,则可屏蔽特定的网站的IP,此IP黑名单不是固定的,会更新。如访问 http://www.dw-world.de/chinese/ 出现以下画面:
  3. DNS劫持

    DNS劫持是针对某些网站的最严重的干扰。干扰的方式有两种:
    1. 一种是通过网络服务提供商(Internet Service Provider/ISP)提供的DNS服务器进行DNS欺骗,当人们访问某个网站时,需要要把域名转换为一个IP地址,DNS服务器负责将域名转换为IP地址,中国大陆的ISP接受通信管理局的屏蔽网站的指令后在DNS服务器里加入某些特定域名的虚假A记录,当使用此DNS服务器的网络用户访问此特定网站时,DNS服务便给出假的IP地址,导致访问网站失败,甚至返回ISP运营商提供的出错页面和广告页面。
    2. 另一种是GFW在DNS查询使用的UDP 53端口上根据黑名单进行过滤,遇到通往国外的使用UDP的53端口进行查询的DNS请求,就返回一个虚假的IP地址
    例子:
    在大陆访问 http://www.zuola.com/ 就可能出现“服务器响应时间过长”。
    我家目前用的中国电信提供的网络接入:
    Internet connectionConnection type:PPPoE
    IP Address:220.168.9.112
    Gateway address:220.168.8.1
    DNS Server:222.246.129.80, 59.51.78.210
    当我使用中国电信提供的DNS服务器进行查询时,出现以下画面:


  4. 甚至我在中国大陆使用用国外的OPENNDS或其他DNS服务器进行查询,都会被GFW干扰而得到虚假的IP地址,


  5. 通过远程登录在美国的主机进行DNS查询后,此时的DNS查询是完全无GFW干扰的,可得到 www.zuola.com的真实IP地址是 75.119.214.237

GFW在OSI结构模型的两个层面进行审查和封锁,一种在传输层(Transport Layer)进行干扰,一种是在网络层(Network Layer)进行干扰:
  1. 在传输层(Transport Layer)进行干扰:
    1. DNS劫持  GFW在UDP 53端口上进行传输层完成干扰;
    2. 内容审查   GFW对默认端口TCP 80端口上进行内容过滤,在http传输协议上,对tcp 80端口上传输的内容进行内容审查,遇到关键字,GFW就在会话中插入“reset”信号,导致网页被重置。
  2. 屏蔽IP是GFW在网络层(Network Layer)上的封锁和干扰,是在IP路由协议上完成干扰。
GFW审查在OSI模型上的审查的位置:

反网络封锁的技术方案

GFW针对具体网站的方案有以下三种:
  1. GFW把域名为作敏感字来屏蔽
  2. GFW把域名所在的IP屏蔽
  3. GFW干扰域名DNS解析
相应对抗GFW,网站的主人有下面几个方法:
  1. 网站使用SSL加密对抗关键字审查;
  2. 给网站换IP避开IP屏蔽;
  3. 推荐大陆的网站访问者使用国外的DNS解析服务器,或推荐大陆的访问者使用tor来避开DNS干扰
  4. 推荐读者使用在线RSS阅读器来读取最新文章
相应对抗GFW有的具体方法
  1. 使用SSL加密对抗关键字审查

    HTTPS是基于SSl的HTTP协议,是安全超文本传输协议。当用户访问使用HTTPS的网站时,用户端的浏览器需要先获取网站的安全证书和来自认证的安全证书发行商的数字签名,此安全证书为服务器的公钥,服务器用私钥把网页内容加密进行传输,客户端浏览器以公钥解密即可得到网页内容。网络内容的传播过程中,内容是加密的,无法被GFW自动审查传输的内容,亦无法被GFW插入"reset"信号。
    1. 实例1:在2007年11月到2008年7月,https://www.zuola.com  曾用HTTPS成功避开GFW的审查,让中国大陆的网民能够直接访问此网站。
    2. 实例2:当人们无法访问http://knol.google.com/k/-/-/3jhi1zdzvxj3f/2时,改用 https://knol.google.com/k/-/-/3jhi1zdzvxj3f/2 就可以访问
  2. 给网站换IP避开IP屏蔽

    使用SSL加密可对抗GFW的内容审查,GFW如何对付HTTPS呢?
    GFW的工作人员遇到使用HTTPS的网站后,他们知道无法使用机器自动的过滤他们心目中的“敏感内容”和“有害内容”,于是直接屏蔽网站的IP,此时,通往此网站服务器的任何数据包都无法直接越过GFW到达目的地。此时只需要更改网站域名的A记录,换一个IP就可以避开屏蔽IP。此时就像猫和老鼠的游戏了,GFW只好跟在后面不断屏蔽IP,并且GFW的屏蔽IP的工作是人工执行的。无法通过机器自动执行。如果GFW能够自动执行屏蔽IP的操作,那被屏蔽IP的域名的拥有者就可以借用GFW的能力屏蔽任何境外网站了。
    1. 实例3:在2007年11月到2008年7月,https://www.zuola.com  曾用SSL加密+换IP 成功避开GFW的审查,让中国大陆的网民能继续能够直接访问此网站。
    2. 实例4:https://doubleaf.com 也使用SSL加密和换IP的手段让中国大陆的网民能直接访问
  3. 推荐大陆的网站访问者使用国外的DNS解析服务器,或推荐大陆的访问者使用tor来避开DNS干扰

    在2008年奥运期间,我发现GFW针对 www.zuola.com 使用了DNS劫持的方式一劳永逸的屏蔽方式,导致国内用户无法直接获得我的网站的正确IP,即使使用“无界”“自由门”“VPN”等突破封锁的工具,也会走错门。那就只能推荐读者《使用TOR+FoxyProxy插件突破GFW》了,TOR是一个分布式的、匿名的网络,Foxyproxy是一款代理服务器管理软件,可以让Firefox使用TOR来收发DNS请求:

    TOR的工作方式
    Tor 有助于降低简单的和高级的流量分析的风险,Tor 把你的流量分散到互联网上的多个地点,所以不存在单一的一点可以把你和你的目的地联系起来。这就好像用一条拐弯抹角的、难以辨认的路径甩掉跟踪你的人,然后定期擦掉你的脚印。在 Tor 网络上,来源和目的地不是用一条路径直接连接的,而是由一条通过数台中继的随机路径覆盖原始路径,数据包在这条路径上传输,因此,不存在任何单一一点上的观察者能够知道数据从哪里来、到哪里去。
    用 Tor 创建一条私有网络路径时,用户的软件或客户端通过网络上的中继递增地建立一条由若干加密连接组成的环路(circuit)。环路一次扩展一跳(hop),环路上的中继仅仅知道它从哪一个中继接收数据以及向哪一个中继发送数据。没有一台单独的中继会知道数据包的完整路径。客户端与环路上的每一跳都协商一组独立的密钥,这样可以保证数据通过任何一跳时都无法跟踪。

    一旦环路建立完成,多种类型的数据可以在上面进行交换,不同种类的应用程序也可以在 Tor 网络上部署。因为每一台中继最多只能知道环路中的一跳,窃听者或者被入侵的中继都无法通过流量分析把连接的来源和目的地联系起来。 Tor 仅作用于 TCP 数据流,任何支持 SOCKS 的应用程序都可以使用它。
    出于有效性,Tor 为大约在相同的十分钟内发起的连接请求分配同一环路。以后的请求被分配不同的环路,这样他人就不能把你早先的行为和新的行为联系起来。

  4. 推荐读者使用在线RSS阅读器来读取最新文章

    Really Simple Syndication(RSS)是一种严格XML的信息传递的格式规范,标准的XML格式文档可允许信息在一次发布后通过不同的程序阅读,易于分发和聚合(Sysndicat)。RSS是这种XML应用搭建了信息迅速传播的一个技术平台,网站的最新内容通过RSS Feed传播,能通过在线RSS阅读器自动推送文章到读者的阅读器,人们无需直接访问网站就能看到最新的内容,RSS能够让内容很容易的被分发,只需要知道RSS地址,网络上无数的在线RSS阅读器总能读取到RSS Feed中的内容。RSS是很容易生成并分布的,这是GFW无法拦截或需要大量资源才能够封锁的一种技术。
    实例:
    1. 实例5:我的网站自2007年4月重庆最牛钉子户报道后被屏蔽,但我的FEED地址 http://feed.zuola.com/ 的订阅数却一直在增长,Google Reader订阅用户数量从 700左右增加到2686。不过GFW仍然会干扰Google reader,使用https 的方式 https://www.google.com/reader/view/ 才能看到以下数据

    2. 实例6:《看不见的西藏》是一个藏族人的BLOG,虽然国内读者无法直接访问,但中国大陆的读者仍然能够通过订阅她的RSS FEED来看到她眼中的西藏,这个Feed是可订阅的 http://woeser.middle-way.net/feeds/posts/default
此文档的其他站点备份:
  1. http://space.zuola.com/D2AC7D299F493A68_241.html
  2. https://docs.google.com/View?docid=dggh5mp6_0zzmm4fdn
  3. http://zhoushuguang.blogspot.com/2009/03/blog-post.html
  4. https://knol.google.com/k/-/-/3jhi1zdzvxj3f/14
参考文档:

转载自:周曙光的网络日志-http://www.zuola.com/weblog/2009/03/1353.htm