socks5协议

介绍#

socks5 协议是一个代理协议

实现#

dante 是一个 socks5 服务端软件,可以在 ubuntu 等 linux 系统安装。

报文解析#

https://github.com/shikanon/socks5proxy/blob/master/docs/socks5.md
这篇文章讲的很不错,我摘抄部分内容。

请求#

VER NMETHODS METHODS
1 1 1-255
  • VER 是 SOCKS 版本,这里应该是 0x05
  • NMETHODS 是 METHODS 部分的长度
  • METHODS 是客户端支持的认证方式列表,每个方法占 1 字节。当前的定义是:
    • 0x00 不需要认证
    • 0x02 用户名,密码认证
    • 0xFF 无可接受的方法

响应#

VER METHOD
1 1
  • VER 是 SOCKS 版本,这里应该是 0x05;
  • METHOD 是服务端选中的方法。如果返回 0xFF 表示没有一个认证方法被选中,客户端需要关闭连接。
    下面我说一下用户名密码验证的方法

请求#

鉴定协议版本 用户名长度 用户名 密码长度 密码
1 1 动态 1 动态

版本号为 0x05

响应#

鉴定协议版本 鉴定状态
1 1

其中鉴定状态 0x00 表示成功,0x01 表示失败。

请求#

VER CMD RSV ATYP DST.ADDR DST.PORT
1 1 0x00 1 动态 2
  • VER 是 SOCKS 版本,这里应该是 0x05
  • CMD 是 SOCK 的命令码
    • 0x01 表示CONNECT请求
    • 0x02 表示BIND请求
    • 0x03 表示UDP转发
  • RSV 0x00 ,保留
  • ATYP DST.ADDR类型
  • DST.ADDR 目的地址
    • 0x01 IPv4 地址,DST.ADDR 部分 4 字节长度
    • 0x03 域名,DST.ADDR 部分第一个字节为域名长度,DST.ADDR剩余的内容为域名,没有\0结尾。
    • 0x04 IPv6 地址,16 个字节长度。
  • DST.PORT 网络字节序表示的目的端口

目前先介绍 CONNECT 请求后,服务器的响应

响应#

VER REP RSV ATYP DST.ADDR DST.PORT
1 1 0x00 1 动态 2

一般 REP 为 0x00,ATYP为0x01,DST.ADDR 和 DST.PORT 全为 0x00
之后客户端和目的地址就以服务器为中介互相传递数据