-
Notifications
You must be signed in to change notification settings - Fork 52
/
README.txt
173 lines (121 loc) · 5.95 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
支持SOCKS 5协议的高速加密通信的代理服务器脚本
代码地址:
https://github.com/jiangmiao/proxy
解决现有代理的问题:
1、vpn - vpn接管所有的数据,而在很多时更希望只通过代理访问部份网站。
2、http/socks - 仅使用http或socks代理,没有经过加密的关键词还是有被拦截的可能。
3、ssh+socks - ssh tunnel的socks性能与稳定性不佳。
4、网页proxy - 兼容性较差。
/------------------------------------------------------------------------------\
| Erlang版 |
\------------------------------------------------------------------------------/
系统需求:
Erlang R15B02 测试通过。
使用说明:
服务端:erlc proxy.erl && erl -noshell -s proxy back_start 0.0.0.0 8781
back_start 带1个参数 监听端口 [监听地址: 0.0.0.0]
带2个参数 监听地址 监听端口
客户端:erlc proxy.erl && erl -noshell -s proxy front_start 服务端IP或域名 8781 127.0.0.1 8780
front_start 带1个参数 服务端IP或域名 [8781 127.0.0.1 8780]
带2个参数 服务端IP或域名 服务器端口 [127.0.0.1 8780]
带4个参数 服务端IP或域名 服务器端口 监听地址 监听端口
通过 proxy.sh:
其中 erlc proxy.erl && erl -noshell -s proxy 可以通过 proxy.sh 代替
如
proxy.sh back_start 8781 开启监听 0.0.0.0:8781 的Back端
proxy.sh front_start 1.2.3.4 监听 127.0.0.1:8780 并连接 1.2.3.4:8781 的Back端
本地测试:
# 获取代码
$ git clone https://github.com/jiangmiao/proxy
正克隆到 'proxy'...
remote: Counting objects: 15, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 15 (delta 2), reused 15 (delta 2)
Unpacking objects: 100% (15/15), done.
$ cd proxy
$ erlc proxy.erl && erl -noshell -s proxy start
或
$ ./proxy.sh start
back listen at 0.0.0.0:8781.
front listen at 127.0.0.1:8780.
back address is 127.0.0.1:8781.
$ curl -I --socks5 127.0.0.1:8780 www.baidu.com
HTTP/1.1 200 OK
Date: Wed, 05 Dec 2012 16:43:08 GMT
Server: BWS/1.0
Content-Length: 9777
...
工作原理:
Client - 客户端:如浏览器
Front - 代理前端:从 客户端 接收符合Socks5协议的数据,简单加密后转发给 后端,
从 后端 接收数据解密后转发给 客户端。
Back - 代理后端:从 前端 接收数据,并作为Socks5代理服务器处理数据,转发给 远程服务器。
从 远程服务器 接收数据,并密转发给 前端 。
Remote - 远程服务器:需要请求的目标服务器
Client 与 Front 为本地通信
Back 与 Remote 为异地原文转发
Front 与 Back 为异地加密通信
加密算法:
Front 与 Back 之间的通信加密算法为 每个字节 异或 0x66 (01100110)
Front 与 Back 的认证协议:
Front 发送 "abcd1234"
Back 没有断开表示认证通过。
认证密码 abcd1234 可以在 proxy.erl 中修改
性能与稳定性:
由于使用了Erlang,性能和稳定性没得说。
对于SOCKS的协议略微有更改,握手部份由Front完成,且始终返回成功。每一个独立请求由3回数据交换(Socks 2次认证 + 1次原请求)变成了1次,经测试对于250ms ping值的服务器每个独立请求比传统SOCKS请求可以节约0.5~0.7秒的时间。
采用连接池,免去客户端与代理服务器的连接时间,对于250ms的服务器缩短请求时间0.3秒左右时间。
实测结果:
对比ssh socks tunnel 每个请求可以快大约一个ping的时间,
对于请求google.com,ping为215ms的服务器,
ssh socks 为 0.93 秒,本脚本为 0.735 秒。
功能局限:
对socks5的协议支持并不完善,比如不支持BIND,IPV6。但在大多数情况下,比如浏览器,tsocks是没有问题的。
GUI Monitor:
依赖 gem btk, gtk2
功能:监测当前的浏览器通过代理的长连接,并可以进行中断连接操作。
运行:ruby monitor.rb [代理前端端口=8780]
LICENCE:
MIT
/------------------------------------------------------------------------------\
| Go语言版 |
\------------------------------------------------------------------------------/
2015-02-11 加入Go语言版,占内存更小, 性能更好,但不支持监控 moniter.rb。
系统需求:
Go 1.4 测试通过。
安装:
go get github.com/jiangmiao/proxy
用法: proxy [选项...] 方法
选项:
-password=abcd1234 密码
-poolsize=10 连接池大小
-verbose
方法:
front 后端地址 [前端监听地址] // 启动前端
back 后端监听地址 // 启动后端
test // 本地测试
备注:
前后端地址格式同Go tcp包中Dial参数
本地测试:
$ proxy -verbose test
2015/02/11 00:28:20 Backend: 127.0.0.1:8781
2015/02/11 00:28:20 Frontend: 127.0.0.1:8780
2015/02/11 00:28:20 UseBackend: 127.0.0.1:8781
2015/02/11 00:28:20 连接池大小: 10
2015/02/11 00:28:20 预连接数 1
2015/02/11 00:28:20 预连接数 2
2015/02/11 00:28:20 预连接数 3
2015/02/11 00:28:20 预连接数 4
...
$ curl -v --socks5-hostname 127.0.0.1:8780 http://baidu.com
远程实例:
# 在代理服务器(IP 1.2.3.4)中运行
$ proxy back :8781
# 在本机运行,默认监听 127.0.0.1:8780
$ proxy front 1.2.3.4:8781
# 测试
$ curl -v --socks5-hostname 127.0.0.1:8780 http://baidu.com
# 或指定本机地址
$ proxy front 1.2.3.4:8781 127.0.0.1:8782
# 带参数的命令
$ proxy -verbose -poolsize=5 -password=Password test