认证

首先客户端向服务端发送认证信息,结构如下

+----+----------+----------+
|VER | NMETHODS | METHODS  |
+----+----------+----------+
| 1  |    1     | 1 to 255 |
+----+----------+----------+

1就是指长度是一个byte,因此 1 to 255 也就是 1~255个byte。

  • VER 是指协议版本,因为是 socks5,所以值是 0x05
  • NMETHODS 是指有多少个可以使用的方法,也就是客户端支持的多少种认证方法
  • METHODS 就是方法值,有多少个方法就有多少个byte,可以是如下值:
    • 0x00 NO AUTHENTICATION REQUIRED 不需要认证
    • 0x01 GSSAPI 参考维基百科
    • 0x02 USERNAME/PASSWORD 用户名密码认证
    • 0x03 to 0x7f IANA ASSIGNED 一般不用。INNA保留。
    • 0x80 to 0xfe RESERVED FOR PRIVATE METHODS 保留作私有用处。
    • 0xFF NO ACCEPTABLE METHODS 不接受任何方法/没有合适的方法

举例

这个例子表明支持两种认证协议,一种是不需要认证,一种是用户口令认证+-------+----------+------------+
| VER   | NMETHODS |   METHODS  |
+-------+----------+------------+
| 0x05  |  0x02    | 0x00, 0x02 |
+-------+----------+------------+

收到Client的请求之后,Server选择一个自己也支持的认证方案,然后返回:

+----+--------+
|VER | METHOD |
+----+--------+
| 1  |   1    |
+----+--------+

如果服务端认证失败或不支持客户端提供的方法,响应的中的METHOD字段的值为0xFF,服务端关闭连接。

如果选择用户和口令的认证方式,客户端向服务端发送如下认证信息

+----+------+----------+------+----------+
|VER | ULEN |  UNAME   | PLEN |  PASSWD  |
+----+------+----------+------+----------+
| 1  |  1   | 1 to 255 |  1   | 1 to 255 |
+----+------+----------+------+----------+

这里的VER为子协议(用户口令认证协议)的版本。

  • VER的值为0x01
  • ULEN表示用户名UNAME的长度,大小为1个字节
  • UNAME为用户名,长度范围为1-255个字节,长度由ULEN指定
  • PLEN表示口令的长度,大小为一个字节
  • PASSWD为口令,长度范围为1-255,长度由PLEN指定

服务端接收客户端发过来的认证请求,并响应如下信息

+----+--------+
|VER | STATUS |
+----+--------+
| 1  |   1    |
+----+--------+
  • VER的值为0x01
  • STATUS表示认证的状态,如果服务端通过认证,STATUS为0;如果认证失败,STATUS为非0,且服务端应当关闭连接。

信息告知

客户端通过认证之后,将需要代理的信息发送给服务端

+----+-----+-------+------+----------+----------+
|VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     |
+----+-----+-------+------+----------+----------+
  • VER 还是版本,取值是 0x05
  • CMD 是指要做啥,取值如下:
    • CONNECT 0x01 连接
    • BIND 0x02 端口监听(也就是在Server上监听一个端口)
    • UDP ASSOCIATE 0x03 使用UDP
  • RSV 是保留位,值是 0x00
  • ATYP 是目标地址类型,有如下取值:
    • 0x01 IPv4
    • 0x03 域名
    • 0x04 IPv6
  • DST.ADDR 就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址
  • DST.PORT 两个字节代表端口号
CONNECT 0x01In the reply to a CONNECT, BND.PORT contains the port number that theserver assigned to connect to the target host, while BND.ADDRcontains the associated IP address.  The supplied BND.ADDR is oftendifferent from the IP address that the client uses to reach the SOCKSserver, since such servers are often multi-homed.  It is expectedthat the SOCKS server will use DST.ADDR and DST.PORT, and theclient-side source address and port in evaluating the CONNECTrequest.CMD 为 CONNECT 的响应中,BND.PORT 为(socket5)服务器分配给连接到目标主机的端口号,而 BND.ADDR 为(服务器)关联的(目标主机) IP 地址。提供的BND.ADDR通常与客户端连接的服务器地址(目标主机地址)不同,因为这类服务器(目标主机)通常存在多个地址。socket5服务器将会使用 DST.ADDR 和 DST.PORT和客户端源地址和端口以评估CONNECT请求BIND 0x02The BIND request is used in protocols which require the client toaccept connections from the server.  FTP is a well-known example,which uses the primary client-to-server connection for commands andstatus reports, but may use a server-to-client connection fortransferring data on demand (e.g. LS, GET, PUT).It is expected that the client side of an application protocol willuse the BIND request only to establish secondary connections after aprimary connection is established using CONNECT.  In is expected thata SOCKS server will use DST.ADDR and DST.PORT in evaluating the BINDrequest.Two replies are sent from the SOCKS server to the client during aBIND operation.  The first is sent after the server creates and bindsa new socket.  The BND.PORT field contains the port number that theSOCKS server assigned to listen for an incoming connection.  TheBND.ADDR field contains the associated IP address.  The client willtypically use these pieces of information to notify (via the primaryor control connection) the application server of the rendezvousaddress.  The second reply occurs only after the anticipated incomingconnection succeeds or fails.In the second reply, the BND.PORT and BND.ADDR fields contain theaddress and port number of the connecting host.UDP ASSOCIATE 0x03The UDP ASSOCIATE request is used to establish an association withinthe UDP relay process to handle UDP datagrams.  The DST.ADDR andDST.PORT fields contain the address and port that the client expectsto use to send UDP datagrams on for the association.  The server MAYuse this information to limit access to the association.  If theclient is not in possesion of the information at the time of the UDPASSOCIATE, the client MUST use a port number and address of allzeros.

服务端处理客户端发过来的信息,并返回

+----+-----+-------+------+----------+----------+
|VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     |
+----+-----+-------+------+----------+----------+
  • VER 还是版本,值是 0x05
  • REP 是状态码,取值如下:
    • 0x00 succeeded
    • 0x01 general SOCKS server failure
    • 0x02 connection not allowed by ruleset
    • 0x03 Network unreachable
    • 0x04 Host unreachable
    • 0x05 Connection refused
    • 0x06 TTL expired
    • 0x07 Command not supported
    • 0x08 Address type not supported
    • 0x09 to 0xff unassigned
  • RSV 保留位,取值为 0x00
  • ATYP 是目标地址类型,有如下取值:
    • 0x01 IPv4
    • 0x03 域名
    • 0x04 IPv6
  • BND.ADDR 就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址
  • BND.PORT 两个字节代表端口号

流量转发

设有如下三种角色:

  • client:客户端
  • proxy:socks5代理服务器
  • server:服务器

正常情况下是client和server直接通信,但是这里经过socks5代理转发:

client连接到socks5之后得到client的socket,这里写作client_socket
client将要连接的server信息告诉proxy,proxy开启一个socket和server通信,这里写做server_socket

client <–> proxy <–> server

客户端转发到服务端

recv(clientfd, buf, size)
send(serverfd, buf, size)

服务端转发到客户端

recv(serverfd, buf, size)
send(clientfd, buf, size)

参考

socks5 协议详解
RFC 1928
RFC 1929

socket 5协议详解相关推荐

  1. Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园

    Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园 Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpkin ...

  2. C#Socket开发TCP详解(二)

    文章目录 C#Socket开发TCP详解(二)--面向连接的套接字编程 简介: **面向连接的套接字** 1.建立连接 2.发送和接收消息 3.关闭连接 C#Socket开发TCP详解(二)–面向连接 ...

  3. 应用层协议:HTTP与HTTPS协议详解、二者的区别

    http协议详解 1.HTTP协议:超文本传输协议 是一种分布式.合作式.多媒体信息系统服务,面向应用层的协议.是一种通用的,不分状态的协议.是一种请求/应答协议. 1.1.HTTP/1.0和HTTP ...

  4. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  5. IoT:MQTT协议详解

    IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...

  6. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  7. 《TCP IP协议 详解》思考总结 · 三

    前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将<TCP/IP协议详解 卷一>书中TCP相关章节前面的内容做一个结束,在下一篇文章专心的去 ...

  8. Linux网络-UDP/TCP协议详解

    Linux网络-UDP/TCP协议详解 零.前言 一.UDP协议 二.TCP协议 1.应答机制 2.序号机制 3.超时重传机制 4.连接管理机制 三次握手 四次挥手 5.理解CLOSE_WAIT状态 ...

  9. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

最新文章

  1. 小白都能看懂的神经网络教程:从原理到优化如此简单
  2. LNMT部署详细步骤并实现动静分离和负载均衡
  3. ubuntu安装docker下载慢,运行hello-world超时
  4. 流行的开源数据挖掘tool
  5. n型半导体和p型半导体的区别_王煜JMCA: N, P掺杂碳负载的PtP2纳米颗粒自转化为核壳型Pt/PtP2:一种高效和稳定的ORR催化剂...
  6. Andrew NG 机器学习编程作业5 Octave
  7. 初中文化能学编程吗_网页编程课程来了,确定不来pick一下!!!|科创辅学进行时...
  8. Jboss未授权访问部署木马 利用exp
  9. 以太坊核心开发者正在制定ETH2.0合并最低技术规范
  10. oracle的.aud文件,Oracle 11g 在audit_file_dest目录下产生大量的aud文件
  11. adb服务无法开启问题解决方法
  12. 图片轮播html1001无标题,轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器...
  13. PHP 利用CURL抓取页面内容
  14. selinium如何多线程_求教个selenium+grid+testng多线程运行的问题
  15. 清华山维EPS二次开发VBS基础篇
  16. 企业集团合并财务报表
  17. 9008刷机模式写入超时刷机帮_【转】高通9008模式刷机,让小米刷机不再畏惧
  18. 中国企业如何实施5s管理体系
  19. 如何快速比对两个文件夹中的文件
  20. Unity开发Android游戏(三)虚拟摇杆之_Easy Touch 5

热门文章

  1. OpenCV4学习笔记(19)——模板匹配
  2. 个人笔记新解-Obsidian
  3. 计算机不能启动任务管理器,win10系统无法打开任务管理器怎么办
  4. What are 20 questions to detect fake data scientists?
  5. 干货 | 带你解锁AC/DC、DC/DC转换器基础
  6. 网易云动态小视频下载方法
  7. excel调整所有行高列宽
  8. windows、mac桌面录制GIF
  9. 高通开发系列 - 总目录
  10. Canvas drawImage在高清屏幕下变模糊,解决方案