关于 Socks5 代理

Socks5 是什么

Socks5 是一种代理协议. 例如, 在公司中不同部门之间, 可能会限制跨部门的机器访问. 但在遇到部分需要跨部门协作时, 需要访问另一部门的资源,而又不想打破原有的限制, 则可以使用代理协议进行通信. 部署了 Socks 代理的机器就相当于中间人的角色.

协议

Socks5 的流程上比较简单, 大概经过以下几个步骤:

  1. 客户端发送认证的请求
  2. 代理根据认证的信息进行回复 (如果认证失败, 会话结束)
    2.1. 客户端发送认证的信息
    2.2. 服务端进行鉴权
  3. 客户端发送想要连接的目标信息
  4. 代理服务器根据客户端提供的信息进行连接, 并返回连接建立的结果
  5. 代理服务器将在客户端和目标服务器之间做转发(已于Socks5 协议无关)

协议细节

认证

认证方法

  • 0x00: NO AUTHENTICATION REQUIRED
  • 0x01: GSSAPI, 见 RFC 2743
  • 0x02: USERNAME/PASSWORD, 见 RFC 1929
  • 0x03: to X’7F’ IANA ASSIGNED
  • 0x80: to X’FE’ RESERVED FOR PRIVATE METHODS
  • 0xFF: NO ACCEPTABLE METHODS

客户端发起认证请求

VER(1) NMETHODS (1) METHODS (1~255)
固定为 5 选择了几种方法 方法列表

服务器响应认证请求

VER(1) NMETHOD (1)
固定为 5 服务端挑选的认证方式

如果服务端向客户端回应方法 0xFF 那么客户端只能选择关闭连接.

请求连接目标

当认证通过后, 客户端可以发起请求代理端连接目标主机

VER(1) CMD (1) RSV (固定0x00) ATYP(1) DST.ADDR DST.PORT(2)
固定为 5 对目标想要做的操作 - 地址类型 地址, 如果是域名, 那第一个字节是域名数据的长度 端口

CMD 的内容:

  • 0x01: CONNECT 客户端请求服务器进行代理
  • 0x02: BIND 向服务器上报自己的反向连接监听地址(应用场景如 FTP 下载,客户端需要接受来自服务器的连接
  • 0x03: UDP ASSOCIATE 用于请求建立到 UDP 数据报中继的连接

ATYP 的内容:

  • 0x01: IP V4 地址
  • 0x03: 域名
  • 0x04: IP V6 地址

响应连接请求

VER(1) REP (1) RSV (固定0x00) ATYP(1) BND.ADDR BND.PORT(2)
固定为 5 响应 - 地址类型 连接到的远程地址, 如果是域名, 那第一个字节是域名数据的长度 远程端口

REP 的内容:

  • 0x00 succeeded
  • 0x01 general SOCKS server failure
  • 0x02 connection not allowed by ruleset
  • 0x03 Network unreachable
  • 0x04 Host unreachable
  • 0x05 Connection refused
  • 0x06 TTL expired
  • 0x07 Command not supported
  • 0x08 Address type not supported
  • 0x09 to X’FF’ unassigned

ATYP 的内容:

  • 0x01: IP V4 地址
  • 0x03: 域名
  • 0x04: IP V6 地址

即是当代理服务端响应 0x00 后, Socks5 的协商已完成, 后续的通信已于 Socks 协议无关.

参考资料

Author: Sean
Link: https://blog.whileaway.io/posts/ef424a47/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.