Socks代理协议是作为【应用层】与【传输层】之间的一个中间层。
一、首先客户端向服务器端发起socks代理请求
+—-+———-+———-+
|VER | NMETHODS | METHODS |
+—-+———-+———-+
| 1 | 1 | 1 to 255 |
+—-+———-+———-+
上面的数字表示字节数。VER段为协议版本就是0×05,NMETHODS为后面METHODS的字节数量,每一个字节表示一种方法。
二、服务器回应给客户端
+—-+——–+
|VER | METHOD |
+—-+——–+
| 1 | 1 |
+—-+——–+
VER同样是版本号 0×05,METHOD为服务器端选择的方法,如果传递一个 0xFF,表示没有可以让服务器接受的方法,客户端此时就必须终止连接。
目前的传输方法有:
o X’00′ 无身份验证
o X’01′ GSSAPI
o X’02′ 用户名/密码
o X’03′ to X’7F’ IANA指派
o X’80′ to X’FE’ 保留私用的方法
o X’FF’ 无可接受的方法
三、客户端收到服务器的响应后,如果不是 0xFF,那就表示服务器可以接受客户端的代理请求。然后向服务器端发送
+—-+—–+——-+——+———-+———-+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+—-+—–+——-+——+———-+———-+
| 1 | 1 | X’00′ | 1 | Variable | 2 |
+—-+—–+——-+——+———-+———-+
o VER 版本号: X’05′
o CMD 指令
o 连接 X’01′
o 绑定 X’02′
o UDP相关 X’03′
o RSV 保留的就设置为 0×00
o ATYP 地址类型
o IPv4地址: X’01′
o 域名: X’03′
o IPV6地址: X’04′
o DST.ADDR 目标地址
o DST.PORT 目标端口
如果地址类型为 IPV4,那么就会使用 4个字节分别表示 IP地址的4段。
如果地址类型为 域名,那么就第一个字节表示域名的长度,不用空字节来判断结束。
如果地址类型为 IPV6,那就么会用16个字节来表示IPV6地址。
比如这里我们以 域名 kejibo.com为例:
050100030a6b656a69626f2e636f6d0050
05就是版本号
01表示连接
00保留位
03表示地址类型,这里我们使用域名就是0×03
0a表示域名的长度这里我们是 kejibo.com刚好10个字节。0a就表示10个字节
6b656a69626f 表示 kejibo
2e表示 点
636f6d 表示 com
0050表示端口号 80
四、收到上面的请求后,服务器向客户端发送
+—-+—–+——-+——+———-+———-+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+—-+—–+——-+——+———-+———-+
| 1 | 1 | X’00′ | 1 | Variable | 2 |
+—-+—–+——-+——+———-+———-+
o VER 版本号: X’05′
o REP 回复字段:
o X’00′ 成功
o X’01′ SOCKS服务器出错
o X’02′ 连接不合规则
o X’03′ 网络不可连接
o X’04′ 主机不可连接
o X’05′ 连接被拒绝
o X’06′ TTL 超时
o X’07′ 命令不可接受
o X’08′ 地址类型不可授受
o X’09′ to X’FF’ 未分配
o RSV 保留位 0×00
o ATYP 地址类型
o IP V4地址: X’01′
o 域名: X’03′
o IP V6 地址: X’04′
o BND.ADDR 服务器绑定的地址
o BND.PORT 服务器绑定的端口
客户端收到响应后,如果收到的回复是【成功】,那么就可以向服务器端发起常见的请求了,比如 http ftp smtp telnet之类的请求了,服务器端传发这些请求到目标服务器,然后把目标服务器的回应再转给客户端。
发送此篇文章就是通过Chrome,使用Chrome Switchy连接 自己写的一个Go语言的 socks代理服务器,发送出去的。
转载请注明:http://kejibo.com/socks5/