翻译至Wiki
原文:http://en.wikipedia.org/wiki/SOCKS
Socket Secure(SOCKS)是一个网络协议,可以通过代理服务器来路由客户端和服务器之间的数据包。SOCKS5还额外提供了身份验证,所以只有验证的用户可以通过服务器。特别的,一个SOCKS服务器可以代理TCP连接到任何一个IP地址,同时为UDP的数据包提供一种转发方式
SOCKS完成的是OSI模型中第五层的工作(会话层,位于表示层和传输层之间)
历史
这个协议最初由David Koblas创造,David Koblas是MIPS计算系统的管理员,在1992年MIPS被Silicon Graphics接管之后,Koblas在那年的Usenix安全研讨会上发表了关于SOCKS的一篇文章,让SOCKS为公众所知,这个协议被NEC的Ying-Da Lee扩展到了第四个版本。
SOCKS参考架构和客户端被 Permeo Technologies所拥有,是从NEC分拆出来
SOCKS5协议最初是一个安全协议被用来更容易的管控防火墙和其他安全产品,在1996年被IETF所批准,并与Aventail公司合作开发
用途
SOCKS是Circuit-level gateway(注:Circuit-level gateway是一种防火墙)事实上的标准
另外一种SOCKS的使用方式是作为规避工具,允许流量绕过网络过滤来获得内容,否则就被政府,学校,一些具体国家的web服务堵塞(译者注:说的就是翻墙的功能吧)。一些SSH套件,比如OpenSSH,支持动态端口转发,允许用户创建本地的SOCKS代理。这可以解除用户必须连接到一个预定义的远程端口和服务器的限制。
和HTTP代理的比较
SOCKS是一种比HTTP代理更低层的运转,SOCKS使用一种握手协议来通知代理软件关于客户端想要发起的连接,然后尽可能的做到透明。而普通的代理可能解释或重写报头
虽然HTTP代理有一个不同应用模型,CONNECT方法允许转发TCP连接。
SOCKS也可以做UDP转发和反向代理,而HTTP不能。
Protocol
SOCKS4
一个典型的SOCKS4连接请求是像这样的:
SOCKS客户端到SOCKS服务器:
报文域1:SOCKS版本号,一个字节。
报文域2:命令码,1个字节
- 0x01 建立一个TCP/IP流连接
- 0x02 建立一个TCP/IP端口绑定
- 0x5a 请求通过
- 0x5b 请求拒绝或失败
- 0x5c 因为客户端没有启动identd(身份认证的协议) 或者服务器不可达 导致请求失败
- 0x5d 因为客户端的身份认证没有通过所以导致请求失败
- 最后一个域是"Fred"的ASCII,最后加上空字节
- 0xXX可以是任何值,SOCKS4协议该域应该被忽略
SOCKS客户端到SOCKS服务器:
报文域1:SOCKS版本号,一个字节。
报文域2:命令码,1个字节
- 0x01 建立一个TCP/IP流连接
- 0x02 建立一个TCP/IP端口绑定
- 0x5a 请求通过
- 0x5b 请求拒绝或失败
- 0x5c 因为客户端没有启动identd(身份认证的协议) 或者服务器不可达 导致请求失败
- 0x5d 因为客户端的身份认证没有通过所以导致请求失败
- 客户端连接并发送一个问候(包括一组支持的认证方式)
- 服务器选择一个(如果没有可接受的认证方式返回一个错误响应)
- 根据选择的认证方式在客户端和服务器直接传递几条信息
- 客户端发送一个和SOCK4相似的连接请求
- 服务器端返回一个和SOCKS4相似的响应
- 0x00:无认证方式
- 0x01:GSSAPI
- 0x02:用户名/密码
- 0x03-0x7F:IANA分配的方法
- 0x80-0xFE:保留为私有使用的方法
- 0x00 成功
- 其他值 连接关闭
- 0x01 建立TCP/IP流连接
- 0x02 建立TCP/IP端口绑定
- 0x03 连结一个UDP端口
- 0x01 IPv4地址
- 0x03 域名
- 0x04 IPv6地址
- 4个字节 IPv4地址
- 1字节的长度,然后是域名
- 16个字节 IPv6地址
- 0x00 请求接受
- 0x01 失败
- 0x02 因为规则连接不被允许
- 0x03 网络不可达
- 0x04 主机不可达
- 0x05 连接被目标主机拒绝
- 0x06 TTL终止
- 0x07 命令不被支持/协议错误
- 0x08 地址类型不被支持
- 0x01 IPv4地址
- 0x03 域名
- 0x04 IPv6地址
- 4个字节 IPv4地址
- 1字节的长度,然后是域名
- 16个字节 IPv6地址
- 报文域6:网络字节流的端口号,2个字节