socks5 协议详解
socks5 是一个简单的代理协议,这里是 RFC。

整个协议其实就是在建立TCP连接之后,真正的内容传输之前,加一点内容。以下是简述:
首先定义一下名词:
/-> | Firewall(防火墙) | ->\
Client -> Server(代理服务器) -> Dst(目标地址)
然后定义一下表示形式:
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
例如上述,1就是指长度是一个byte,因此 1 to 255 也就是 1~255个byte。如果是 X'05' 那么就是八进制的 05 也就是 0x05
的意思。
第一步,Client建立与Server之间的连接
建立TCP连接之后,Client发送如下数据:
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
VER是指协议版本,因为是socks5,所以值是0x05NMETHODS是指有多少个可以使用的方法,也就是客户端支持的认证方法,有以下值:0x00NO AUTHENTICATION REQUIRED 不需要认证0x01GSSAPI 参考:https://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface0x02USERNAME/PASSWORD 用户名密码认证0x03to0x7fIANA ASSIGNED 一般不用。INNA保留。0x80to0xfeRESERVED FOR PRIVATE METHODS 保留作私有用处。0xFFNO ACCEPTABLE METHODS 不接受任何方法/没有合适的方法
METHODS就是方法值,有多少个方法就有多少个byte
第二步,Server返回可以使用的方法
收到Client的请求之后,Server选择一个自己也支持的认证方案,然后返回:
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 1 |
+----+--------+
VER 和 METHOD 的取值与上一节相同
第三步,客户端告知目标地址
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER还是版本,取值是0x05CMD是指要做啥,取值如下:- CONNECT
0x01连接 - BIND
0x02端口监听(也就是在Server上监听一个端口) - UDP ASSOCIATE
0x03使用UDP
- CONNECT
RSV是保留位,值是0x00ATYP是目标地址类型,有如下取值:0x01IPv40x03域名0x04IPv6
DST.ADDR就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址DST.PORT两个字节代表端口号
第四步,服务端回复
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER还是版本,值是0x05REP是状态码,取值如下:0x00succeeded0x01general SOCKS server failure0x02connection not allowed by ruleset0x03Network unreachable0x04Host unreachable0x05Connection refused0x06TTL expired0x07Command not supported0x08Address type not supported0x09to0xffunassigned
RSV保留位,取值为0x00ATYP是目标地址类型,有如下取值:0x01IPv40x03域名0x04IPv6
DST.ADDR就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址DST.PORT两个字节代表端口号

第五步,开始传输流量
到这一步,就成功了,接下来就该咋传输流量咋传输流量了。
总结
socks5是一个非常通用的代理协议,因此,无论我们自己要实现什么加密传输,都需要在client端设置一个socks5服务器,用于将 客户端例如浏览器等的请求理解之后,转换成私有协议。这篇文章中我们初步的看了一下socks5的结构,了解了一下socks5协议的 传输流程。
参考资料:
邮件 订阅
RSS 订阅
Web开发简介系列
数据结构的实际使用
Golang 简明教程
Python 教程