socks5协议详细说明

本文详细介绍了SOCKS协议,特别是SOCKS5,包括其在OSI模型中的位置、主要作用、协议流程。SOCKS5作为代理协议,用于在客户端和服务器间安全地交换网络数据,尤其在内部网络访问控制中起到关键作用。协议流程涉及TCP连接建立、协商、认证及请求阶段,确保数据传输的安全和效率。
摘要由CSDN通过智能技术生成

一、socks协议定义

  1. SOCKS is an Internet protocol that exchanges network packets between a client and server through a proxy server.
  2. socks是一种互联网协议,它通过一个代理服务器在客户端和服务端之间交换网络数据。简单来说,它就是一种代理协议,扮演一个中间人的角色,在客户端和目标主机之间转发数据.

replace/assets/images/socks5/socks5_01.jpeg

  1. socks协议位于OSI模型中的第五层,即会话层(Session Layer)

二、socks协议作用

  1. 一提到代理,肯定会想到翻墙,而socks5作为一种代理协议,肯定也能用来翻墙嘛。不过遗憾的是,虽然它是代理协议,然而并不能用于翻墙。因为它的数据都是明文传输,会被墙轻易阻断.
  2. 互联网早期,企业内部网络为了保证安全性,都是置于防火墙之后,这样带来的副作用就是访问内部资源会变得很麻烦,socks协议就是为了解决这个问题.
  3. socks相当于在防火墙撕了一道口子,让合法的用户可以通过这个口子连接到内部。

三、socks5协议定义

  1. socks5就是socks协议的第五个版本,作为socks4的一个延伸,在socks4的基础上新增UDP转发认证功能

四、 socks协议流程

  1. 首先分析下浏览器的请求过程

  2. 1. 建立TCP连接
    浏览器向百度所在服务器建立TCP连接,经过3次握手后成功双方建立一条连接,用于数据传输
    2. 发起Http请求
    TCP连接建立成功后,浏览器通过建立的连接发送HTTP请求
    GET /
    Host www.baidu.com
    3. 服务器响应浏览器一段HTML内容,浏览器收到后对页面进行渲染
    
  3. 如果给浏览器设置socks5协议代理,端口1080,流程如下

  4. 1. 浏览器和socks5代理建立TCP连接
    和上面不同的时,浏览器和服务器之间多了一个中间人,即socks5,因此浏览器需要跟socks5服务器建立一条连接。
    
    2. socks5协商阶段
    在浏览器正式向socks5服务器发起请求之前,双方需要协商,包括协议版本,支持的认证方式等,双方需要协商成功才能进行下一步。
    
    3. socks5请求阶段
    协商成功后,浏览器向socks5代理发起一个请求。请求的内容包括,它要访问的服务器域名或ip,端口等信息
    
    4.socks5 relay阶段
    scoks5收到浏览器请求后,解析请求内容,然后向目标服务器建立TCP连接。
    
    5.数据传输阶段
    以上步骤,我们成功建立了浏览器 –> socks5,socks5–>目标服务器之间的连接。这个阶段浏览器开始把数据传输给scoks5代理,socks5代理把数据转发到目标服务器。
    

五、协议细节

  1. 我们把请求过程总结为3个阶段,分别为:握手阶段、请求阶段,Relay阶段

  2. 1. 握手阶段
    握手阶段包含协商和子协商阶段,我们把它拆分为两个分别讨论
    
    2. 协商阶段
    在这个阶段,客户端向socks5发起请求,内容如下:
    +----+----------+----------+
    |VER | NMETHODS | METHODS  |
    +----+----------+----------+
    | 1  |    1     | 1 to 255 |
    +----+----------+----------+
    
    #上方的数字表示字节数,下面的表格同理,不再赘述
    VER: 协议版本,socks5为0x05
    NMETHODS: 支持认证的方法数量
    METHODS: 对应NMETHODS,NMETHODS的值为多少,METHODS就有多少个字节。RFC预定义了一些值的含义,内容如下:
    X’00’ NO AUTHENTICATION REQUIRED
    X’01’ GSSAPI
    X’02’ USERNAME/PASSWORD
    X’03’ to X’7F’ IANA ASSIGNED
    X’80’ to X’FE’ RESERVED FOR PRIVATE METHODS
    X’FF’ NO ACCEPTABLE METHODS
    
    socks5服务器需要选中一个METHOD返回给客户端,格式如下:
    +----+--------+
    |VER | METHOD |
    +----+--------+
    | 1  |   1    |
    +----+--------+
    当客户端收到0x00时,会跳过认证阶段直接进入请求阶段; 当收到0xFF时,直接断开连接。其他的值进入到对应的认证阶段。
    
    3. 认证阶段
    认证阶段作为协商的一个子流程,它不是必须的。socks5服务器可以决定是否需要认证,如果不需要认证,那么认证阶段会被直接略过。
    如果需要认证,客户端向socks5服务器发起一个认证请求,这里以0x02的认证方式举例:
    
    +----+------+----------+------+----------+
    |VER | ULEN |  UNAME   | PLEN |  PASSWD  |
    +----+------+----------+------+----------+
    | 1  |  1   | 1 to 255 |  1   | 1 to 255 |
    +----+------+----------+------+----------+
    VER: 版本,通常为0x01
    ULEN: 用户名长度
    UNAME: 对应用户名的字节数据
    PLEN: 密码长度
    PASSWD: 密码对应的数据
    
    socks5服务器收到客户端的认证请求后,解析内容,验证信息是否合法,然后给客户端响应结果。响应格式如下:
    +----+--------+
    |VER | STATUS |
    +----+--------+
    | 1  |   1    |
    +----+--------+
    STATUS字段如果为0x00表示认证成功,其他的值为认证失败。当客户端收到认证失败的响应后,它将会断开连接。
    
    3. 请求阶段
    顺利通过协商阶段后,客户端向socks5服务器发起请求细节,格式如下:
    
    +----+-----+-------+------+----------+----------+
    |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  | X'00' |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
    VER 版本号,socks5的值为0x05
    CMD
    0x01表示CONNECT请求
    0x02表示BIND请求
    0x03表示UDP转发
    RSV 保留字段,值为0x00
    ATYP 目标地址类型,DST.ADDR的数据对应这个字段的类型。
    0x01表示IPv4地址,DST.ADDR为4个字节
    0x03表示域名,DST.ADDR是一个可变长度的域名
    0x04表示IPv6地址,DST.ADDR为16个字节长度
    DST.ADDR 一个可变长度的值
    DST.PORT 目标端口,固定2个字节
    上面的值中,DST.ADDR是一个变长的数据,它的数据长度根据ATYP的类型决定。我们可以通过掐头去尾解析出这部分数据。
    ocks5服务器收到客户端的请求后,需要返回一个响应,结构如下
    
    +----+-----+-------+------+----------+----------+
    |VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  | X'00' |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
    VER socks版本,这里为0x05
    REP Relay field,内容取值如下
    X’00’ succeeded
    X’01’ general SOCKS server failure
    X’02’ connection not allowed by ruleset
    X’03’ Network unreachable
    X’04’ Host unreachable
    X’05’ Connection refused
    X’06’ TTL expired
    X’07’ Command not supported
    X’08’ Address type not supported
    X’09’ to X’FF’ unassigned
    RSV 保留字段
    ATYPE 同请求的ATYPE
    BND.ADDR 服务绑定的地址
    BND.PORT 服务绑定的端口DST.PORT
    针对响应的结构中,BND.ADDR和BND.PORT值得特别关注一下,可能有朋友在这里会产生困惑,返回的地址和端口是用来做什么的呢?
    
    4. Relay阶段
    socks5服务器收到请求后,解析内容。如果是UDP请求,服务器直接转发; 如果是TCP请求,服务器向目标服务器建立TCP连接,后续负责把客户端的所有数据转发到目标服务。
    
    
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哥(xpc)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值