码迷,mamicode.com
首页 > 其他好文 > 详细

SOCKS

时间:2015-11-25 18:58:42      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:

1

https://zh.wikipedia.org/wiki/SOCKS

 

SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是"SOCKetS"的缩写[1]

防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。

这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到版本4。最新协议是版本5,与前一版本相比,增加支持UDP、验证,以及IPv6

根据OSI模型,SOCKS是会话层的协议,位于表示层传输层之间。

 

目录

版本分支

SOCKS 4

下面是客户端向SOCKS 4代理服务器,发送的连接请求包的格式(以字节为单位):

VN CD DSTPORT DSTIP USERID NULL
1 1 2 4 variable 1
  • VN是SOCK版本,应该是4;
  • CD是SOCK的命令码,1表示CONNECT请求,2表示BIND请求;
  • DSTPORT表示目的主机的端口;
  • DSTIP指目的主机的IP地址;
  • NULL是0;

代理服务器而后发送回应包(以字节为单位):

VN CD DSTPORT DSTIP
1 1 2 4
  • VN是回应码的版本,应该是0;
  • CD是代理服务器答复,有几种可能:
  • 90,请求得到允许;
  • 91,请求被拒绝或失败;
  • 92,由于SOCKS服务器无法连接到客户端的identd(一个验证身份的进程),请求被拒绝;
  • 93,由于客户端程序与identd报告的用户身份不同,连接被拒绝。
  • DSTPORT与DSTIP与请求包中的内容相同,但被忽略。

如果请求被拒绝,SOCKS服务器马上与客户端断开连接;如果请求被允许,代理服务器就充当客户端与目的主机之间进行双向传递,对客户端而言,就如同直接在与目的主机相连。

SOCKS4a

SOCKS 4A是SOCKS 4协议的简单扩展,允许客户端对无法解析的目的主机,进行自行规定。

客户端对DSTIP的头三个字节设定为NULL,最后一个字节为非零;对应的IP地址就是0.0.0.x,其中x是非零,这当然不可能是目的主机的 地址,这样即使客户端可以解析域名,对此也不会发生冲突。USERID以紧跟的NULL字节作结尾,客户端必须发送目的主机的域名,并以另一个NULL字 节作结尾。CONNECT和BIND请求的时候,都要按照这种格式(以字节为单位):

VN CD DSTPORT DSTIP 0.0.0.x USERID NULL HOSTNAME NULL
1 1 2 4 variable 1 variable 1

使用4a协议的服务器必须检查请求包里的DSTIP字段,如果表示地址0.0.0.x,x是非零结尾,那么服务器就得读取客户端所发包中的域名字段,然后服务器就得解析这个域名,可以的话,对目的主机进行连接。

SOCKS5

SOCKS5 比 SOCKS4a 多了鉴定、 IPv6、 UDP 支持。建立与 SOCKS5 服务器的TCP连接后客户端需要先发送请求来协商版本及认证方式。

VER NMETHODS METHODS
1 1 1-255
  • VER 是 SOCKS 版本,这里应该是 0x05;
  • NMETHODS 是 METHODS 部分的长度;
  • METHODS 是客户端支持的认证方式列表,每个方法占1字节。当前的定义是:
  • 0x00 不需要认证
  • 0x01 GSSAPI
  • 0x02 用户名、密码认证
  • 0x03 - 0x7F 由IANA分配(保留)
  • 0x80 - 0xFE 为私人方法保留
  • 0xFF 无可接受的方法

服务器从客户端提供的方法中选择一个并通过一下消息通知客户端:

VER METHOD
1 1
  • VER 是 SOCKS 版本,这里应该是 0x05;
  • METHOD 是服务端选中的方法。如果返回 0xFF 表示没有一个认证方法被选中,客户端需要关闭连接。

之后客户端和服务端根据选定的认证方式执行对应的认证。

认证结束后客户端就可以发送请求信息。如果认证方法有特殊封装要求,请求必须按照方法所定义的方式进行封装。

SOCKS5 请求格式:

VER CMD RSV ATYP DST ADDR DST PROT
1 1 0x00 1 动态 2
  • VER 是 SOCKS 版本,这里应该是 0x05;
  • CMD 是SOCK的命令码
  • 0x01 表示CONNECT请求
  • 0x02 表示BIND请求
  • 0x03 表示 UDP 转发
  • RSV 0x00,保留
  • ATYP DST ADDR 类型
  • 0x01 IPv4地址,DST ADDR 部分4字节长度
  • 0x03 域名,DST ADDR 部分第一个字节为域名长度,DST ADDR 剩余的内容为域名,没有 \0 结尾。
  • 0x04 IPv6地址,16个字节长度。
  • DST ADDR 目的地址
  • DST PROT 网络字节序表示的目的端口

服务器按以下格式回应客户端的请求:

VER REP RSV ATYP BND ADDR BND PROT
1 1 0x00 1 动态 2
  • VER 是 SOCKS 版本,这里应该是 0x05;
  • REP 应答字段
  • 0x00 表示成功
  • 0x01 普通SOCKS服务器连接失败
  • 0x02 现有规则不允许连接
  • 0x03 网络不可达
  • 0x04 主机不可达
  • 0x05 连接被拒
  • 0x06 TTL 超时
  • 0x07 不支持的命令
  • 0x08 不支持的地址类型
  • 0x09 - 0xFF 未定义
  • RSV 0x00,保留
  • ATYP BND ADDR 类型
  • 0x01 IPv4地址,DST ADDR 部分4字节长度
  • 0x03 域名,DST ADDR 部分第一个字节为域名长度,DST ADDR 剩余的内容为域名,没有 \0 结尾。
  • 0x04 IPv6地址,16个字节长度。
  • BND ADDR 服务器绑定的地址
  • BND PROT 网络字节序表示的服务器绑定的端口

SOCKS 服务器

部分SOCKS服务器软件:

SOCKS 客户端

有不少客户端的socksify[2]软件,本地软件从而可以通过SOCKS来与外网相连。

客户端 许可证 版本 发布日期 平台 支持协议
Dante client BSD/CMU 1.1.18 09/2005 Linux v4, v5
FreeCap GPL 3.18 02/2005 Windows -
Hummingbird socks - - - Windows -
ProxyCap - 2.03 - Windows -
SocksCap Non-Comercial home use - - - v5
Super Socks5Cap - 1.5.3 - Windows -
tsocks GPL 1.8 10/2002 - -
nylon - - 06/2003 OpenBSD -

注释

  1. ^ 详见:http://www.hummingbird.com/products/nc/socks/faq.html#stand
  2. ^ sockify定义请见:http://mindprod.com/jgloss/socksify.html

参见

外部链接

 

 

 

1

 

 

 

 

 

xxxxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxxxxxxxxxxx

SOCKS

标签:

原文地址:http://www.cnblogs.com/xgqfrms/p/4995180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!