乐趣区

关于网络:网络协议之一定要大写的SOCKS

简介

很久很久以前,人们还穿的是草鞋,草鞋尽管衣着难受,然而不够好看。而后人们就发现,用动物的皮也能够做成鞋,于是呈现了皮鞋。然而皮鞋衣着磨脚,于是人们又创造了 socks,套在脚上,代替脚跟鞋子接触,既进步了舒适感,也缩小了磨损,几乎是两全其美的事件,十分完满。

在网络世界,也存在这样的 socks,为了和真实世界的 socks 进行辨别,这里咱们应用大写的 SOCKS。

SOCKS 就是咱们明天要解说的网络代理协定。

SOCKS 的故事

在解说 SOCKS 之前,咱们回顾一下 OSI 网络七层协定。

OSI 是 Open System Interconnect 的缩写,意为开放式系统互联。

而 SOCKS 也是一种网络协议,它的作用和 socks 一样,用来代替客户端和服务器端进行连贯,也就是代理协定。

SOCKS 在 OSI 七层协定的第五层,也就是会话层中,它处于体现层和传输层的两头。从上图能够看到 SOCKS 的底层就是 TCP 和 UDP 协定。

作为一个代理协定,SOCKS 能够提供基于 TCP 和 UDP 的代理,相较于 HTTP 的代理而言,SOCKS 的代理更加底层,所以利用场景也会更多。

通常来说,SOCKS 的规范端口是 1080。

SOCKS 的历史

每个协定都有本人的发展史,SOCKS 也不例外,如果要把所有协定的发展史以故事的模式讲述起来肯定会很有意思,大家能够期待一下,说不定某天这样的文章就呈现了。

代理是网络中的一项基本功能,SOCKS 代理最先是由美国 MIPS 科技公司的 David Koblas 设计的。MIPS 公司以开发 MIPS 架构和基于该架构的一系列 RISC CPU 芯片而闻名。不过前面被一系列的收买,最终 MIPS 架构被放弃了,转而反对 RISC- V 架构。

MIPS 在 1992 年被 Silicon Graphics 收买了,在那一年 Koblas 发表了对于 SOCKS 的论文,SOCKS 一举成名。

SOCKS 最宽泛应用的协定版本是 4 和 5。SOCKS4 是 NEC 的 Ying-Da Lee 创造的。因为 SOCKS 4 中并没有对于平安方面的约定,然而对于当初的网络来说,平安越来越重要,所以呈现了 SOCKS5,SOCKS5 协定最后是一种使防火墙和其余平安产品更易于治理的平安协定。

SOCKS 协定的具体内容

当初罕用的 SOCKS 协定次要有 SOCKS4、SOCKS4a 和 SOCKS5。本节将会具体讲诉他们的协定形成。

SOCKS4

先看一下 SOCKS4 的申请数据 package 长得什么样子的:

含意 VER CMD DSTPORT DSTIP ID
字节个数 1 1 2 4 可变

VER 占用 1 个字节,示意的是 SOCKS 协定的版本号,对于 SOCKS4 来说,这个值是 0x04。

CMD 占用 1 个字节,示意的是要执行命令的代码,有两个抉择,其中 0x01 示意建设一个 TCP/IP 流连贯,0x02 示意建设一个 TCP/IP 端口绑定。

DSTPORT 占用 2 个字节,示意指标端口号。

DESTIP 占用 4 个字节,示意的是 IPv4 地址。

ID 占用字节不定,示意的是用户 ID。

对于申请数据,相应的返回数据如下:

含意 VN REP DSTPORT DSTIP
字节个数 1 1 2 4

VN 占用 1 个字节,示意是返回的音讯的版本。

REP 占用 1 个字节,示意返回的 code:

字节 含意
0x5A 申请受权
0x5B 申请回绝或者申请失败
0x5C 因为申请不蕴含客户端 ID 或者服务器端无奈连贯客户端而失败
0x5D 因为客户端 ID 不匹配而失败

DSTPORT 占用两个字节,示意目的地的端口,如果没有绑定的话,则为空。

DSTIP 占用 4 个字节,示意客户端绑定的目的地的 IP 地址。

举个例子,如果客户端想应用 SOCKS4 从 Fred 连贯到 66.102.7.99:80,申请如下:

0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00

其中最初一个字段是 Fred 的 ASCII 编码。

如果服务器端返回 OK,则对应的响应如下:

0x00 | 0x5A | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX

其中 0xXX 能够是任意值。

当连贯建设结束之后,所有的 SOCKS 客户端到 SOCKS 服务器端的申请都会转发到 66.102.7.99。

SOCKS4a

因为 SOCKS4 只能指定目标服务器的 IP 地址,这对应服务器有多个 IP 的状况下会有很重大的限度。所以 SOCK4a 对 SOCK4 进行了扩大,能够反对指标服务器的域名。

SOCKS4a 也是由 SOCKS4 的作者 Ying-Da Lee, 提出来的。咱们看下 SOCKS4a 的申请格局:

含意 VER CMD DSTPORT DSTIP ID DOMAIN
字节个数 1 1 2 4 可变 variable

SOCKS4a 是在 SOCKS4 的最初退出了 domain。

DOMAIN 示意的是要连贯到的指标服务器的域名。应用 null (0x00) 来结尾。对应的 DSTIP 的前三个字节设置为 NULL,最初一个字节设置成一个非 0 的值。

服务端的响应和 SOCKS4 是一样的。

SOCKS5

尽管 SOCKS5 是 SOCKS 的最新版本,然而 SOCKS5 和 SOCKS4 是不兼容的。SOCKS5 反对认证,并且提供了对 IPv6 和 UDP 的反对。其中 UDP 能够用来进行 DNS lookups。它的交互流程如下所示:

  1. 客户端和服务器端进行连贯,并发送一个 greeting 音讯,同时蕴含了反对的认证办法列表。
  2. 服务器端抉择一个反对的认证办法,如果都不反对,则发送失败响应。
  3. 依据选中的认证办法,客户端和服务器进行后续的认证交互,交互流程跟选中的认证办法相干。
  4. 客户端以 SOCKS4 类似的形式发送连贯申请。
  5. 服务器端发送和 SOCKS4 类似的响应。

咱们看下 greeting 音讯的格局:

含意 VER NAUTH AUTH
字节个数 1 1 可变字节

VER 占用 1 个字节示意 SOCKS 的版本号,这里是 0x05。

NAUTH 占用 1 个字节,示意反对的认证办法的个数。

AUTH 是可变字节,示意的是反对的认证办法。一个字节示意一个办法,反对的办法如下:

    0x00: 没有认证
    0x01: GSSAPI 
    0x02: 用户名 / 明码 (RFC 1929)
    0x03–0x7F: methods assigned by IANA
        0x03: Challenge-Handshake Authentication Protocol
        0x04: 未调配
        0x05: Challenge-Response Authentication Method
        0x06: Secure Sockets Layer
        0x07: NDS Authentication
        0x08: Multi-Authentication Framework
        0x09: JSON Parameter Block
        0x0A–0x7F: 未调配
    0x80–0xFE: 外部应用的保留办法 

对应的服务器端的响应如下:

含意 VER CAUTH
字节个数 1 1

VER 占用 1 个字节,示意的是版本号。对于 SOCKS5 来说,它的值是 0x05。

CAUTH 占用 1 个字节,示意选中的认证办法。如果没有被选中,则设置为 0xFF。

选好认证办法之后,接下来就是客户端和服务器端的认证交互了,这里咱们抉择最根本的用户名和明码 0x02 认证为例。

客户端发送认证申请:

含意 VER IDLEN ID PWLEN PW
字节个数 1 1 (1-255) 1 (1-255)

VER 占用 1 个字节示意以后用户名和明码认证的版本。

IDLEN 占用 1 个字节,示意用户名的长度。

ID 占用 1 到 255 个字节,示意用户名。

PWLEN 占用 1 个字节,示意明码的长度。

PW 就是明码。

对应的服务器端的响应如下:

含意 VER STATUS
字节个数 1 1

VER 占用 1 个字节,示意版本号。

STATUS 占用 1 个字节,示意服务器的响应状态。

接下来,客户端就能够和服务器端发送建设连贯音讯了:

含意 VER CMD RSV DSTADDR DSTPORT
字节个数 1 1 1 可变字节 2

CMD 是连贯可选的命令,0x01 示意建设 TCP/IP 流连贯,示意建设 TCP/IP 端口绑定,0x03 示意连贯一个 UDP 端口。

RSV 是保留字节,必须是 0x00。

DSTADDR 是 SOCKS5 的地址。地址的定义是这样的:

含意 TYPE ADDR
字节个数 1 可变字节

TYPE 示意地址的类型,0x01 是 IPv4 地址,0x03 是域名,0x04 是 IPv6 地址。

ADDR 示意的是地址,如果是 IPv4,则应用 4 个字节,如果是域名,则第一个字节示意长度,前面字节示意域名。如果是 IPv6 地址,则应用 16 个字节。

对应的服务器端的响应如下:

含意 VER STATUS RSV BNDADDR BNDPORT
字节个数 1 1 1 可变字节 2

总结

以上就是 SOCKS4 和 SOCKS5 的具体协定内容。留神,SOCKS 肯定要大写!

本文已收录于 http://www.flydean.com/09-socks/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版