socket5 中的tcp,udp实现

今天终于实现了tcp,udp的socket5代理的客户端,网上的资料简单粗劣,没有说的很详细,如果单独的来实现是很简单,按照协议一步一步来,说起来很容易,但做起来就有难度,纵观现在的软件,包含的socket5的很少,一般用不到,SocksCap很实用的,可惜没有公开代码,那只有自己写了,基本工作已经准备好了,那就先说UDP吧

UDP :

本地端口 18001    4651

目标端口  8888    22 b8

目标ip      111.222.123.123     =   yy yy yyyy   这里代表

 

代理端口  1070    04 2e

代理ip       111.222.123.120     ==  xx xx xxxx     这里代表

 

客户端---->  代理服务端

版本号(1字节) | 可供选择的认证方法(1字节) | 方法序列(1-255个字节长度)

05 02 0002                   //这是包含了,0x00无验证需求    0x02 用户名/密码(USERNAME/PASSWORD)  2种方法

 

 

代理服务端----->客户端

版本号 | 服务器选定的方法

0502                          //这是返回   0x02用户名/密码(USERNAME/PASSWORD)  1种方法

 

客户端---->  代理服务端

0x01 | 用户名长度(1字节)| 用户名(长度根据用户名长度域指定) | 口令长度(1字节) |口令(长度由口令长度域指定)

01 04 74 65 73 74 04 31 31 3131    //用户名test   密码 1111

 

代理服务端----->客户端

0x01 |验证结果标志          0x00 验证通过,其余有错误

01 00

 

客户端---->  代理服务端

协议版本 | Socks命令 | 保留字节 | 地址类型 | 特定地址 | 特定端口

05 03 00 01 00 00 00 00 46 51

 

协议版本    05

Socks命令   03

CONNECT (编号0x01)

BIND (0x02)

UDP(编号0x03)

 

保留字节    00

 

地址类型    01

0X01  该地址是IPv4地址

0X04  该地址是IPv6地址

 

特定地址==0  

00 00 00 00

 

特定端口==18001   //udp bind 的端口

46 51  

 

代理服务端----->客户端

 

版本 | 代理的应答 | 保留1字节 | 地址类型 | 代理服务器地址 | 绑定的代理端口

05  00  00  01  xx xx xxxx  04  2e

版本 05

 

代理的应答  00

0X00   成功协商 

其他的是错误

 

保留1字节   00

 

地址类型    01

 

代理服务器地址   xx xxxx  xx

绑定的代理端口   042e    //默认是 1080    我这里改写了端口=1070   

 

客户端---->  代理服务端

组装报头+ udp数据

保留2字节的0 | 是否数据报分段重组标志 | 地址类型 | 将要发到代理外的目标地址 | 远端目标主机的端口| 需要通过代理传送出去的数据

00 00 00  01  yyyy yy yy  22 b8  6d 6d 6d 6d 6d6d 6d 6d 6d 6d  

 

保留2字节的0   00  00

是否数据报分段重组标志  00

地址类型   01

 

将要发到代理外的目标地址  yy yy yy yy

远端目标主机的端口    22b8            //端口=8888

 

需要通过代理传送出去的数据    6d 6d 6d 6d 6d 6d 6d 6d 6d6d      ///  10个小写的   "mmmmmmmmmm"

 

 

代理服务端----->客户端

拆分报头+ udp数据

保留2字节的0 | 是否数据报分段重组标志 | 地址类型 | 将要发到代理外的目标地址 | 远端目标主机的端口| 需要通过代理传送回来的数据

00 00 00  01  yyyy yy yy  22 b8  65 65 65 65 6565 65 65 65 65

保留2字节的0   00  00

是否数据报分段重组标志  00

地址类型   01

 

将要发到代理外的目标地址  yy yy yy yy

远端目标主机的端口    22b8            //端口=8888

 

需要通过代理传送回来的数据     6565 65 65 65 65 65 65 6565      ///  10个小写的   "eeeeeeeeeee"

你可能感兴趣的:(网络协议)