SOCKS5协议简单介绍

最近在弄一个socks5服务器,了解了一下协议。

以下内容都来自对这两个RFC的阅读

socks5协议标准

https://www.ietf.org/rfc/rfc1928.txt

socks5协议用户名密码认证标准

https://www.ietf.org/rfc/rfc1929.txt

第一步

客户端向服务器发送请求

英文名称VERNMETHODSMETHODS
字节数111 to 255

VER即socks版本号,这里填X’05’。

NMETHODS即第三个参数METHODS的字节数。

METHODS即客户端支持的身份验证方式

  • X’00’ NO AUTHENTICATION REQUIRED
  • X’01’ GSSAPI
  • X’02’ USERNAME/PASSWORD
  • X’03’ to X’7F’ IANA ASSIGNED
  • X’80’ to X’FE’ RESERVED FOR PRIVATE METHODS
  • X’FF’ NO ACCEPTABLE METHODS

常用的是00和02,分别代表无身份验证和用户名密码身份验证。

METHODS一个字节代表一种认证方式

第二步

服务器会回复

英文名称VERMETHOD
字节数11

含义同上,服务器会从客户端给的方式中,选出一个自己支持的,返回给客户端。

第三步

如果采取了02用户名密码验证的方式,客户端需要发送

英文名称VERULENUNAMEPLENPASSWD
字节数111 to 25511 to 255

这里的VER和之前的不同,RFC说是the current version of the subnegotiation,which is X’01’。

ULEN是用户名的长度,UNAME就是用户名,PLEN是密码长度,PASSWD就是密码。

第四步

服务器返回

英文名称VER STATUS
字节数11

VER也是X’01’。STATUS为0则表示验证成功,其他都表示为失败。

第五步

身份认证之后,就是正式的协议传输了,请求格式如下

英文名称VERCMDRSVATYPDST.ADDRDST.PORT
字节数1111变量2

VER即socks版本,X’05’

CMD有三个值

  • CONNECT X’01’
  • BIND X’02’
  • UDP ASSOCIATE X’03’

RSV,RESERVED,固定为X’00’

ATYP,即address type of following address,目标地址的类型

  • IPV4 X’01’
  • DOMAINNAME X’03’
  • IPV6 X’04’

DST.ADDR 目标地址(desired destination),长度取决于上一个参数。如果是IPV4,那么就是4字节,如果是IPV6就是16字节。如果是域名的话,DST.ADDR第一个字节用来表示域名的长度。

DST.PORT 目标端口(desired port)

第六步

回复格式如下

英文名称VERREPRSVATYPBND.ADDRBND.PORT
字节数1111变量2

VER即socks版本,X’05’

REP取值如下

  • 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,RESERVED,X’00’表示成功,其他表示失败。

ATYP,即address type of following address,已绑定地址的类型

  • IPV4 X’01’
  • DOMAINNAME X’03’
  • IPV6 X’04’

BND.ADDR 已绑定地址(bound address),长度取决于上一个参数。如果是IPV4,那么就是4字节,如果是IPV6就是16字节。如果是域名的话,BND.ADDR第一个字节用来表示域名的长度。

BND.PORT 已绑定端口(bound port)。

第七步

传输数据,此时服务器会把所有客户端发来的流量,如实转发到DST.ADDR去。

发表评论

电子邮件地址不会被公开。 必填项已用*标注