今天终于实现了tcp,udp的socket5代理的客户端,网上的资料简单粗劣,没有说的很详细,如果单独的来实现是很简单,按照协议一步一步来,说起来很容易,但做起来就有难度,纵观现在的软件,包含的socket5的很少,一般用不到,SocksCap很实用的,可惜没有公开代码,那只有自己写了,基本工作已经准备好了,那就先说UDP吧
UDP
本地端口 18001
目标端口
目标ip
代理端口
代理ip
客户端---->
版本号(1字节) | 可供选择的认证方法(1字节) | 方法序列(1-255个字节长度)
05 02 0002
代理服务端----->客户端
版本号 | 服务器选定的方法
0502
客户端---->
0x01 | 用户名长度(1字节)| 用户名(长度根据用户名长度域指定) | 口令长度(1字节) |口令(长度由口令长度域指定)
01 04 74 65 73 74 04 31 31 3131
代理服务端----->客户端
0x01 |验证结果标志
01 00
客户端---->
协议版本 | Socks命令 | 保留字节 | 地址类型 | 特定地址 | 特定端口
05 03 00 01 00 00 00 00 46 51
协议版本
Socks命令
CONNECT (编号0x01)
BIND (0x02)
UDP(编号0x03)
保留字节
地址类型
0X01 该地址是IPv4地址
0X04 该地址是IPv6地址
特定地址==0
00 00
特定端口==18001
46 51
代理服务端----->客户端
版本 | 代理的应答 | 保留1字节 | 地址类型 | 代理服务器地址 | 绑定的代理端口
05
版本 05
代理的应答
0X00
其他的是错误
保留1字节
地址类型
代理服务器地址
绑定的代理端口
客户端---->
组装报头+ udp数据
保留2字节的0 | 是否数据报分段重组标志 | 地址类型 | 将要发到代理外的目标地址 | 远端目标主机的端口| 需要通过代理传送出去的数据
00
保留2字节的0
是否数据报分段重组标志
地址类型
将要发到代理外的目标地址
远端目标主机的端口
需要通过代理传送出去的数据
代理服务端----->客户端
拆分报头+ udp数据
保留2字节的0 | 是否数据报分段重组标志 | 地址类型 | 将要发到代理外的目标地址 | 远端目标主机的端口| 需要通过代理传送回来的数据
00
保留2字节的0
是否数据报分段重组标志
地址类型
将要发到代理外的目标地址
远端目标主机的端口
需要通过代理传送回来的数据