Socks协议

翻译至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端口绑定
报文域3:网络字节顺序端口号,2个字节
报文域4:网络字节顺序IP地址,4个字节
报文域5:用户ID字符串,可变长度,用一个null字符(0x00)终止

SOCKS服务器到SOCKS客户端:
报文域1:空字节
报文域2:状态,1字节
  • 0x5a 请求通过
  • 0x5b 请求拒绝或失败
  • 0x5c  因为客户端没有启动identd(身份认证的协议) 或者服务器不可达 导致请求失败
  • 0x5d 因为客户端的身份认证没有通过所以导致请求失败
报文域3:2个任意字节,可以忽略
报文域4:4个任意字节,可以忽略

这是一个SOCKS4请求连接到ip地址是66.102.7.99:80的Fred的报文,服务器返回“ok”
客户端:0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00
  • 最后一个域是"Fred"的ASCII,最后加上空字节
服务器端:0x00 | 0x5a | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX

  • 0xXX可以是任何值,SOCKS4协议该域应该被忽略
从此开始,任何从SOCKS客户端到SOCKS服务器的数据都由66.102.7.99中继,反之亦然
命令域也许是0x01代表连接或者0x02代表绑定。绑定命令允许其他协议连接,比如FTP

SOCKS4a
SOCKS4a拓展了SOCKS4协议,可以允许客户端使用域名而不是IP地址,这是非常有用的当客户端本身无法解决域名转换成IP的问题
客户端必须设置首先的三个DSTIP字节为NULL和最后的字节非空值(这个和IP地址0.0.0.x相似,最后一个x非0值),和空值结束用户名一样,客户端也发送一个空值来结束域名,在CONNECT和BIND请求都是一样的

SOCKS客户端到SOCKS服务器:

报文域1:SOCKS版本号,一个字节。

报文域2:命令码,1个字节

  •     0x01 建立一个TCP/IP流连接
  •     0x02 建立一个TCP/IP端口绑定
报文域3:网络字节顺序端口号,2个字节
报文域4:无效的IP地址,4个字节,前3个字节为0x00,最后一个是非0x00
报文域5:用户ID字符串,可变长度,用一个null字符(0x00)终止
报文域6:我们想联系的域名,可变长度,用0x00结束

SOCKS服务器到SOCKS客户端:
报文域1:空字节
报文域2:状态,1字节
  • 0x5a 请求通过
  • 0x5b 请求拒绝或失败
  • 0x5c  因为客户端没有启动identd(身份认证的协议) 或者服务器不可达 导致请求失败
  • 0x5d 因为客户端的身份认证没有通过所以导致请求失败
报文域3:网络字节顺序端口号,2个任意字节
报文域4:网络字节顺序IP地址,4个任意字节

使用SOCKS4a的服务器必须检测请求数据包的DSTIP。假如ip地址是0.0.0.x,那么服务器必须读取数据包中的域名,服务器会解决域名解析和连接目的服务器。

SOCKS5
SOCKS5协议在RFC1928中有定义,这是SOCKS4协议的一种拓展,它提供了更多的认证选择,并且添加了对IPv6和UDP的支持,最后它提供了DNS查询,初始的握手过程总结如下:
  • 客户端连接并发送一个问候(包括一组支持的认证方式)
  • 服务器选择一个(如果没有可接受的认证方式返回一个错误响应)
  • 根据选择的认证方式在客户端和服务器直接传递几条信息
  • 客户端发送一个和SOCK4相似的连接请求
  • 服务器端返回一个和SOCKS4相似的响应
以下是支持的认证方式
  • 0x00:无认证方式
  • 0x01:GSSAPI
  • 0x02:用户名/密码
  • 0x03-0x7F:IANA分配的方法
  • 0x80-0xFE:保留为私有使用的方法
客户端发送的初始问候报文

报文域1:SOCKS版本号
报文域2:支持的认证方法的数量,1个字节
报文域3:认证方式,可变长度,一个支持的方式占1个字节
服务器选择认证方法的报文

报文域1:SOCKS版本,1字节
报文域2:选择的的认证方法,1个字节,失败返回0xFF

随后的认证方式由选择的方式而定
比如 用户名/密码的认证方式如下

报文域1:版本号,1字节
报文域2:用户名长度,1字节
报文域3:用户名
报文域4:密码长度,1字节
报文域5:密码

服务器返回的响应

报文域1:版本,1字节
报文域2:状态码,1字节
  • 0x00 成功
  • 其他值 连接关闭
客户端连接请求

报文域1:SOCKS版本号,1字节
报文域2:命令码,1字节:
  • 0x01  建立TCP/IP流连接
  • 0x02  建立TCP/IP端口绑定
  • 0x03  连结一个UDP端口
报文域3:保留,必须是0x00
报文域4:地址类型,1字节

  • 0x01 IPv4地址
  • 0x03 域名
  • 0x04 IPv6地址
报文域5:目的地址
  • 4个字节 IPv4地址
  • 1字节的长度,然后是域名
  • 16个字节 IPv6地址
报文域6:网络字节流的端口号,2个字节

服务器的响应

报文域1:SOCKS协议版本 1个字节
报文域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:网络字节流的端口号,2个字节

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值