我的路由fuck_gfw方案

在功夫网越来越功夫的基础上,我不得不准备多套方案,家里用的是wl-520gc,未改机的,也就是说2MB/16MB的版本。因为我不知道上海这边谁可以提供这项服务。现在谁要是有消息的话,还请告诉我,价格别太高就行。

要改路由系统,非dd-wrt所属,但由于wl-520gc只有2MB的ROM,也就是所有的路由里面可以说最小的,再小好像就不可以刷了。所能做的功能也非常有限了。但我还是想要实现。在网上查了很多资料,大约准备了一周的样子,最后下定决心在昨天晚上给自己说:OK,来干吧(注意,以下所提到的软件或文档资料,最好提前准备好,以防万一)

首先是路由器的版本,需要wl-520gc的版本为2.0.0.8,网上说如果版本比这个版本高的话,可以通过修改文件名来做到降级,我一看我的路由器版本,2.0.0.6,我还需要升级呢。于是,从官方下载2.0.0.8的更新程序(为了以防万一,我从官方还下载了wl-520gc的所有能看懂文字的说明文档),二话不说,升级。

然后是dd-wrt的系统了,我刚开始是按照wiki上来的,地址在这里:http://www.dd-wrt.com/wiki/index.php/ASUS_WL-520GC

在上一步成功的基础上,这个成功率应该是非常高的,如果不高的话,按照说明文档恢复系统。我开始使用从官方获得的micro-ssh版本,我下的是svn15508的版本,地址在这里:ftp://dd-wrt.com/others/eko/V24_TNG/svn15508/dd-wrt.v24-15508_NEWD_micro-plus_ssh.bin,实际上,对于micro,micro-plus,micro-plus,micro-plus-ssh,区别并不大,如果你会用telnet传输和管理的话,我怀疑,micro就足够了。但我弄的时候并不清楚,也不会telnet,因此就使用了micro-plus-ssh,以下,均以micro-plus-ssh为准。

再次更新路由系统。漫长的等待时间。

然后在services里面开启ssh服务,登录进去。一个悲剧是,这个附带的是dropbear ssh,对于我们fuck要用的-D参数不支持,我们还要重新弄openssh(所以我才说,感觉哪个版本都无所谓),然后使用ipkg,opkg,发现全都无效。因为压根就没有这些命令。在jffs中建文件,无用,更不用说/usr之类的了,不过,幸运的是,在root根目录可以,而该目录位于/tmp中,看着文件夹名字都有写害怕。至于放到这里会不会消失,我也不是很清楚,没有试过(昨天晚上搞的好晚才睡,没想起来)。

写的地方找到了,openssh从哪儿弄呢,我翻遍了都没有找到,不过,google来帮忙了,我在这里:http://downloads.openwrt.org/snapshots/trunk/brcm-2.4/packages/openssh-client_5.5p1-1_brcm-2.4.ipk,其他需要的文件都在这里,需要下载的有libopenssl,zlib,你也可以从其他目录中来下载。我开始就是从http://downloads.openwrt.org/whiterussian/packages/下载的,不过好老。

我们下载的都是ipk文件,这是用于ipkg或者opkg安装的,我没有测试过,也无从测试。要安装这些文件的话,需要费点手脚。首先,使用7zip解压缩这些文件,然后,再解压缩,这次解出来的应该有control.tar.gz,data.tar.gz,以及debian-binary这三个文件,关键是data.tar.gz文件,其他的两个要不要无所谓,data.tar.gz解压缩,会出来usr,etc这些文件夹。

使用scp -r,将这些文件夹传输到~目录中。

然后,使用ssh登录路由器,在shell中输入以下命令:

       export PATH=/tmp/root/usr/bin:$PATH
       export LD_LIBRARY_PATH=/tmp/root/usr/lib:$LD_LIBRARY_PATH
       

修改path可以先使用我们传输的openssh,LD_LIBRARY_PATH则是使openssh可以找到libopenssl和zlib,但zlib的链接有点问题。因此,做如下修改:

       cd ~/usr/lib
       rm -f libz.so.1
       ln -s libz.so.1.* libz.so.1
       

然后,ssh软件就算准备就绪了。

使用下面的方法测试下,(最好使用认证文件的方式,不用输入密码,不然的话,后续很被动):

       ssh -q -f -N -D 路由器的IP:代理端口 用户名@翻墙ssh服务器
       

然后在局域网中的机器上检查代理是否正常,推荐使用firefox+autoproxy,设置autoproxy使用ssh-d代理方式,设置ssh-d代理服务器为上述的路由器的IP,端口为代理端口。如果不争长的话,调用ps | grep ssh,检查ssh是否在工作。如果提示说-D不能用或者出现什么dropbear的话,可能是PATH部分没有设置正确。

一切正常的话,我们就需要将这个作为一个服务了。当然,最简单的就是使用autossh,我最初也是这么想的,但autossh实在太大了,没有内存可以使用了,因此,必须使用另外的方法。也因此,我写了下面的脚本:

       #!/bin/sh
       PATH=/tmp/root/usr/bin:$PATH
       LD_LIBRARY_PATH=/tmp/root/usr/lib:$LD_LIBRARY_PATH
while true
do
if [ -z "`ps | grep $1 | grep -v grep | grep -v $0 | awk '{print $1}'`" ]
then
ssh -q -f -N -D 路由器的IP:代理端口 用户名@翻墙ssh服务器
fi
sleep 10
done
       

修改为可执行文件(先别运行)。在调试的时候,如果发现什么地方出错了,最好kill掉fuck_gfw,然后再kill掉ssh,不然的话,一旦发现ssh退出了,就会重新启动ssh的

上述文件运行的时候,需要添加一个参数,这个参数必须是ps出来的所有进程中唯一的,我推荐使用”路由器IP:代理端口”来作为参数,比如我就是这么运行的:

       nohug fuck_gfw "172.10.1.1:7070" &
       

使用nohug,可以让程序在ssh退出之后接着运行,&让程序在后台运行。

然后呢,梯子已经准备好了,还等什么?

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你

  • rix

    该方案罗嗦,没有实用性。我尝试了dd-wrt的源代码编译等方法,很难找到适合openssh,openssl,polipo等三个软件需要的容量空间。