[DD-WRT] 为 Netgear R6300v2 交叉编译 shadowsocks-libev

在开头强烈推荐一篇介绍交叉编译概念的文章,对交叉编译不熟悉的同学建议先读一遍,可以帮助解决接下来可能会遇到的很多问题。

Building and cross-compile tutorial

家里用的路由器是 Netgear 的 R6300v2,刷的是K大去年停止维护前的最后一个版本

DD-WRT v24-sp2 (10/08/14) kongac – build 25100M

之前在学校的时候用它装了迅雷固件脱机下载,用内置的PPTP VPN建了个 VPN Server,跑了一年感觉性能强劲毫无压力,之后一直就这么在用着。到了北京之后情况有了点小变化,PPTP 在外网情况下很容易被探测出来并且被联通直接封锁。所以需要从 PPTP 换成 OpenVPN,在 DD-WRT 下折腾了两天配置,走了不少弯路,总算搞定了,家里的线路连接海外ip时十分稳定,所以在公司的时候也用 OpenVPN 连到家里将国外的流量转发出去,使用了几天感觉很理想,于是想进一步优化一下方案,将 Shadowsocks 部署在路由器上,这样所有可以通过 VPN 连接进来的设备就可以免客户端实现透明翻墙了,对 iOS 设备来说是一个比 VPN 直连更好的方案。

查了一下,Shadowsocks-libev 可以运行在 OpenWRT 上并且已经有前人成功为 DD-WRT 平台成功交叉编译,其中最为详细的一篇是在腾袭的博客里面提到的,不过文章里面提供的版本比较旧了,是1.4.6版本的,这也是公开资源里面能找到的最新的版本了。看了一下距离现在(2.3.1)之间已经相差了很多个版本,本着我用新不用旧的心理产生了重新编译一份新版本的想法。既然前人已经证实了在同样的硬件+软件平台下可以运行,那么基本新版本的代码也可以拿过来运行。

不过首先交叉编译的概念对我来说就很陌生,顺手搜了一发,根据百度百科的说法,就是在一个平台上生成另一个平台的可执行代码。那这句话很好理解了,比如嵌入式设备的存储空间和计算能力有限 ,可能需要在其他平台上直接使用嵌入式设备的运行环境编译好可执行文件拷贝过去直接运行。那么接下来的工作主要还是围绕编译进行的,基本上是“选择对应的工具链(toochain)—设置编译参数—排除问题—测试”,在第一次编译时,参照前面腾袭博客里的文章,除了作者提到的几个地方之外,又又一些新的问题出现了,所以整个排坑的过程持续了将近一天,关键的工作主要由我的同事完成,他在编译和调试方面的经验让我少走了很多弯路。我们一起编译成功了2.3.1版本的源码,已经在我的路由器成功运行将近3个星期的时间,v2.3.1可以在这里下载

下面我将以编译当前最新版本(2.3.3)为例,记录一下编译的过程,以便让有类似需求的同学进行参考。在阅读下面的内容之前建议首先阅读上面博客链接里的内容以便更好的理解整个过程。

假设当前的工作目录为 /home/shadowsocks-libev,首先下载 OpenSSL 和 shadowsocks-libev 的源代码,分别可以在链接里面找到最新版。下载后解压到工作目录。这里 OpenSSL 我选择了1.0.2d版本。接下来下载编译所需要的 toolchain,原文中的链接已经失效了,DD-WRT 官网的下载页面进行了调整,所有的 toolchain 都被打包到一个大的压缩包(1.8G)中,下载下来后经过漫长的解压得到很多不同的组合。

toolchain-arm_cortex-a9_gcc-4.8-linaro_musl-1.1.5_eabi
toolchain-arm_mpcore+vfp_gcc-4.8-linaro_musl-1.1.4_eabi
toolchain-armeb_xscale_gcc-4.8-linaro_musl-1.1.2
toolchain-i386_gcc-4.7-linaro_uClibc-0.9.33.2
toolchain-mips64_octeon_64_gcc-4.9-linaro_uClibc-0.9.33.2
toolchain-mips_34kc_gcc-5.1.0_musl-1.1.9
toolchain-mips_mips32_gcc-4.8-linaro_musl-1.1.6
toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
toolchain-mipsel_3.3.6_BRCM24
toolchain-mipsel_4.1.1_BRCM24
toolchain-mipsel_74kc+dsp2_gcc-5.1.0_musl-1.1.9
toolchain-mipsel_gcc4.1.2
toolchain-powerpc_e300c3_gcc-4.8-linaro_uClibc-0.9.33.2
toolchain-powerpc_gcc-4.6-linaro_uClibc-0.9.33.2
toolchain-x86_64_gcc-4.8-linaro_uClibc-0.9.33.2

我们最后选择最接近的一个 toolchain-arm_cortex-a9_gcc-4.8-linaro_musl-1.1.5_eabi ,拷贝到工作目录中来。然后将 toolchain 下的 bin 目录加入到环境变量中

export PATH="/home/shadowsocks-libev/toolchain-arm_cortex-a9_gcc-4.8-linaro_musl-1.1.5_eabi/bin:$PATH"

首先编译OpenSSL,腾袭在博客中提到需要首先解决缺少 uClibc 才需要的 termio.h 头文件的问题,我们现在使用的是musl,所以首先在 Configure 文件中将 -DTERMIO 改为 -DTERMIOS

sed -i 's/-DTERMIO/-DTERMIOS/g' Configure

然后修改 OpenSSL 源码中 ./crypto/ui/ui_openssl.c 文件,在下面一行(222行)

#ifdef TERMIOS

前添加以下内容来绕过这个问题。

#define TERMIOS
#undef  TERMIO
#undef  SGTTY

接下来可以进行配置和编译了

CC=arm-linux-gcc 
CXX=arm-linux-g++ 
AR=arm-linux-ar 
RANLIB=arm-linux-ranlib 
./Configure no-asm shared --prefix=/home/shadowsocks-libev/ssl linux-armv4
make
make install

编译成功后会在 /home/shadowsocks-libev/ssl 目录下得到编译好的 OpenSSL,接下来继续编译 Shadowsocks-libev。

编译 Shadowsocks 的时候是一样的思路,只不过中间出现的一点迷惑性的问题把思路带偏了,排查了很久才解决。在 Configure 的过程中,配置脚本会尝试对一些脚本进行尝试编译,这过程中如果出现问题就会终止脚本报错,我在编译2.3.1版本的代码时,出现了如下的错误提示

checking for linux/netfilter_ipv6/ip6_tables.h... no
configure: error: Missing netfilter headers

这里的提示 Missing netfilter headers 实际上是由Configure脚本在 try compile 的时候出错导致的,但是错误提示却让人以为是没有找到这个文件,所以一开始解决问题的方向错了, 耽误了很长的时间,最后找到错误的原因是 linux/netfilter_ipv6/ip6_tables.h 文件中使用了 u_int16_t 和 u_int8_t 类型却没有找到声明的原因,因此在编译的时候会因为 undefined type 而中止。我这里简单地在 /home/shadowsocks-libev/toolchain-arm_cortex-a9_gcc-4.8-linaro_musl-1.1.5_eabi/include/linux/netfilter_ipv6/ip6_tables.h 文件中添加了一行(可以添加在第25行)

#include <sys/types.h>

解决了问题,不知道这样的解决方案会不会带来什么其他的问题,不过在我后面的时候中一切正常。有更彻底地解决方案欢迎留言。

后记:在最近的更新中,可能增加了 pcre、zlib 等依赖,需要同 openssl 交叉编译的方法同样编译好后再使用 –with-xxx= 的方法在编译时传入,此处不再赘述,可以直接使用下面编译好的版本或者自行尝试~

CC=arm-openwrt-linux-muslgnueabi-gcc 
CXX=arm-openwrt-linux-muslgnueabi-g++
AR=arm-openwrt-linux-muslgnueabi-ar 
RANLIB=arm-openwrt-linux-muslgnueabi-ranlib 
./configure --prefix=/home/shadowsocks-libev/shadowsocks-libev-dd-wrt --with-openssl=/home/shadowsocks-libev/ssl --host=arm-linux --disable-ssp
make
make install

最后附上编译好的版本的下载链接吧,没有条件的可以直接用,只打包了可执行文件:

(我会在我的路由器服役周期内不定期进行新版本的编译并更新下载链接,如果有新版本发布后我没及时更新,可以在留言里喊我)

2016-11-16 更新:编译v2.5.6 –disable-ssp

2017-04-06 更新:在 R8000 下测试可以直接使用

  • 点击下载:v2.5.6
  • 点击下载:v3.0.5  3.0后改动较大,正在测试中

支持固件列表(经本人测试正常使用)

  • DD-WRT v24-sp2 (10/08/14) kongac – build 25100M
  • DD-WRT v24-sp2 (02/04/15) std – build 26138(推荐,感觉相比于25100M版本在5G下的表现稳定了许多,同时也是目前推荐使用的最新的 stable 版本)
  • DD-WRT v3.0-r28000M kongac (10/24/15)
  • DD-WRT v3.0-r31800M kongac (03/31/17)

互联网封锁是如何升级的

本文转载自@风尚咖的长微博,原文现已被和谐。

1987年,中国第一封电子邮件由中国兵器工业计算机应用研究所发往德国,标志中国成功接入互联网。邮件内容是:“Across the Great Wall we can reach every corner in the world”——穿越“巨墙”(长城),我们无处不及。与这封邮件几乎同龄的我,没想到生活中竟总离不开“墙”。在物理世界和虚拟世界中多次穿墙,也去过世界各处,看“墙”越筑越高,有时义愤填膺,有时啼笑皆非。仅以此文,记录“墙”边的一些见闻。

国家公共网络监控系统

国家公共网络监控系统,俗称中国网络防火墙(The Great Fire Wall of China,常用简称“GFW”或“墙”)。一般意义所説的GFW,主要指中国官方对境外涉及敏感内容的网站、IP地址、关键词、网址等的过滤。随着使用的拓广,中文“墙”和英文“GFW”有时也被用作动词,网友所説的“被墙”即指被防火长城所屏蔽。

2008年校园网:“连坐”惩罚

2007年,我进入这所XX理工大学。它特别吊诡的设定是,大一不能带电脑,大二考过国家英语四级的人才可以带电脑。就这样,2008年秋天,我终于正大光明地连上校园网。千兆比特级别以太网直入国家主干网,中国电信、中国教育网双通道。这个规格,算是极高的。网速之快,前所未见;可是,总有一些网站访问不了。但这些小细节,终究不影响同学们DotA(一款基于Warcraft的对战地图)的热情。

那个时候,我们愉快地上Google,查Wikipedia,学习西方先进科技。不时有好事者,会键入诸如“六四”、“胡萝卜”、“温度计”(网民用来形容胡锦涛与温家宝的指代用词)这样的神奇词汇,于是全校与Google失联十数分钟。每当到这个时候,室友们相视一笑,“哦,谁又撞墙了!”但打壶开水,泡一杯面,还不等吃完,就又可以Google了。

那个时候的“墙”就好像霰弹枪,火力充足,但瞄不太准。一枪下去,打一大片,总是搞得“城门失火,殃及池鱼”。

墙如何运作?

一台机器要与互联网上的其他机器对话,需要一个IP地址,好比一个人需要身份证(ID),才能唯一标识一样。否则,你喊一句话,对方不知应该回话给谁。而IP地址的总量是有限的,就好比一个大小固定的蛋糕。美国入场早,切走一大块。接着列强瓜分。等到中国的时候,还剩下点面皮。而该理工大学在这轮“圈地运动”中,只得到2个IP地址,给全校数万师生共用。这下好了,一个IP后面几万人,究竟谁在干什么,从校外是看不清的了。早期的防火墙,只能粗糙地在IP级别上执行封锁,要管束,只能全盘封了整个学校的网络。但毕竟一所国家重点高校,不可能用这种方式来管理,但不封锁,又无法向监管部门交代。

evolution_of_the_gfw_1墙早期对用户的“连坐”惩罚策略。制图:金秋枫

说到底,监管当局不乏能工巧匠,他们很快想出一个办法:封杀大约4千个连续的端口(Port)。如果我们把IP地址比作一栋房子 ,那么端口就是出入这间房子的门。不同于真正的房子只有几个门,一个IP地址的端口可以有65536(即2的16次方)个之多。端口在一定时期内是被内网的一个用户独占,于是数据包可以准确地回到始发地。不过,封一个端口不过瘾,只是撞墙者自己倒霉而已。试想,你好不容易把野马制服了,又会有一些原本安顺的良马变野,效果不佳。最好的办法就是让它成为害群之马,以做警示。所以,一旦内网某个用户登陆Google检索“敏感信息”,这意味着一个端口“撞墙”,“墙”就把接连着的约四千多个端口都封掉,令无辜群众也无法上网。这种断网的“连坐惩罚”短则几分钟,长则十几分钟,才能恢复服务。

2010年北京:合租服务器翻墙

3月,Google位于北京中关村的办公室楼下堆满了鲜花,网友以这种方式纪念因“遭受中国骇客攻击”和“网络审查”而决定退出中国市场的Google。

“墙”这个概念越来越清晰,也进入了更多人的视野。2009年,Facebook和Twitter相继被封,昭示着中国政府通过防火墙阻隔国际互联网,建立“局域网”的决心——“局域网”是中国网民对墙内状况的戏称。

“咱们合租一个VPS(Virtual Private Server)吧”,这是技术青年们见面经常谈到的话题,仅次于买房和买车。VPS即虚拟主机,向服务商租取一段时间使用权即可。以前,大家合租VPS,多是为了搭个博客,赶赶时髦。而现在,合租VPS,多是为了翻墙。

evolution_of_the_gfw_2墙外丰富多彩的世界吸引着年轻人。制图:金秋枫

对这些年轻人来说,“翻墙”用Google检索最新资讯,使用垃圾邮件最少的Gmail,随时查询在线百科全书Wikipedia,通过Facebook、Twitter与同行保持密切的技术资讯沟通,就像呼吸一样自然。也有更多人翻墙是要选择不同服务器进行联网游戏,或下载最新的影视内容,“翻墙”就像玩猫和老鼠的游戏。

VPS如何帮你翻墙?

当你发一个数据包到Google或者Facebook时,防火墙可以直接识别目的IP地址而自动拦截。而前面提到的VPS,是虚拟主机,自己也有IP地址,但无公开记录其归属,难以确认是否是敌军。既然如此,我们把数据包先发到VPS,再由它中转到目的地,就成功绕开“墙”了。由于VPS的这种特性,它也被称作“跳板”。

evolution_of_the_gfw_3“跳板”是所有“翻墙”技术的共通原理。制图:金秋枫

利用一个“跳板”绕过“墙”,正是许多翻墙软件的基本原理。曾经繁荣的翻墙软件“无界”、“自由门”,还有众多的“代理服务器”,包括后来更广泛应用的VPN(Virtual Private Network),都是借用跳板原理。VPN最早是用来帮助一个企业多地的办公室间互联,也可以让员工在异地进入公司内网,方便执行一些高权限的作业。这样一来,跨国公司天然就拥有了穿墙的隧道:数据包先发到海外办公室,再去向世界各地。所以,VPN也成了跨国公司员工翻墙的主流手段。

这年,我第一次用“ssh -D”(一行命令)翻墙。SSH可以让系统管理员连接上主机,进行远程操作。同时它相当于在客户端与服务器之间建立了一个隧道,所以也能传输其他的数据,包括“翻墙”流量。只要这台机器的IP不在墙的“黑名单”中,也就可以成功绕过墙的封锁了。对技术人员来说,买VPS是最简单且低成本的翻墙方法。即便一台VPS被墙,再买一台即可。一年几十美元的价格,合租下来非常便宜。

evolution_of_the_gfw_4SSH协议可以建立“隧道”,成为技术人员“翻墙”的最爱。制图:金秋枫

2011-14年香港:“墙”成为一门显学

在Google、Wikipedia中文、Facebook、Twitter等全球流行网络应用被阻隔在防火墙之外后,中国大兴土木建设的“局域网”,这几年也初现雏形。

搜索用百度,邮箱有163/QQ,社交有微博/人人,购物用淘宝/京东,即时聊天用微信——各种互联网服务,墙内应有尽有。对大部分网民来说,翻墙成了越来越不必要的需求。而剩下的一小拨执着于翻墙的用户,以及全世界致力于研究“墙”的学者,他们见证了“墙”的升级,与之斗智斗勇,也从一些滑稽的表象,捕捉到“墙”发展的各种蛛丝马迹。

因“墙”不同的工作原理,越来越多的翻墙工具被开发出来。对“翻墙”这个行当来说,这是个百花齐放的时代。

解析邮件

2011年初,Gmail大规模延迟,这可能是生活在中国的很多“良民”第一次看到墙的影子。他们并不是Twitter、Facebook的忠实用户,对自由世界的“危险信息”也并不感兴趣,只是日常收发邮件,竟也撞墙。实测显示,Gmail与大陆服务商之间的邮件有不同程度的延迟,少则几个小时,多则几个星期。人们纷纷猜测,“墙”已经进化到开始解析邮件。

evolution_of_the_gfw_5“墙”开始尝试解析墙内外邮件,终因负载太高,造成大规模延迟。制图:金秋枫

敏感词触发RST,偶尔需要“向内翻墙”

这几年,我在香港求学,当时因为研究需要,我要下载大陆某公司的中文词库,奇怪的是,无论使用何种工具,进度条总是停在70%的地方。后来分析发现,每次下载到这个位置的时候,系统就会收到一个“RST”包──“RST”是“Reset”(重置)的意思。这是一种特殊的数据包,当计算机收到这种包的时候,会重置一条网络链接。这个特点被“墙”广泛用来掐掉“不和谐”的网络链接。好比A和B正在打电话,“墙”想要掐断电话,和以前粗暴地摔电话机不同,“墙”对A说:“B挂你电话了”,同时又对B说,“A挂你电话了”,不明真相的两人就真的自己把电话挂掉了。敏感词触发RST,这种“墙”的工作机制,如今已是衆所周知。而这种监控与阻断是双向的,出入都可能撞墙。有时候在墙内需要翻出来,有时候在墙外需要翻进去。

evolution_of_the_gfw_6通过“RST”欺骗通信双方,以阻断链接。制图:金秋枫

走出国门的DNS污染

DNS(Domain Name Service)即“域名解析服务”,功能好比是互联网上的电话簿。早期,仅通过IP来封锁服务的话,“墙”需要查看每个数据包,判断是否放行。但使用“DNS污染”技术,相当于直接给用户一个错误的“电话号码”,从源头就遏制了“不良通信”。值得注意的是,“DNS污染”这种强力武器,不仅能有效封锁国内网民对敏感内容的访问,还会连带影响其他国家。2012年,世界顶级网络通讯会议SigComm上,出现一篇匿名论文。论文发现,中国发动的“DNS污染”已经超越了国界。在测试了全球4万多个域名解析服务器后,他们发现其中26.41%的服务器受到了这种污染的影响,覆盖109个国家。

evolution_of_the_gfw_7DNS污染。制图:金秋枫

近500个实体“哨所”

2012年,一组来自Michigan大学的研究者,对“墙”的位置进行了探测。他们发现,就像真实的长城并非连绵不断的,防火墙也并不是密不透风地“堵”在我们的“网络”上,而是一组散落各处的“哨所”,只有当发现威胁的时候,它们才用“RST”或“DNS污染”这样的方式进行干扰。截止2012年底,研究者总共探测到了近500个这样的“哨所”,在中国南方,部署数量头三位的省份为:广东(84个)、福建(29个)、湖南(28个)。

小插曲是,研究者把探测“哨所”的工具在GitHub(世界最大的开源代码托管服务)上开源发布后,引起了激烈的争论。一些人认为,此举会激怒“墙”的管理者,导致GitHub被封锁,影响墙内程序员学习交流,所以应该删除这样的代码仓库,“保持技术社区的纯粹”。另一些人,则认为翻墙是程序员的基本技能,表示不受影响,所以力挺该项目,并极力反对技术社区加入“自我审查”的行列。

深度数据包检测

2012年底,“墙”的总设计师、北京邮电大学时任校长方滨兴的研究团队曾发表论文“网络流量分类,研究进展与展望”,文章提到了多种使用机器学习进行“深度数据包检测”(Deep Packet Inspection,DPI)的技术。随后几年,这些先进的技术逐渐在“墙”上部署开来。

要理解“深度数据包检测”的威力,我们可以把数据包想像成一封信。“浅度”的数据包检测,就好像是看看信封上的发件人和收件人,即决定是否放行。这给“跳板法”留下可乘之机:我们先将信送到中间站(如虚拟主机VPS),再转发到目的地,就绕过检查了。“深度”的数据包检测,可以理解成对信件内容的探查──相比起暴力打开信封,这种基于机器学习的技术更具有艺术性。它并不实际解读数据包的内容,而是搜集周边信息,对数据流进行“肖像刻划”(Profiling)。举个例子,你用Google搜索时,网络上只会有文本和少量图片经过,数据量很小,并且是突发的;但用YouTube看视频时,就会有持续一段时间的大量数据流过。“墙”的监控也是基于这样的抽象指标,比如它监控到到间歇而细小的流量,便推断你不太可能是在用YouTube。将诸如此类的可参考指标放在一起,就组成当前数据流的一副“肖像”。把这个“肖像”与数据库里面已经存放的巨量“翻墙流量肖像”和“非翻墙流量肖像”做个比对,就可以相应归类了。如所有的机器学习算法一样,这种归类会误杀一些非翻墙流量,也会错放一些翻墙流量。但日积月累,“墙”观察的样本越多,准确率也就越高。

evolution_of_the_gfw_8浅度与深度数据包检测。制图:金秋枫

2015年深圳:“墙”的疯狂进化

新时代的墙,像是手术刀,精准迅速,直击命门。

在深圳小住半年,我深刻感受到“数字围剿”的压力。随着2014年底,Gmail全面被封禁,墙进化迅速、部署增强,还配合行政措施打击翻墙势力。深度包检测的大规模部署、DNS污染的扩大、转守为攻的国家防火墙策略、ISP的深度合作——“墙”俨然是正规军,而翻墙的社区只能打一场场的游击战,越打越疲惫。

首先,是香港的学校专用VPN开始不好使了。据传,几种主流的VPN协议已经被“墙”破解,手段十分细腻:有时候连上VPN,可以使用Google搜索和Google Drive办公,但一旦链接YouTube或者Facebook,网络链接就立马被掐掉了。

紧接着,一系列政策出台:境外VPN需要备案。像Astrill等常用的商业VPN服务,迅速被封。

同时,“DNS污染”的范围与频度都扩大了。为了抵御“DNS污染”,我曾一度使用“DNSCrypt”——这个开源项目会加密客户端和服务器之间的通信内容,不被墙查探到。然而好景不常在,很快,“墙”将已知的DNSCrypt的服务器IP计入黑名单,这样连访问DNSCrypt的服务器也是需要“翻墙”了……有段时间,我依赖SSH+DNSCrypt翻墙。但这套组合拳,最终打在墙上只是手疼,而墙还是泰然自若。

更有甚者,一些二级ISP(不自建主干网,但提供社区宽带接入到主干网服务的ISP)参与了合作,封禁“非常用”的DNS地址。家庭宽带用户,只能选择ISP默认分配的DNS,或者一些“广为人知”的DNS服务器,如Google多年前提供的8.8.8.8(该服务器的IP地址)就是其中之一。“4个8”曾经是大陆网民用来抵御“DNS污染”的缓冲剂,但它使用普通DNS协议,很容易被攻击。社区很快发现,“墙”会选择性地污染8.8.8.8返回的结果。

“DNS污染”、“RST攻击”、“深度数据包检测”——“防火长城”的一套立体防御体系已经建成。从左到右,精准度逐渐加大,防御成本也逐渐加大。这个时候,不管使用什么VPN,最常见的现象是,翻墙几分钟后,网络延迟加大,进而链接被阻断,导致日常工作都不能正常进行。

“进攻是最好的防守”——2015年3月,国家防火墙突然转守为攻。这是一种与“防火长城”(Great Fire Wall,GFW)部署在一起的设备,网友戏称其为“大加农炮”(Great Cannon,GC)。经过3月初的一系列测试,“大炮”从3月中旬开始发动疯狂攻击,其首轮攻击的重点目标之一是GitHub上“greatfire”这个代码仓库。“greatfire”上集结了大量的翻墙工具与资讯,俨然一个巨大的“翻墙军火库”。“大炮”攻击目标的原理简单而有效:它会劫持跨越中国边境的流量,注入恶意脚本,向指定目标发动“DDoS攻击”。

DDoS

DDoS(Distributed Denial of Service,分布式拒绝服务),是一种通过巨大流量导致目标服务器不堪重负而下线的攻击手法。DDoS是一系列方法的统称,他们使用不同的技术,“大炮”所使用的流量劫持并注入恶意脚本的技术是一种比较新的形式。衡量一场DDoS攻击的能量,可以使用“峰值速率”。如2014年6月,香港的公民投票网站“PopVote”受到超过“300Gbps”的攻击,连提供网络支持服务的Google和Amazon都抵挡不住,宣布退出,最终服务商靠着全球网络服务业者联手,才维持“占中”公民投票持续进行。2015年7月,支持加密功能的即时通信软件Telegram受到超过“200Gbps”的攻击,受影响区域很快从东南亚蔓延到全球,导致大量用户无法通信。要知道100Gbps的流量有多大,可以想像同时在线点播两万部高清(720p)视频。也可以参考的一个数据,据CNNIC报告显示,截至2014年底,中国大陆的所有国际出口带宽总和为4100Gbps。

“墙”转守为攻的这一异常举动,是一个明显的信号,希望GitHub删除“有威胁”的代码仓库。最终,在巨大的舆论压力下,“大炮”停止了攻击。在墙的攻防体系中,“大炮”虽然不直接设防,但它对墙外的“反动势力”是一种威慑的的存在——必要的时候,随时可以出击。

evolution_of_the_gfw_9墙的招式列表。大炮作为一种威慑的存在,以攻为守。制图:金秋枫

在“墙”的拼命围剿之下,传统翻墙手段逐一失效。原因很简单:主流方法都有特定的模式,逃不过基于机器学习的“深度包检测”技术。机器学习的准确性是随着样本增加而提升的,所以要逃离“墙”的围剿,就得把自己的流量伪装得不一样。海外专业VPN服务Astrill,以及国内的“曲径”、“红杏”等后起之秀,都是通过打造私有协议,来绕过检测。

在这种形势下,开源翻墙利器ShadowSocks被更多的人注意到,基于SS搭建的翻墙服务如雨后春笋一样出现。它的中文名为“影梭”,社区昵称为“SS”——这是一个由中国程序员发起的开源项目,主要开发者在墙内。

2012年4月,SS第一份代码提交;

2013年,SS完成主要开发;

2014年夏开始,由于墙的升级,SS受到社区更多的关注,进入高频升级的阶段;

……

evolution_of_the_gfw_10ShadowSocks开发记录。

ShadowSocks提供的其实是一套框架,支持多种加密方式,可以监听不同的端口,只需要很简单的配置,就可以在客户端和跳板机之间建立一条隧道。这些特点,让SS成为“游击队员”们最喜爱的工具。作为一款“非主流”的工具,SS曾经是非常有效的翻墙手段。但从15年初开始,深圳的部分ISP已经部署针对SS的阻断系统——推测是基于同一套“深度包检测”技术。好在SS的参数衆多,随便调整一下,即可生成不同的“肖像”,令“墙”在观测不足的情况下,无法迅速动手。但随着时间推移,“墙”总会搜集到足够的样本。刚开始的时候,选一套SS的参数可以坚持几个星期,到后来,就只有几个小时了。但墙一天不倒,游击战就一天不停。换密码、换加密协议、换端口,如每天吃饭一样,逐渐变得规律。实在不行,就只有换IP了,即再买一个VPS。SS的高级玩家,会加入自己定制的加密模块,使得流量更隐蔽。总之,SS是一个开源项目,玩法多种多样,打游击的优势巨大。

2015年香港:遥看墙内围剿“造梯人”

还有太多重要的事情要做,不能将时间浪费在与“墙”无休止的游击战中——我决定搬回香港。

而墙内,一场密谋已久的围剿,终于显露。

8月20日,ShadowSocks作者在GitHub上关闭了相关项目的Issue面板并清空所有帮助信息,同时GitHub上“shadowsocks”组织的成员信息被隐藏。

8月21日,GoAgent(一款曾经主流的翻墙软件,托管在Google Code)的论坛上传出SS作者“被喝茶”的消息。

8月22日,ShadowSocks作者现身GitHub,证实“喝茶”,并删除了代码库。

8月25日,Google Code转为只读状态,GoAgent论坛散落。

8月25日,GoAgent托管在GitHub上的仓库被删。

8月25日,GitHub受到超过两个小时的DDoS攻击,攻击源目前不明。

8月26日,多处消息源显示,曲径、红杏等大陆多家VPN服务商受到直接或间接的压力,停止服务。

……

以前干掉的是制造和售卖梯子的人,现在连设计梯子的人也要干掉。

未来会如何呢?可以想像,大规模的VPN服务会消失;一些小规模的地下服务,继续运行。另一方面,翻墙工具链,势必会持续升级。公开的成熟项目被封后,社区会衍生出不同变种,以适应“墙”的改变。特别是像SS这样的开放框架,稍作修改,又是一种玩法,无穷无尽。但没了牵头的人,没了集中的论坛,知识传递的形式将会反古。原本,互联网让知识可以扁平传递,现在“屠梯”行动恐将人们逼回“口耳相传”的模式。未来,“翻墙”可能是一种手艺,如何传承,任重道远。

北京联通光猫 HG221G 管理员帐号破解+设置桥接模式

来北京之前对于这个城市为数不多的期待之一就是宽带,正好赶上了这一波降费提速的浪潮,于是租好房子之后第一件事就是马不停蹄的办了联通100M的光纤。宽带师傅装好之后第一时间体验了一下,100M带宽达标,瞬时峰值大约在110M左右,更令我满意的是,国际带宽很给力,访问Linode日本延迟在80-90毫秒之间,再加上直接分配的公网ip,给了很大的发挥空间。

就这么愉快地用了一个月(其实关于如何在屋子里的每个角落发挥这100M的带宽还有一段血泪史,有时间另写一篇记录下),直到最近公司的网络越来越不给力,访问国际ip经常中断,shadowsocks和ssh经常性的中断,联想到家中的线路不错,而且手上这台R6300v2刷了dd-wrt之后可以开pptp和openvpn两种vpn,可以考虑家里路由器开一个VPN,来代理这部分流量。想法来了就要付诸实践了,第一个问题就是家里联通的光猫烽火hg221g默认是路由模式,而且功能很弱没有提供DMZ或者端口转发的功能,于是第一步就是想办法拿到设备的管理员账号来查看有没有这两个功能或者把路由模式换成桥接模式,由路由器直接拨号,这样不仅减少了一层路由转换,而且也可以试试能不能用多拨来突破100M的上限。

使用“烽火HG221G+破解”、“HG221G+管理员”、“HG221G+联通”等关键字进行搜索,得到的信息都不理想,一是多数帖子讨论的是电信定制的设备,还有一个类似的型号HG221GS。二是部分帖子里面通过backupsettings.conf拿到管理员密码的方法忽略了很重要的一步,启用管理员帐号。所以搞了一个多小时也没有成功,拿到了管理员的帐号和密码,但是登录时总是提示用户名或密码错误,更新了user账号的密码之后在backupsettings.conf可以看到相应记录的变化,证明了配置文件中存储的是有效的内容。这让我很绝望,最后使用“HG221G+桥接”关键字进行搜索,找到了水木社区的一篇帖子,里面提到了内容参考自水木的另一个帖子,这么好的内容居然使用“hg221g+联通”和“hg221g+管理员”两次检索都没有在百度和Google前几页找到,无效的信息确实很多。帖子里面介绍的方法和我在backupsettings.conf里面看到的管理员帐号CUAdmin一致,心里感觉基本上这事有戏了。

根据上面第二篇帖子里的步骤,设置起来很简单,下面是上面第一篇链接的帖子提供的步骤

一、获得管理员账号

1. 访问 http://192.168.1.1/logoffaccount.html,隐藏用户改为启用,启用工程账号
2. 登录 http://192.168.1.1 工程帐号用户名:fiberhomehg2x0 密码:hg2x0
3. 开启 CUAdmin 账号:进服务设置,找到维护帐号开关,选开启后保存,这样就可以用管理员登录了
4. 访问 http://192.168.1.1/backupsettings.html 下载 backupsettings.conf
5. 在 backupsettings.conf 里找 AdminPassword
我这台上是 <AdminPassword>MTIzcXdlYXNkenhjAA==</AdminPassword> 打眼一眼应该是base64编码了一下,解码后得到弱口令 123qweasdzxc
6. 重新以普通身份登录到光猫(重要,否则直接登录管理员账户还是会提示密码错误),用户名:user, 密码:在光猫的背面
7. 登录 http://192.168.1.1/cu.html,管理员用户名:CUAdmin, 密码:123qweasdzxc

以上成功登录以管理员身份进入到联通光猫

二、修改桥接模式

8. 进入宽带设置-> Internet 连接,记下 2_Internet_xxx 链接中的 Vlan id, 帖子里说北京联通是3691,我这里是3961,不知道是不是原作者笔误,删除 2_Internet_xxx 链接,重启光猫
9. 重复步骤 6和7,以管理员登录,在宽带设置中新增 Wan 链接,模式选择桥接,选中Vlan,将 Vlan id 设置成之前记录下的 Vlan id,服务模式选 Internet
10. 选择一个端口(1或2)进行绑定,之后用路由器接在对应端口上,使用帐号密码进行拨号就 OK了。

dd-wrt 固件里面提供了 PPPoE Dual 的选项,于是直接测试了一下,结果感人,使用5G频段的无线下载带宽稳定在130M以上,瞬时峰值可以突破150M,在某个瞬间突破了200M,不知道怎么解释这个意外情况。附上一张当时随手测试截的图。使用 MAC 版迅雷同时离线下载了两个电影文件,测试方法不一定科学,但是应该还是有一定说服力。

 

PPPoE Dual