V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
由 @clowwindy 发明的轻量级服务器中转包传输工具。
shadowsocks 使用指南
shadowsocks.org
shadowsocks-android
shadowsocks-ios
shadowsocks-python
shadowsocks-nodejs
shadowsocks-libev
shadowsocks-gui
shadowsocks-csharp
哪上班
V2EX  ›  shadowsocks

发一个自用了一年多的翻墙工具 shadowsocks

  •  
  •   clowwindy · 2012-04-20 23:24:59 · 41029 次点击
    这是一个创建于 819 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个用 Python 写的 socks 加密代理。加密方法很简单,不过欺骗 GFW 足够了。

    https://github.com/clowwindy/shadowsocks

    当初激发我写这个东西的原因是 ssh tunnel 容易断,每次重连会卡一段时间,并且并发能力有限。于是用普通的 socket server,来一个连接建一个连接。到现在用了一年多,感觉挺稳定,不如发布出来吧。

    如果有其他同学有兴趣加入的话,也许可以进一步做成公钥加密的。
    177 回复  |  直到 2013-04-17 05:51:50
        101
    batilo   2012-11-08 15:34:55   ♥ 1
    速度非常赞。
        102
    valianliu   2012-11-08 21:58:00
    @hyq 能介绍下用法吗?小白表示感谢了,双击一闪而过表示很困惑
        103
    hyq   2012-11-09 07:11:00
    @valianliu 这里是文档: https://github.com/hyqhyq3/newsocks ,你应该是没有创建config.ini

    不过楼主的的工具和我的工具都需要一个墙外的vps, 并将服务器端程序运行起来,然后才能正常使用用,如果没有墙外的vps,那么就只能使用goagent,vpn,ssh了
        104
    raecoo   2012-11-16 11:28:49
    如果能有一个android的版本那就更完美了
        105
    gateswong   2012-11-16 13:26:27
    LZ有没有这样的可能。就是将一个socks拆成若干个连接线程共同传输,多线程应该可以提高一些例如YouTube这样的速度吧?
        106
    clowwindy   2012-11-16 13:48:04
        107
    reus   2012-11-16 14:03:08
    @gateswong gotunnel是这种传输方式,可以试下
        108
    gateswong   2012-11-17 01:06:00
    @clowwindy @reus 谢谢
        109
    yaotian   2012-11-18 16:47:18
    在mac下报错 mode != 1
        110
    clowwindy   2012-11-18 21:03:56
    @yaotian 浏览器要设成 SOCKS 5 代理
        111
    yaotian   2012-11-18 21:41:19
    @clowwindy 我确实设置了SOCKS5, 浏览器打开页面 ,提示我保存
        112
    clowwindy   2012-11-19 13:08:17
    @yaotian 什么浏览器?
        113
    yaotian   2012-11-19 17:57:59
    @clowwindy chrome
        114
    clowwindy   2012-11-19 18:16:48
    @yaotian 要设成 socks “5”,而不是 socks “4”,默认好像是 4
        115
    yaotian   2012-11-20 20:24:00
    @clowwindy 是socks 5
        116
    eric_q   2012-11-20 21:57:29
    @clowwindy 试用了 gotunnel,确实实现了我之前的带宽叠加的需求,shadowsocks 是否可以考虑参考作一个实现?如果不愿意并入到 master,单独一个 branch 也可以。
        117
    clowwindy   2012-11-21 00:32:51   ♥ 1
    @yaotian
    在 OSX 10.7, Chrome 23 无法重现。在系统的网络->高级里设的 SOCKS 代理。
    也有可能是你用的 local 和 server 版本不一致,密码不一致,或者用的 PAC 或者代理切换插件里面没有选对代理协议,或者填了代理不需要的用户名和密码。

    @eric_q 我尝试一下吧,最好是能兼顾带宽和稳定性。不过我更想用 nodejs 写,会方便一些。
        118
    eric_q   2012-11-21 00:43:15
    @clowwindy 感谢!
        119
    chendahui007   2012-11-23 22:56:51
    @clowwindy
    nohup python server.py >log &
    [1] 30281
    nohup: ignoring input and redirecting stderr to stdout

    [1] + 30281 exit 1 nohup python server.py > log

    求解
        120
    clowwindy   2012-11-29 18:36:30
    @chendahui007 log 的内容是什么?
        121
    breestealth   2012-12-10 12:50:51
    这个不知道有没有愿意实现一个Android版本的本地端啊,这玩意肯定比当前的GoAgent稳定的多啊。
        122
    Aether   2012-12-10 18:28:03
    命令行运行正常,转入背景运行的时候出错:

    [root@ shadowsocks]# jobs
    [1]+ Stopped /usr/lib/python2.6/bin/python server.py
    [2]- Exit 1 nohup python server.py > log
    [root@ shadowsocks]# cat log
    File "server.py", line 102
    with open('config.json', 'rb') as f:
    ^
    SyntaxError: invalid syntax
        123
    clowwindy   2012-12-10 18:56:14
    @Aether 改成 nohup /usr/lib/python2.6/bin/python server.py > log 试试?
        124
    Aether   2012-12-10 19:36:34
    @clowwindy 我试试看。另外请问一下目前是不是只支持单一服务端对客户端;如果我有很多客户端,需要对每一个客户端开一个单独的服务端端口么?
        125
    Aether   2012-12-10 20:09:44
    @clowwindy
    谢谢,貌似这个成功了!
        126
    clowwindy   2012-12-10 20:11:39
    @Aether 可以多个客户端
        127
    Aether   2012-12-10 21:35:42
    我在家里的电脑尝试有一个很奇怪的现象。
    比如google facebook youtube,在常规http连接下无法工作(显示连不上代理),切换到全https以后就好了。
    但是对一般的网站,常规http是正常的(比如我强制把所有流量都切过去)。
    真心奇怪。。。

    PS:多客户端可用,谢谢:D
        128
    keys   2012-12-16 10:23:14
    @clowwindy 我能打开facebook但是打不开twitter,而且连baidu的时候,有时会出现ssl错误,怎么解决
        129
    keys   2012-12-16 10:25:05
    @clowwindy 我看了下vps上的log文件,有如下错误提示
    Traceback (most recent call last):
    File "/usr/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
    File "/usr/lib/python2.7/SocketServer.py", line 594, in process_request
    t.start()
    File "/usr/lib/python2.7/threading.py", line 495, in start
    _start_new_thread(self.__bootstrap, ())
    error: can't start new thread
    Traceback (most recent call last):
    File "/usr/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
    File "/usr/lib/python2.7/SocketServer.py", line 594, in process_request
    t.start()
    File "/usr/lib/python2.7/threading.py", line 495, in start
    _start_new_thread(self.__bootstrap, ())
    error: can't start new thread
        130
    clowwindy   2012-12-16 10:50:45
    @keys 你的 VPS 可能是 OpenVZ,或者最大线程数设的太低了,也可能是内存不足。可以调高最大线程数试试,不行就用 node.js 版吧。
        131
    21grams   2012-12-28 21:10:22
    android手机能用吗
        132
    keys   2013-01-01 11:06:16
    @clowwindy谢谢已经解决
        133
    keys   2013-01-01 11:06:48
    @keyssdhfklaaaa 你存在否
        134
    joyoner   2013-01-12 19:22:30
    root@joyoner:~/shadowsocks# python test.py
    encryption test passed
    warning: gevent not found, using threading instead
    warning: gevent not found, using threading instead
    2013-01-12 15:16:58 INFO starting server at port 8388 ...
    2013-01-12 15:16:58 INFO starting server at port 10801 ...
    Traceback (most recent call last):
    File "test.py", line 108, in <module>
    bufsize=0, close_fds=True)
    File "/usr/lib/python2.6/subprocess.py", line 623, in __init__
    errread, errwrite)
    File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child
    raise child_exception
    OSError: [Errno 2] No such file or directory
        135
    clowwindy   2013-01-12 19:29:47
    @joyoner 应该是没装 curl
        136
    joyoner   2013-01-12 19:40:14
    @clowwindy 果然。这样就好了吧?
    root@joyoner:~/shadowsocks# python test.py
    encryption test passed
    warning: gevent not found, using threading instead
    warning: gevent not found, using threading instead
    2013-01-12 15:39:42 INFO starting server at port 10801 ...
    2013-01-12 15:39:42 INFO starting server at port 8388 ...
    * About to connect() to proxy 127.0.0.1 port 1080 (#0)
    * Trying 127.0.0.1... Connection refused
    * couldn't connect to host
    * Closing connection #0
    curl: (7) couldn't connect to host
        137
    clowwindy   2013-01-12 19:41:10
    @joyoner 只能用默认配置文件测试
        138
    joyoner   2013-01-12 19:43:47
    @keys 怎么解决的?

    @clowwindy [Errno 104] Connection reset by peer 这个错误是什么导致的?
        139
    clowwindy   2013-01-12 20:22:28
    @joyoner

    建议你用 Python 版照着最新的 README 重新部署一遍,特别是按照说明装一下 gevent……如果还是不行只能放弃了
        140
    joyoner   2013-01-12 21:28:15
    @clowwindy 装了还是不行,换成libuv就好了。http://v2ex.com/t/56387
        141
    clowwindy   2013-01-12 23:06:35
    @joyoner

    如果装了 gevent 就不会提示 warning: gevent not found, using threading instead 了
    可能是没有装上吧
        142
    joyoner   2013-01-13 00:07:11
    @clowwindy 执行test.py时就发现了,安装后依然会reset by peer,但过一会就好。
        143
    zyxfsky   2013-01-19 21:31:59
    Windows下启动local.py,每次都报找不到gevent,官方的安装包装了没用,easy_install安装也没用,虽然也能启动,但看着warning很不爽,求gevent安装方法
        144
    clowwindy   2013-01-19 22:09:07
    @zyxfsky 你的系统里可能有多个 python,安装 gevent 的时候指定一下绝对路径看看
        145
    JimmyZ   2013-01-20 03:20:23
    我想知道python-gevent/node.js两个版本哪个推荐使用?
        146
    clowwindy   2013-01-20 14:13:19   ♥ 1
    @JimmyZ 大部分的版本都可以使用
        147
    JimmyZ   2013-01-20 17:58:27
    @zyxfsky 你试试在python命令行下import gevent, 看有什么报错, 就我之前架goagent的经历来看, 可能是greenlet没有装, 谨供参考. 架shadowsocks我就图省事直接用node.js版了
        148
    xuesumin   2013-02-09 09:12:52
    非常好!请问有没有提供shadowsocks 翻(墙服务的供应商,要求包括shadowsocks-android的?准备买一个
        149
    agassi_yzh   2013-02-25 16:39:06
    大大,您搞一个捐赠方式吧。我们都想给你买啤酒喝
        150
    clowwindy   2013-02-25 19:54:35
    @agassi_yzh 心意我领了,谢谢 :)
        151
    JimmyZ   2013-02-27 22:34:28
    粗看了一下node.js版代码, 我的理解是在local端解析了SOCKS请求, 转成一个私有请求格式加密转发到server, 然后server端解密解析此请求. 请问为什么要做这个转换的步骤? 我觉得local端不做任何处理直接加密转发到server, server端再解密并处理SOCKS请求就可以了. 不知我的理解是否正确?

    只是好奇为什么要这么写, 没有任何冒犯的意思.
        152
    clowwindy   2013-02-27 23:02:31
    @JimmyZ socks握手浪费了两个ping值
        153
    JimmyZ   2013-03-04 15:03:24
    这也不矛盾吧? 你可以把前面的Auth部分在Local做, 到了SOCKS请求了原样转发给server, 没必要转换一次格式吧?
        154
    clowwindy   2013-03-04 19:17:56 via iPhone
    @JimmyZ 比起性能,代码写的麻烦点不是问题
        155
    wolong   2013-03-07 11:41:04
    好像挺好,回去研究下服务端要怎么用。
        156
    JimmyZ   2013-03-08 00:59:32
    @clowwindy 可能说得不清楚, 干脆花了几个小时写了下, 大部分抄你的: https://github.com/Twilight/sockstunnel/blob/master/sockstunnel.coffee, 你有空瞅瞅, 并不会造成性能损失, 写起来省事点, 不用发明个私有请求格式什么的...
        157
    clowwindy   2013-03-08 09:35:43 via iPhone
    少些几行代码,好处也没那么大,每个头前面有段相同的东西大大降低分类难度……
    @JimmyZ
        158
    JimmyZ   2013-03-08 22:53:43
    @clowwindy 明白了, 这是个理由
        159
    stefanie924   2013-03-16 10:21:43
    File "server.py", line 105, in handle
    addrtype = ord(self.decrypt(sock.recv(1)))
    TypeError: ord() expected a character, but string of length 0 found

    服务器上log这样是
    python环境 2.6.5
        160
    clowwindy   2013-03-16 11:09:05
    @stefanie924

    你是刚刚配好了之后就这样,还是用了一段时间,现在突然这样?
    另外可以正常使用么?
        161
    stefanie924   2013-03-16 22:29:23
    刚配置的

    用不了
        162
    clowwindy   2013-03-16 23:34:23
    @stefanie924 在服务器上跑一下 test.py 测试一下看看?

    另外本地的 log 有什么错误呢?
        163
    stefanie924   2013-03-17 00:54:34
    之前服务端报的那错,是我在win下用你的c# binary来连接后,服务器生成的

    现在我用mac下连接服务器

    test passed

    本地mac的启动后

    warning: gevent not found, using threading instead
    shadowsocks v0.9.4
    2013-03-16 22:19:12 INFO starting server at port 1080 ...

    服务端 2013-03-16 14:13:57 INFO starting server at port 8388 ...

    但chrome设置后上不了网了
        164
    clowwindy   2013-03-17 00:58:13
    @stefanie924 或许你没设置好浏览器的代理方式。要选择 Socks5,Chrome 的话要装 SwitchySharp,它会设置让代理解析 DNS。
        165
    humiaozuzu   2013-04-05 18:47:22
    @clowwindy 请问下,我现在部署在了多个服务端在不同vps上,客户端有一个,有没有办法让客户端支持这些服务端的负载均衡?
        166
    humiaozuzu   2013-04-05 18:56:53
    @clowwindy 发现了 shadowsocks 的 go 版本。我想问下这样可以不,我的 client 使用 go 的版本连接多个服务器,server 使用 node 版本,版本会不会有冲突?
        167
    clowwindy   2013-04-05 19:51:00
    @humiaozuzu config.json 里可以设成 "server":["IP1", "IP2"],
        168
    humiaozuzu   2013-04-05 19:58:19
    @clowwindy 已经搞定了,不过不是负载均衡,他是支持多个服务器~
        169
    Stockard   2013-05-01 01:05:35
    @clowwindy 你放在google play 上的shadowsocks 忘记清理掉默认的ip了……
        170
    samons   2013-05-03 13:46:19
    @clowwindy 有实现二级代理吗?能实现内网穿透吗?公司只有开放80端口的代理服务器,需要用户名密码,貌似没找到可以设置代理服务器的地方
        171
    zyxfsky   2013-05-04 17:01:30
    由于vps上的shadowscok是好几个人共用的,打印日志想看哪一个客户端请求了什么域名,我怎么获取client ip,对python和sock都比较小白,现在只是在handle函数里的logging.info里做了修改:
    logging.info('connecting %s -> %s:%d' % (sock, addr, port[0]))
    虽然这样可以看到,但是会答应出很多不需要的信息,我只想看到client ip,我应该怎么获取呢?
        172
    horsebh   2013-05-31 09:48:11
    技术白痴,请教一下作者。

    我用的是某网站的FQ服务,支持 shadowsocks,但是它对 mac 下的操作只有简单几句:

    ********
    mac 和linux 下载对应的客户端和配置文件到同一个目录(此目录你可以自行创建),进入terminal,cd 到 shadowsocks-local的目录
    然后chmod +x shadowsocks-local
    输入 nohup ./shadowsocks-local & 即可 (如果有问题,您可以执行 ./shadowsocks-local看看有什么错误提示)
    ********

    网站提供的客户端是一个名为 local-mac64-0.6.gz 的压缩文件,解压后也就一个无后缀的 local-mac64-0.6 文件。跟着网站操作,FQ 是成功了。但就是不理解这样做的原理,而且每次关机重开后似乎又要重新设置一遍。请问可以如何设置使其每次开机都自动运行?

    谢谢!
        173
    clowwindy   2013-05-31 11:15:22   ♥ 1
    @horsebh

    可以参考这篇文章(Google mac 自动运行脚本)

    http://segmentfault.com/q/1010000000095696
        174
    horsebh   2013-06-04 21:12:12
    @clowwindy 谢谢!
        175
    paw   254 天前
    刚读了下shadowsocks代码(python版)
    发现在加密部分的实现是一次TCP链接只随机一次VI,以后这条连接上所有来往数据包全用这个VI
    我没专门学过密码学,但是看过coursera.org上密码学的公开课,印象中VI是每次加密都要重新随机的,并且VI 要足够长保证尽量不重复,VI用光之后就需要更新密码了,如果多次加密用同一个密码+同样的VI,基本和没加密一样了,那个默认的table就更不说了,完全就是many time pad了,基本零强度

    当然只是糊弄墙的话这样也可以,但是如果有人用shadowsocks传输需要保密的数据就遭殃了。。

    然后,我感觉完全不用自己去实现加密部分,用python自带的SSL库就行了,local与server之间使用sslsocket通讯不就可以了,这个SSL库貌似性能还行
    http://blog.csdn.net/warriorpaw/article/details/14224603
    我写的一个带SSL支持的TCPServer & ThreadingTCPServer
    删掉shadowsocks的encrypt.py和对它的引用,再把两边的def encrypt(self, data): 和def decrypt(self, data): 都改成直接return data,用我写的那个ThreadingTCPServer替代SocketServer的,我本地测试是好用的,并且应该不会有加密强度的问题了
        176
    paw   254 天前
    哦,那是IV 不是VI 啊 囧
        177
    clowwindy   254 天前   ♥ 1
    @paw

    shadowsocks 使用 CFB 模式时是 CPA secure 的。每个连接用的都是随机 iv,并且这个 iv 是用 OpenSSL 的 rand_bytes() 生成的强随机数据。

    SSL 不适合翻墙
    12
    DigitalOcean
    关于   ·   FAQ   ·   我们的愿景   ·   IP 查询   ·   工作空间   ·   广告投放   ·   博客   ·   上网首页   ·   407 人在线   最高记录 815   ·  
    创意工作者们的社区
    Lovingly made by OLIVIDA
    VERSION: 3.3.2 · 41ms · UTC 05:17 · PVG 13:17 · LAX 22:17 · JFK 01:17
    ♥ Do have faith in what you're doing.