Total Pageviews

Monday, 24 December 2012

如何使用shadowsocks-nodejs搭配obfsproxy更可靠的翻墙

obfsproxy的主要目的是将各种网络通信封装为一种混杂通信--数据包经过加密,并且参杂了无用信息,使得不可抗力难以侦测到有效流量,从而降低被屏蔽的可能性。

obfsproxy需要较多的组件,首先准备开发环境:

CentOS: yum install autoconf autotools-dev gcc git pkg-config libtool libevent-dev libssl-dev

Ubuntu: apt-get install autoconf autotools-dev gcc git pkg-config libtool  libevent-dev libssl-dev

注意,CentOS会缺少许多包,或者版本不对,对于这种包只能一个个的编译。比如版本不对的 libevent ,通过Google这个名字可以发现官方网站是 http://libevent.org/ ,而官方网站也提供了下载链接: https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz ,因此需要下载回来,然后进行编译,下面的部分教程是将如何编译 libevent ,如果已经具备该包,或者您是对Linux比较了解的用户,请跳过。
 
------如何编译libevent------
首先,从 http://libevent.org/ 获得最新版本的下载地址,截至到本文发布时,版本是 2.0.21-stable ,我们使用wget命令下载:
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
然后解压:
tar zxvf libevent-2.0.21-stable.tar.gz
解压结束后,进入 libevent-2.0.21-stable 目录
cd libevent-2.0.21-stable
注意,这个地方有点不一样,如果您的操作系统是CentOS,并且已经安装了1.x版本的libevent,那么可能在obfsproxy的编译过程中找不到,所以需要编译到其他目录,比如
/usr/local/libevent目录。
./configure --prefix=/usr/local/libevent
make
make install
编译结束后,libevent 会安装到/usr/local/libevent目录,然后设置变量:
export LD_LIBRARY_PATH=/usr/local/libevent/lib/
 export libevent_CFLAGS=-I/usr/local/libevent/include/
 export libevent_LIBS="-L/usr/local/libevent/lib/ -levent"

(参考:https://trac.torproject.org/projects/tor/ticket/5009#comment:17)
现在,就可以开始编译obfsproxy了。
-------如何编译libevent结束------

从官方源获取obfsproxy的源码:

cd /tmp/
git clone https://git.torproject.org/obfsproxy.git

然后运行ls命令看看是否有一个obfsproxy的目录,如果有,则继续:

cd obfsproxy
./autogen.sh
./configure
make
make install


提示,如果缺少软件包,那么必须使用yum install或apt-get install 命令安装,或者Google缺少的软件包的名字,重新编译安装后,再尝试编译。

在编译完成后, obfsproxy的执行文件 会存放在 /usr/local/bin/ 目录中。

重新打开 rc.local 文件:

vi /etc/rc.local

然后按下Insert按钮,进入编辑模式,新起一行,然后添加:
/usr/local/bin/obfsproxy obfs2 --dest=127.0.0.1:8389 server 0.0.0.0:54321 > /dev/null &

注意, 8389是在服务器端的shadowsocks-nodejs的config.json文件中配置的shadowsocks-nodejs服务器的端口,而 54321 是 obfsproxy负责接收和发送混杂数据的端口,推荐按照实际情况,为obfsproxy设置一个新端口。

确认无误后,存盘退出。

现在,只需重启VPS即可让其生效。

提示:对于CentOS 6.2,可能还需要修改 /etc/sysconfig/iptables 文件允许obfsproxy的端口通过。

而对于没有端口防火墙的用户,推荐使用iptalbes屏蔽shadowsocks-nodejs的端口(本例中为TCP 12345),以防止被外界扫描到。

------以上就是服务器端的配置------

下面,开始客户端的配置(Windows下)。
首先,从Tor官方网站 https://www.torproject.org/projects/obfsproxy.html.en 下载包含Obfsproxy的Tor包,当然,我们只需要用里面的Obfsproxy.exe

截至本文发布时,Windows的包的下载地址是 https://www.torproject.org/dist/torbrowser/tor-obfsproxy-browser-2.4.6-alpha-2_en-US.exe ,请按照实际情况下载。

下载回来是一个7-Zip自解压压缩包,解压后会生成四个目录和一个可执行文件,我们将App目录里的Obfsproxy.exe复制到一个合适的位置(比如 D:\FQ\ )。

访问 http://nodejs.org/download/ ,下载Windows的程序包,截至到本文发布时,x86的下载包是 http://nodejs.org/dist/v0.8.16/node.exe ,AMD64的下载包是: http://nodejs.org/dist/v0.8.16/x64/node.exe ,直接将下载回来的文件放入之前所指定的目录即可( D:\FQ\ )。

访问 https://github.com/clowwindy/shadowsocks-nodejs ,点击界面上的ZIP按钮,将压缩包下载回来解压,将shadowsocks-nodejs-master文件夹中的内容也移动到之前设定的目录( D:\FQ\ )。

用记事本打开config.json文件,将password行修改为之前在服务器上所指定的密码,server_port和server_ip无需修改。

注意:如果1083端口跟你的本地端口冲突,请更换一个端口,并在稍后修改浏览器的SOCKS代理服务器的地方设置为您所指定的端口。

提示:如果您有整理癖,请按照您的习惯放置,不过在稍后的批处理中,需要按照指定路径进进行访问。

进入该目录,右击空白区域,新建文本文件,并设定一个名字,然后双击打开,输入:

START node.exe local.js
START obfsproxy.exe obfs2 --dest=your-vps-ip:54321 client 127.0.0.1:8389
EXIT

注意:上面的54321是您的服务器上的obfsproxy的端口,如果您修改了,请按照实际情况填写!

然后保存并退出,并将新建的文本文件的扩展名修改为.BAT。

提示:如果看不到扩展名,请打开我的电脑(或计算机),点击工具菜单(如果看不见,先按一下Alt按钮),点击文件夹选项,转到查看选项卡,并取消“隐藏已知文件类型的扩展名”,然后确定,就能看到刚才的文本文件末尾多出来了 .txt ,将其修改为 .bat 即可。

双击所建的FQ.BAT,会自动打开两个新窗口,这说明启动成功。

最后,打开您的浏览器,配置代理为SOCKS5,IP 127.0.0.1 ,端口1083即可(或者您指定的本地端口)。

以上就是本教程的全部部分。(不错,我测试成功)

补充1:如果不在乎速度,而在乎安全,可以加上 --shared-secret=PASSWORD 参数,其中PASSWORD是设定的obfsproxy协商密码,比如:
服务器:
/usr/local/bin/obfsproxy obfs2 --dest=127.0.0.1:8389 --shared-secret=PASSWORD server 0.0.0.0:54321 > /dev/null &

客户端:
obfsproxy.exe obfs2 --dest=your-vps-ip:54321 --shared-secret=PASSWORD client 127.0.0.1:8389

我加上了加密参数后,变得很慢(比SSH还慢),在不同的环境下可能不一样,请酌情测试。

参考文章:  https://www.torproject.org/projects/obfsproxy-instructions.html.en
https://www.torproject.org/projects/obfsproxy.html.en#download
(https://www.torproject.org/dist/torbrowser/tor-obfsproxy-browser-2.4.6-alpha-2_en-US.exe)
http://www.wangafu.net/~nickm/libevent-2.0/doxygen/html/
http://www.cnblogs.com/bluesky23/archive/2012/11/30/2796251.html

排障:
 obfsproxy启动失败的解决办法

 如果启动obfsproxy,结果是:
error while loading shared libraries: libevent-2.0.so.5
看来原因就是这个了,到网上一找,很多同胞也遇到类似问题,有不少的解决方案,用了下面的方法,问题解决:
1>首先 find / -name libevent-2.0.so.5 找到缺少的链接文件到底在那儿。
2> LD_DEBUG=libs /usr/local/bin/obfsproxy -v
3> 从Debug信息中就知道程序去哪里找链接库了。我这边程序去 trying file=/usr/lib/libevent-2.0.so.5 而我的链接库的实际存储位置是 /usr/local/lib/libevent-2.0.so.5
4>做一个软连接 ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.
5>搞定.


(搭建自己的obfsproxy bridge

上面obfsproxy编译完成以后,在tor的配置文件torrc中添加下面的部分:
      BridgeRelay 1       (作为bridge)
      PublishServerDescriptor 0     (作为私人bridge,不公开发布)
      ServerTransportPlugin obfs2 exec /root/test/obfsproxy/obfsproxy --managed    (使用obfsproxy)
  4. 运行tor,并找到log文件夹下的debug.log,在其中找到类似下面的一句:

      Registered Server transport 'obfs2' at '0.0.0.0:XXXX'
   其中xxxx即为obfsproxy bridge的端口。
  5. 接下来在tor的客户端上配置bridge为:Bridge obfs2 vps_ip:xxxx 即可。)

-------------------------------------
相关帖子: http://briteming.blogspot.co.uk/2012/07/shadowsocks-nodejs.html