SOCKS5 简介

翻译 2016年12月05日 15:13:57

SOCKS5 简介

防火墙可以把内部网独立出来,防火墙作为一个应用层的网关,通常会支持 TELNET,FTP,SMTP的访问,从而需要有一个协议能够支持安全地穿透防火墙来访问这几个协议,SOCKS5应运而生。

SOCKS5 协议由 RFC1928 定义,是SOCKS4 的扩展,提供了更多验证身份的方式,并且添加了对 IPv6UDP 的支持,后者可以用于 DNS lookups

流程简介

开始的握手包括:

  • 客户端连接并发送一个 “问候”消息,包括一列支持的验证方法。
  • 服务端选择其中一种方法(如果没有可以接受的方法则发送失败应答)。
  • 几条消息已经传输于客户端与服务端之间,取决于选择的验证方法。
  • 客户端发送一个连接请求,类似SOCKS4。
  • 服务端应答,类似SOCKS4。

支持的验证方法如下,以数字表示:

  • 0x00:无验证。
  • 0x01:GSSAP。
  • 0x02:账户/密码。
  • 0x03-0x7F:由 IANA 颂发的方法。
  • 0x80-0xFE:保留方法(私用)。

1,客户端发送的“问候”消息的字段描述如下:

                   +----+----------+----------+
                   |VER | NMETHODS | METHODS  |
                   +----+----------+----------+
                   | 1  |    1     | 1 to 255 |
                   +----+----------+----------+
  • 字段1:SOCKS版本号,1个字节(必须是0x05)。
  • 字段2:支持的验证方式的个数,1个字节。
  • 字段3:验证方式,变长,每种方式占1个字节。

2,服务端选择后的通信:

                         +----+--------+
                         |VER | METHOD |
                         +----+--------+
                         | 1  |   1    |
                         +----+--------+
  • 字段1:SOCKS版本号,1个字节(必须是0x05)。
  • 字段2:选择的验证方式,1个字节,如果不接受任何方式则返回 0xFF。

随后的验证是根据验证方式来定的,基本用户名/密码的验证方式(0x02)在 RFC1929 中描述。

对于用户名/密码的验证方式,客户端的验证请求是:

  • 字段1:版本号,1个字节(必须是0x01)。
  • 字段2:用户名长度,1个字节。
  • 字段3:用户名。
  • 字段4:密码长度,1个字节。
  • 字段5:密码。

服务端返回验证结果:

  • 字段1:版本号,1个字节。
  • 字段2:状态码,1个字节。
    • 0x00:成功。
    • 任何其他值:失败,连接关闭。

客户端的连接请求是:

        +----+-----+-------+------+----------+----------+
        |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
        +----+-----+-------+------+----------+----------+
        | 1  |  1  | X'00' |  1   | Variable |    2     |
        +----+-----+-------+------+----------+----------+
  • 字段1:SOCKS版本号,1个字节(必须是0x05)。
  • 字段2:控制码,1个字节。
    • 0x01:建立 TCP/IP stream 连接。
    • 0x02:建立 TCP/IP 端口连接。
    • 0x03:关联一个 UDP 端口。
  • 字段3:保留。必须是0x00。
  • 字段4:地址类型,1个字节。
    • 0x01:IPv4 地址。
    • 0x03:域名。
    • 0x04:IPv6地址。
  • 字段5:目标地址:
    • 4字节的IPv4地址。
    • 1个字节表示名称长度,紧接着域名。
    • 16个字节的IPv6地址。
  • 字段6:端口号(network byte order),2个字节。

服务端响应:

        +----+-----+-------+------+----------+----------+
        |VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
        +----+-----+-------+------+----------+----------+
        | 1  |  1  | X'00' |  1   | Variable |    2     |
        +----+-----+-------+------+----------+----------+
  • 字段1:SOCKS版本号,1个字节(必须是0x05)。
  • 字段2:状态码,1个字节:
    • 0x00:请求批准。
    • 0x01:一般性失败。
    • 0x02:规则不允许连接。
    • 0x03:网络不可用。
    • 0x04:找不到主机。
    • 0x05:目标主机拒绝连接。
    • 0x06:TTL 超时。
    • 0x07:不支持的控制/协议错误。
    • 0x08:地址类型不支持。
      • 字段3:保留值,必须是0x00。
      • 字段4:地址类型,1个字节。
    • 0x01:IPv4 地址。
    • 0x03:域名。
    • 0x04:IPv6地址。
  • 字段5:目标地址:
    • 4字节的IPv4地址。
    • 1个字节表示名称长度,紧接着域名。
    • 16个字节的IPv6地址。
  • 字段6:端口号(network byte order),2个字节。

UDP 关联

  • UDP关联请求用于在UDP relay 到处理 UDP 数据报的过程中建立一个关联关系,DST.ADDR 和 DST.PORT中包括了客户端想要用于发送UDP数据报的地址和端口。服务端可能用这些信息有限地处理这个关联关系。
  • 如果客户端在 UDP关联时没有指定这些信息,那么客户端必须用一个全部为0的端口号和地址。
  • UDP关联会在这个UDP关联的TCP连接中止时随之中止。

参考:

https://en.wikipedia.org/wiki/SOCKS#SOCKS5
https://tools.ietf.org/html/rfc1928

Socks5 c++代码

  • 2013年01月08日 19:20
  • 16KB
  • 下载

socks5/lsp/proxy代理客端

  • 2016年01月21日 14:45
  • 3MB
  • 下载

真正socks5代理源码 VC

http://blog.macrowen.com/Technology/64.html // Author: LZX // E-mail: LZX@qq.com // Version: V1.0...
  • GG_8080
  • GG_8080
  • 2014年04月18日 16:23
  • 4922

socks5服务器源代码

  • 2017年05月12日 13:26
  • 419KB
  • 下载

Socks5TCP

  • 2006年02月23日 09:05
  • 5KB
  • 下载

Mac上Privoxy将shadowsocks的socks5代理转为http代理(解决SublimeText无法安装插件的问题)

背景:shadowsocks虽然用着很爽,但是不是万能的。原因是他是sock5代理,属于局部代理。一些软件根本不支持socks5代理,如AS的gradle,eclipse等均不支持。AndroidSt...

Socks5代理服务器源码

  • 2009年04月23日 18:49
  • 732KB
  • 下载

socks5 连接

  • 2016年09月01日 18:12
  • 2KB
  • 下载

CentOS搭建Socks5 Proxy代理服务器

关于SOCKS5     SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者...
  • sdulsj
  • sdulsj
  • 2017年12月08日 17:09
  • 29
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SOCKS5 简介
举报原因:
原因补充:

(最多只允许输入30个字)