socks协议介绍
啥是socks协议呢? 这里贴一段维基百科对它的定义
SOCKS is an Internet protocol that exchanges network packets between a client and server through a proxy server
大概的意思是: socks是一种互联网协议,它通过一个代理服务器在客户端和服务端之间交换网络数据。简单来说,它就是一种代理协议,扮演一个中间人的角色,在客户端和目标主机之间转发数据。
socks协议位于OSI模型中的第五层,即会话层(Session Layer)。
socks相当于在防火墙撕了一道口子,让合法的用户可以通过这个口子连接到内部,从而访问内部的一些资源和进行管理。
socks5顾名思义就是socks协议的第五个版本,作为socks4的一个延伸,在socks4的基础上新增UDP转发和认证功能。唯一遗憾的是socks5并不兼容socks4协议。socks5由IETF在1996年正式发布,经过这么多年的发展,互联网上基本上都以socks5为主,socks4已经退出了历史的舞台。
工作过程
1.握手阶段
1.1 协商阶段
第一步,客户端向代理服务器发送代理请求,其中包含了代理的版本和认证方式
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
#上方的数字表示字节数,下面的表格同理,不再赘述
VER: 协议版本,socks5为0x05
NMETHODS: 支持认证的方法数量
METHODS: 对应NMETHODS,NMETHODS的值为多少,METHODS就有多少个字节。
第二个字段NMETHODS表示支持的认证方式,第三个字段是一个数组,包含了支持的认证方式列表:
RFC预定义了一些值的含义,内容如下:
0x00: 不需要认证
0x01: GSSAPI认证
0x02: 用户名和密码方式认证
0x03: IANA认证
0x80-0xfe: 保留的认证方式
0xff: 不支持任何认证方式
socks5服务器需要选中一个METHOD返回给客户端,格式如下:
VER | METHOD |
---|---|
1 | 1 |
当客户端收到0x00时,会跳过认证阶段直接进入请求阶段; 当收到0xFF时,直接断开连接。其他的值进入到对应的认证阶段。
1.2 认证阶段(也叫子协商)
认证阶段作为协商的一个子流程,它不是必须的。socks5服务器可以决定是否需要认证,如果不需要认证,那么认证阶段会被直接略过。
如果需要认证,客户端向socks5服务器发起一个认证请求,这里以0x02的认证方式举例:
VER | ULEN | UNAME | PLEN | PASSWD |
---|---|---|---|---|
1 | 1 | 1 to 255 | 1 | 1 to 255 |
VER: 版本,通常为0x01
ULEN: 用户名长度
UNAME: 对应用户名的字节数据
PLEN: 密码长度
PASSWD: 密码对应的数据
socks5服务器收到客户端的认证请求后,解析内容,验证信息是否合法,然后给客户端响应结果。响应格式如下:
VER | STATUS |
---|---|
1 | 1 |
1.3 请求阶段
顺利通过协商阶段后,客户端向socks5服务器发起请求细节,格式如下:
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1 | 1 | X’00’ | 1 | Variable | 2 |
VER 版本号,socks5的值为0x05
CMD
0x01表示CONNECT请求
0x02表示BIND请求
0x03表示UDP转发
RSV 保留字段,值为0x00
ATYP 目标地址类型,DST.ADDR的数据对应这个字段的类型。
0x01表示IPv4地址,DST.ADDR为4个字节
0x03表示域名,DST.ADDR是一个可变长度的域名
0x04表示IPv6地址,DST.ADDR为16个字节长度
DST.ADDR 一个可变长度的值
DST.PORT 目标端口,固定2个字节
上面的值中,DST.ADDR是一个变长的数据,它的数据长度根据ATYP的类型决定。我们可以通过掐头去尾解析出这部分数据。分为下面3种情况:
X’01’
一个4字节的ipv4地址
X’03’
一个可变长度的域名,这种情况下DST.ADDR的第一个字节表示域名长度,剩下部分是域名内容。
X’04’
一个16字节的ipv6地址
socks5服务器收到客户端的请求后,需要返回一个响应,结构如下
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1 | 1 | X’00’ | 1 | Variable | 2 |
VER socks版本,这里为0x05
REP Relay field,内容取值如下
X’00’ succeeded
X’01’ general SOCKS server failure
X’02’ connection not allowed by ruleset
X’03’ Network unreachable
X’04’ Host unreachable
X’05’ Connection refused
X’06’ TTL expired
X’07’ Command not supported
X’08’ Address type not supported
X’09’ to X’FF’ unassigned
RSV 保留字段
ATYPE 同请求的ATYPE
BND.ADDR 服务绑定的地址
BND.PORT 服务绑定的端口DST.PORT
1.4 Relay阶段
socks5服务器收到请求后,解析内容。如果是UDP请求,服务器直接转发; 如果是TCP请求,服务器向目标服务器建立TCP连接,后续负责把客户端的所有数据转发到目标服务。