Socks5代理协议

转载至:socks5协议详解 - 每天进步一点点

或许你没听说过socks5,但你一定听说过SS,SS内部使用的正是socks5协议。

socks5是一种网络传输协议,主要用于客户端与目标服务器之间通讯的透明传递。

该协议设计之初是为了让有权限的用户可以穿过防火墙的限制,访问外部资源。

  1. RFC地址
    1.socks5协议规范rfc1928
    2.socks5账号密码鉴权规范rfc1929
  2. 协议过程

客户端连接上代理服务器之后需要发送请求告知服务器目前的socks协议版本以及支持的认证方式
代理服务器收到请求后根据其设定的认证方式返回给客户端
如果代理服务器不需要认证,客户端将直接向代理服务器发起真实请求
代理服务器收到该请求之后连接客户端请求的目标服务器
代理服务器开始转发客户端与目标服务器之间的流量
3. 认证过程
3.1 客户端发出请求
客户端连接服务器之后将直接发出该数据包给代理服务器

VERSION METHODS_COUNT METHODS…
1字节 1字节 1到255字节,长度由METHODS_COUNT值决定
0x05 0x03 0x03 0x00 0x01 0x02
  • VERSION SOCKS协议版本,目前固定0x05
  • METHODS_COUNT 客户端支持的认证方法数量
  • METHODS… 客户端支持的认证方法,每个方法占用1个字节
    METHOD定义
  • 0x00 不需要认证(常用)
  • 0x01 GSSAPI认证
  • 0x02 账号密码认证(常用)
  • 0x03 - 0x7F IANA分配
  • 0x80 - 0xFE 私有方法保留
  • 0xFF 无支持的认证方法

3.2 服务端返回选择的认证方法

接收完客户端支持的认证方法列表后,代理服务器从中选择一个受支持的方法返回给客户端

3.2.1 无需认证
VERSION METHOD
1字节 1字节
0x05 0x00
VERSION SOCKS协议版本,目前固定0x05
METHOD 本次连接所用的认证方法,上例中为无需认证
3.2.2 账号密码认证
VERSION METHOD
1字节 1字节
0x05 0x02
3.2.3 客户端发送账号密码
服务端返回的认证方法为0x02(账号密码认证)时,客户端会发送账号密码数据给代理服务器

VERSION USERNAME_LENGTH USERNAME PASSWORD_LENGTH PASSWORD
1字节 1字节 1-255字节 1字节 1-255字节
0x01 0x01 0x0a 0x01 0x0a
VERSION 认证子协商版本(与SOCKS协议版本的0x05无关系)
USERNAME_LENGTH 用户名长度
USERNAME 用户名字节数组,长度为USERNAME_LENGTH
PASSWORD_LENGTH 密码长度
PASSWORD 密码字节数组,长度为PASSWORD_LENGTH
3.2.4 服务端响应账号密码认证结果
收到客户端发来的账号密码后,代理服务器加以校验,并返回校验结果

VERSION STATUS
1字节 1字节
VERSION 认证子协商版本,与客户端VERSION字段一致
STATUS 认证结果
0x00 认证成功
大于0x00 认证失败
4. 命令过程
认证成功后,客户端会发送连接命令给代理服务器,代理服务器会连接目标服务器,并返回连接结果

4.1 客户端请求
VERSION COMMAND RSV ADDRESS_TYPE DST.ADDR DST.PORT
1字节 1字节 1字节 1字节 1-255字节 2字节
VERSION SOCKS协议版本,固定0x05
COMMAND 命令
0x01 CONNECT 连接上游服务器
0x02 BIND 绑定,客户端会接收来自代理服务器的链接,著名的FTP被动模式
0x03 UDP ASSOCIATE UDP中继
RSV 保留字段
ADDRESS_TYPE 目标服务器地址类型
0x01 IP V4地址
0x03 域名地址(没有打错,就是没有0x02),域名地址的第1个字节为域名长度,剩下字节为域名名称字节数组
0x04 IP V6地址
DST.ADDR 目标服务器地址
DST.PORT 目标服务器端口
4.2 代理服务器响应
VERSION RESPONSE RSV ADDRESS_TYPE BND.ADDR BND.PORT
1字节 1字节 1字节 1字节 1-255字节 2字节
VERSION SOCKS协议版本,固定0x05
RESPONSE 响应命令
0x00 代理服务器连接目标服务器成功
0x01 代理服务器故障
0x02 代理服务器规则集不允许连接
0x03 网络无法访问
0x04 目标服务器无法访问(主机名无效)
0x05 连接目标服务器被拒绝
0x06 TTL已过期
0x07 不支持的命令
0x08 不支持的目标服务器地址类型
0x09 - 0xFF 未分配
RSV 保留字段
BND.ADDR 代理服务器连接目标服务器成功后的代理服务器IP
BND.PORT 代理服务器连接目标服务器成功后的代理服务器端口
5. 通信过程
 经过认证与命令过程后,客户端与代理服务器进入正常通信,客户端发送需要请求到目标服务器的数据给代理服务器,代理服务器转发这些数据,并把目标服务器的响应转发给客户端,起到一个“透明代理”的功能。

  1. 实际例子
    上文详细讲解了协议规范,下面来一个实例的通信过程范例。

6.2中无需认证和需要账号密码认证是互斥的,同一请求只会采取一种,本文都列在下面。

6.1 客户端发送受支持的认证方法
1
0x05 0x02 0x00 0x02
0x05 SOCKS5协议版本
0x02 支持的认证方法数量
0x00 免认证
0x02 账号密码认证
6.2 服务端响应选择的认证方法
6.2.1 无需认证
以下是无需认证,客户端收到该响应后直接发送需要发送给目标服务器的数据给到代理服务器,此时进入通信错过程

1
0x05 0x00
0x05 SOCKS5协议版本
0x00 免认证
6.2.2 需要账号密码认证
1
0x05 0x02
0x05 SOCKS5协议版本
0x02 账号密码认证
6.2.3 客户端发送账号密码
1
0x01 0x04 0x61 0x61 0x61 0x61 0x04 0x61 0x61 0x61 0x61
0x01 子协商版本
0x04 用户名长度
0x61 0x61 0x61 0x61 转换为ascii字符之后为”aaaa”
0x04 密码长度
0x61 0x61 0x61 0x61 转换为ascii字符之后”aaaa”
6.2.4 代理服务器响应认证结果
1
0x01 0x00
0x01 子协商版本
0x00 认证成功(也就是代理服务器允许aaaa账号以aaaa密码登录)
6.3 客户端请求代理服务器连接目标服务器
以127.0.0.1和80端口为例

1
0x05 0x01 0x01 0x01 0x7f 0x00 0x00 0x01 0x00 0x50
0x05 SOCKS协议版本
0x01 CONNECT命令
0x01 RSV保留字段
0x01 地址类型为IPV4
0x7f 0x00 0x00 0x01 目标服务器IP为127.0.0.1
0x00 0x50 目标服务器端口为80
6.4 代理服务器连接目标主机,并返回结果给客户端
1
0x05 0x00 0x01 0x01 0x7f 0x00 0x00 0x01 0x00 0xaa 0xaa
0x05 SOCKS5协议版本
0x00 连接成功
0x01 RSV保留字段
0x01 地址类型为IPV4
0x7f 0x00 0x00 0x01 代理服务器连接目标服务器成功后的代理服务器IP, 127.0.0.1
0xaa 0xaa 代理服务器连接目标服务器成功后的代理服务器端口(代理服务器使用该端口与目标服务器通信),本例端口号为43690
6.5 客户端发送请求数据给代理服务器
如果客户端需要请求目标服务器的HTTP服务,就会发送HTTP协议报文给代理服务器,代理服务器将这些报文原样转发给目标服务器,并将目标服务器的响应发送给客户端,代理服务器不会对客户端或者目标服务器的报文做任何解析。

  1. 结尾
    SOCKS5协议的讲解到此结束,后续会使用GOLANG实现一个SOCKS5服务器来讲述TCP协议服务器的开发。

转:socks5协议详解相关推荐

  1. socket 5协议详解

    认证 首先客户端向服务端发送认证信息,结构如下 +----+----------+----------+ |VER | NMETHODS | METHODS | +----+----------+-- ...

  2. HTTP协议详解(真的很经典)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  3. Http 协议详解笔记

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

  4. Http协议 详解(转载)

    http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...

  5. ARP协议详解之ARP动态与静态条目的生命周期

    ARP协议详解之ARP动态与静态条目的生命周期 ARP动态条目的生命周期 动态条目随时间推移自动添加和删除. q  每个动态ARP缓存条目默认的生命周期是两分钟.当超过两分钟,该条目会被删掉.所以,生 ...

  6. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  7. HTTP协议详解 转自小坦克

    HTTP协议详解 转自小坦克 -- 有些文章是引用别人的,为了方便我以后或不再备注;引用目的是因为直接网摘里面的地址经常被重置,找不到原来的文章 当今web程序的开发技术真是百家争鸣,ASP.NET, ...

  8. nbns协议_网络协议详解1 - NBNS

    NetBIOS 简介 NetBIOS,Network Basic Input/Output System的缩写,一般指用于局域网通信的一套API,相关RFC文档包括 RFC 1001, RFC 100 ...

  9. 转:SSL 握手协议详解

    SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...

  10. 【HTTP协议】超详细的HTTP协议详解

    基本介绍 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/ ...

最新文章

  1. zookeeper学习记录
  2. HTTP访问控制(CORS)
  3. 天池 在线编程 区间合并(字符串)
  4. EasyExcel 导出时 Converter转换器 注入 ExcelContentProperty 为null
  5. 安装PostgreSQL单机版
  6. CMS系统模板引擎设计(5):Label应用初探
  7. 字节回应阿里涉侵犯男员工曾面试并通过一面;HarmonyOS 2.0用户数升至5000万|极客头条...
  8. 2016计算机应用论基础,2016-2017-2计算机应用基础理论复习题.docx
  9. SqlServer存储过程调用接口
  10. java 四舍五入保留小数
  11. iphone圆点怎么弄出来_iPhone 秒变“坦克大战”游戏机,666!
  12. 博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
  13. JanusGraph对于Gremlin查询语言的介绍
  14. usb无线网卡android,台式机轻松上网:教你制作USB无线网卡
  15. 云服务器项目乱码,云服务器Ubuntu系统下中文乱码问题解决方案
  16. Android新浪微博登录
  17. 将一个excel多个文件合并成一个文件的多个sheet
  18. win8宽带连接服务器未响应,关于Win8系统连接宽带错误的解决方法介绍
  19. c语言如何实现一只蜗牛爬的循环,[工程科技]第五章 循环结构程序设计c语言程序设计.ppt...
  20. 用Java写一款小游戏

热门文章

  1. Protues8.6仿真STM32出现错误-VDDA和VSSA的问题解决办法
  2. 关系代数 元组关系演算
  3. STM32状态机编程----什么是状态机?
  4. 南方cass提取坐标生成表格_如何利用EXCEL随机生成测量点坐标导入南方CASS中计算土方量...
  5. java oracle 中文列_java oracle中文乱码怎么办
  6. WOW装备大全(07.11.30)
  7. 【SSM】SSM框架介绍
  8. Excel 2010画箱线图 Box-Plot
  9. 基于FCM算法的聚类算法
  10. MBR分区表格式与GPT分区表格式简介