A secured socks5 proxy over the Great Fucking Wall.
因为不满ssh tunnel的使用效果,所以2012年12月某天(大概是17号)心血来潮写了这个小东西,由于 socks5协议 本身很简单、加上gevent/greenlet使得异步开发跟同步似的,所以200行就搞定了。但是性能上问题很大——主要是加密有问题。尽管加密就是最简单的xor,但是因为python不适合处理大量的小对象,所以当时写了一个python扩展,性能上就没问题了,但是又多了一项麻烦的依赖。后来发现已经有更成熟的shadowsocks,于是就弃坑了,也一直没有发布。
今天[2013.08.16]心血来潮,用ctypes来实现同样的功能,似乎也挺合适的;不过跟shadowsocks比起来有两个地方做得不好,一是没有更“高级”的加密方式(他家用了M2Crypto,代码看起来很复杂),另一个是shadowsocks在本地先回应socks5请求,只把必要的host:port信息发送给server,减少了一个来回,而我原先的实现则是在server端实现完整的socks5(现在把step1搬到client了,因为改动很小)。
总之好歹也是个凑合能用的东西了,发布出来晾着吧,也许哪天有人就用上了呢。
- Python 2.6/2.7
- greenlet: http://pypi.python.org/pypi/greenlet
- gevent: https://pypi.python.org/pypi/gevent
前面提到的c库,mixo自带了4个版本的so文件:
- xor_ELF_32bit.so: linux/32bit
- xor_ELF_64bit.so: linux/64bit
- xor_WindowsPE_32bit.so: windows/32bit
- xor_WindowsPE_64bit.so: windows/64bit #未测试:(
如果觉得不放心,可以自己编译:
$ make
-
修改配置:config.py
其中seed是密钥,改成任意整数;其他ip、端口什么的根据实际需要填吧。
-
启动Server:
$ python server.py
-
启动Client:
$ python client.py