最近在学新的语言,想练练手,想用 55R 的协议练练手实现出来,但是 google 了半天,很少讲到协议相关的东西的文章,做一下伸手党。
socks5 协议因为简单,所以已经实现出来了,主要是代理 client 和 server 之间的协议因为找不到文档和文章阻塞住了
1
binbinyouliiii OP 好冷清,木得人吗
|
2
SakuraSa 2020-06-22 14:51:55 +08:00
搜索 rfc1928
|
3
binbinyouliiii OP @SakuraSa #2 Socks5 ?我已经实现出来了,但是 55/55R 还没有实现出来,找不到文档
|
4
SakuraSa 2020-06-22 14:56:49 +08:00
传输可以参考 github 上的 v2ray-core
|
5
SakuraSa 2020-06-22 15:04:15 +08:00
|
6
coolcoffee 2020-06-22 15:09:50 +08:00
我也没找到相关文档,但是参考过别人写的小玩具,然后自己也写过一个小玩具通网。
client 和 server 之间主要就是负责原始 tcp 流的转发。server 上面其实是包含了两个服务的,一个是 socks5,一个是伪装 server 。 假设 Chrome 浏览器需要访问某个网站,一开始的数据流向就是: chrome => client => server => socks5 server, 后面 socks5 server 处理完之后会把数据往回发,这时候数据流就是反向来的。 你一开始在国内搭 server,简单的实现转发协议就好。等到 server 不在国内的时候,client <=> server 两端就要开始进行混淆了,例如模仿 http 请求,AES 加密等等。 最后,我目前就简单的实现了混淆,性能肯定还比不上知名的项目的,等后面有时间我再去深入研究它们的源码。 |
7
binbinyouliiii OP @SakuraSa #5 thanks,看了一下好像没有关于如何混淆的文章
|
8
binbinyouliiii OP @coolcoffee #6 目前主要是卡在如何混淆和加密上,因为没见过样例,不知道传到 server 什么样子的
|
9
coolcoffee 2020-06-22 15:44:46 +08:00
@binbinyouliiii 简单点的话,直接通过 chacha20-ietf-poly1305 算法和密钥加密,服务端拿到之后再用同样的密钥解开,反过来也一样。只要保证加解密之后的数据是一致的就行。
你先把 tcp 不加密传递先实现出来吧。 |
10
binbinyouliiii OP @coolcoffee #9 不加密的话,这个实现没啥难点,大不了再来一个 socks5 。
|
11
SakuraSa 2020-06-22 16:09:30 +08:00
混淆的部分我也不是很清楚,按我理解的话:混淆就是把数据套入别的看起来正常的协议中,让通过简单统计的检测算法识别成正常的协议
例如,先发送一个假的 http 请求头,再 body 部分做正常的 io 。如果通过检测请求头的方式检查,就会把这次请求看作是一个 http 协议的请求。 |
12
SakuraSa 2020-06-22 16:11:59 +08:00
如果仅仅是发送加密数据的话,虽然检查方不知道你发送的具体是什么数据,但是一看就是加密流,反而特征十分明显。
|
13
coolcoffee 2020-06-22 16:19:31 +08:00
@SakuraSa 试下放到 http body 里面?把 content-type 改成影音格式。
|
14
SakuraSa 2020-06-22 16:34:15 +08:00
主要不知道检测的具体特征是什么,所以混淆不好做。
例如,如果检测的是字符频率,加密数据流和视频数据流肯定是不一样的。 https 已经是加密数据流了,如果模拟 https 的过程,正文的数据特征应该是统计不出来的。 (不过现在好像很多 https 站本身就被 X 地很厉害 |