标签:
1
https://zh.wikipedia.org/wiki/SOCKS
SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是"SOCKetS"的缩写
当防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。
这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到版本4。最新协议是版本5,与前一版本相比,增加支持UDP、验证,以及IPv6。
根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。
下面是客户端向SOCKS 4代理服务器,发送的连接请求包的格式(以字节为单位):
VN | CD | DSTPORT | DSTIP | USERID | NULL |
1 | 1 | 2 | 4 | variable | 1 |
代理服务器而后发送回应包(以字节为单位):
VN | CD | DSTPORT | DSTIP |
1 | 1 | 2 | 4 |
如果请求被拒绝,SOCKS服务器马上与客户端断开连接;如果请求被允许,代理服务器就充当客户端与目的主机之间进行双向传递,对客户端而言,就如同直接在与目的主机相连。
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 比 SOCKS4a 多了鉴定、 IPv6、 UDP 支持。建立与 SOCKS5 服务器的TCP连接后客户端需要先发送请求来协商版本及认证方式。
VER | NMETHODS | METHODS |
1 | 1 | 1-255 |
服务器从客户端提供的方法中选择一个并通过一下消息通知客户端:
VER | METHOD |
1 | 1 |
之后客户端和服务端根据选定的认证方式执行对应的认证。
认证结束后客户端就可以发送请求信息。如果认证方法有特殊封装要求,请求必须按照方法所定义的方式进行封装。
SOCKS5 请求格式:
VER | CMD | RSV | ATYP | DST ADDR | DST PROT |
1 | 1 | 0x00 | 1 | 动态 | 2 |
服务器按以下格式回应客户端的请求:
VER | REP | RSV | ATYP | BND ADDR | BND PROT |
1 | 1 | 0x00 | 1 | 动态 | 2 |
部分SOCKS服务器软件:
有不少客户端的socksify
客户端 | 许可证 | 版本 | 发布日期 | 平台 | 支持协议 |
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
xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
标签:
原文地址:http://www.cnblogs.com/xgqfrms/p/4995180.html