socks v5 协议解析
socks v5是一种用于代理的协议,就是说client用这种协议与server沟通,让server帮忙代访问remote后再将结果通过此协议返给client,所以一般是涉及到3个端,分别是client客户端、server代理端、remote请求目的地。通常因为client无法直接访问remote,有可能是由于防火墙限制,所以需要经过一个中间的server代理来访问remote。著名的shawsocks(client)简称ss就是基于这种协议的,工作于传输层之上,传输层可基于TCP或UDP。原理是这样的,ss和浏览器(可以是其他软件)运行在同一PC上,暂合称为client端,浏览器发出的数据全部转发给ss,然后由ss转发给server,server再进行转发,所以表现出来是这样的: browser ==> shawdowsocks ==> server ==> remote
,数据返回时按原路返回。需要注意的是,server不会对应用层协议进行拆分,而是只进行转发,所以remote收到的数据中仍包含client端的地址、浏览器信息等等。
本文所列的表格通常长这样的:
┌────────┬────────┬────────┐
│ field1 │ field2 │ field3 │
├────────┼────────┼────────┤
│ 1 │ 2 │ 3 │
└────────┴────────┴────────┘
其中field就是协议头的域。其下面的数字表示该域所占字节数量,而不是其表示内容;如果是"variable",表示可变的,一般在其前面会有个域能指定其长度;如果是0x00这样的十六进制则表示该域内容固定为0x00;。
协议内容 (基于TCP)
- Step 1:client to server
┌─────┬──────────┬─────────┐
│ VER │ NMETHODS │ METHODS │
├─────┼──────────┼─────────┤
│ 1 │ 1 │ 1~255 │
└─────┴──────────┴─────────┘
用途:确立连接认证方法协商,client告知server其所支持的认证方法,server可从中挑选一个。其中
ver
socks协议的版本号,常用的是socks5版本的,故可以为0x05
。
nmethods
后面的域methods有n个字节
methods
每个字节即为一个认证方法,供server挑选
- Step 2:server to client
┌──────┬──────────┐
│ VER │ METHOD │
├──────┼──────────┤
│ 1 │ 1 │
└──────┴──────────┘
用途:告知client需要使用哪种认证方法进行认证。
ver
版本,即0x05
。
method
认证方法,从Step 1中的METHODS中选一个。
- Step 3:client to server
┌──────┬──────┬────────┬───────┬───────────┬──────────┐
│ VER │ CMD │ RSV │ ATYP │ DST.ADDR │ DST.PROT │
├──────┼──────┼────────┼───────┼───────────┼──────────┤
│ 1 │ 1 │ 0x00 │ 1 │ Variable │ 2 │
└──────┴──────┴────────┴───────┴───────────┴──────────┘
用途:告知server要连接的remote相关信息。
ver
版本,即0x05
cmd
命令,可以是 1)0x01
CONNECT 2) 0x02
BIND 3) 0x03
UDP ASSOCIATE
rsv
保留,就是暂时没用的
atyp
指定紧跟的域的地址类型,可以是 1) 0x01
IPv4 2) 0x03
DOMAINNAME 3) 0x04
IPv6
dst.addr
地址
dst.prot
端口号
注:如果atyp是domainname,那么长度(以字节为单位)得写在dst.addr
的首个字节里边,否则无法知道域名长度;如果是ipv4就4字节,如果是ipv6就16字节。 cmd的3个命令在最下面讲。
- Step 4:server to client
┌──────┬──────┬────────┬───────┬───────────┬──────────┐
│ VER │ REP │ RSV │ ATYP │ BND.ADDR │ BND.PORT │
├──────┼──────┼────────┼───────┼───────────┼──────────┤
│ 1 │ 1 │ 0x00 │ 1 │ Variable │ 2 │
└──────┴──────┴────────┴───────┴───────────┴──────────┘
用途:回复client。
ver
版本,即0x05
rep
回复,可以是下面的一项:
o 0x00
succeeded
o 0x01
general SOCKS server failure
o 0x02
connection not allowed by ruleset
o 0x03
Network unreachable
o 0x04
Host unreachable
o 0x05
Connection refused
o 0x06
TTL expired
o 0x07
Command not supported
o 0x08
Address type not supported
o 0x09
to 0xFF
unassigned
rsv
保留。
atyp
跟上面讲过的一样,包括接下来的两个域。
协议内容 (基于UDP)
- client to server
┌──────┬───────┬───────┬───────────┬───────────┬──────────┐
│ RSV │ FRAG │ ATYP │ DST.ADDR │ DST.PORT │ DATA │
├──────┼───────┼───────┼───────────┼───────────┼──────────┤
│ 2 │ 1 │ 1 │ Variable │ 2 │ Variable │
└──────┴───────┴───────┴───────────┴───────────┴──────────┘
rsv
保留。
frag
当前数据包的fragment号,这是传输层的分片,要自己实现的,而不是网络层的分片。但可以选择不实现分片,直接把frag非零的数据报丢掉。
ATYP
跟上面讲过的一样,包括接下来的两个域。
data
数据。
细节详解
关于Step 1
中的METHODS字段有如下可选:
o 0x00
NO AUTHENTICATION REQUIRED(常用)
o 0x01
GSSAPI
o 0x02
USERNAME/PASSWORD(常用)
o 0x03 to 0x7F
IANA ASSIGNED
o 0x80 to 0xFE
RESERVED FOR PRIVATE METHODS
o 0xFF
NO ACCEPTABLE METHODS (常用)
注:0x01必须支持,0x02应该要支持。注意了,认证方法是其他独立的协议,比如USERNAME/PASSWORD,这与本协议无关。
关于cmd中的3个选项:
- CONNECT
In the reply to a CONNECT, BND.PORT contains the port number that the server assigned to connect to the target host, while BND.ADDR contains the associated IP address. The supplied BND.ADDR is often different from the IP address that the client uses to reach the SOCKS server, since such servers are often multi-homed. It is expected that the SOCKS server will use DST.ADDR and DST.PORT, and the client-side source address and port in evaluating the CONNECT request. - BIND
The BIND request is used in protocols which require the client to accept connections from the server. FTP is a well-known example, which uses the primary client-to-server connection for commands and status reports, but may use a server-to-client connection for transferring data on demand (e.g. LS, GET, PUT).
It is expected that the client side of an application protocol will use the BIND request only to establish secondary connections after a primary connection is established using CONNECT. In is expected that a SOCKS server will use DST.ADDR and DST.PORT in evaluating the BIND request.
Two replies are sent from the SOCKS server to the client during a BIND operation. The first is sent after the server creates and binds a new socket. The BND.PORT field contains the port number that the SOCKS server assigned to listen for an incoming connection. The BND.ADDR field contains the associated IP address. The client will typically use these pieces of information to notify (via the rimary or control connection) the application server of the rendezvous address. The second reply occurs only after the anticipated incoming connection succeeds or fails. - UDP ASSOCIATE
The UDP ASSOCIATE request is used to establish an association within the UDP relay process to handle UDP datagrams. The DST.ADDR and DST.PORT fields contain the address and port that the client expects to use to send UDP datagrams on for the association. The server MAY use this information to limit access to the association. If the client is not in possesion of the information at the time of the UDP ASSOCIATE, the client MUST use a port number and address of all zeros.
A UDP association terminates when the TCP connection that the UDP ASSOCIATE request arrived on terminates.
In the reply to a UDP ASSOCIATE request, the BND.PORT and BND.ADDR fields indicate the port number/address where the client MUST send UDP request messages to be relayed.
其他
socks v5 协议解析的更多相关文章
- SOCKS5 协议解析
代理 根据 HTTP 1.1 的定义,proxy 是: An intermediary program which acts as both a server and a client for the ...
- 调试备忘录-SWD协议解析
目录--点击可快速直达 目录 写在前面 1 SWD协议简介 2 SWD物理层协议解析 2.1 SWD通信时序分析 2.2 SWD 寄存器简介 2.2.1 DP寄存器 2.2.2 AP寄存器 ...
- ts 协议解析
pes : http://wenku.baidu.com/link?url=KjcA0qXqZ1bWVQTa8i1YOmygofldSQL7Pjj-zGRw1e_6_LFmVLo5DIWF0SNwVn ...
- [转]netty对http协议解析原理
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- twemproxyRedis协议解析探索——剖析twemproxy代码正编
这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
- B/S 架构中,网络模型的分解与协议解析
前言 如果是C/S专业毕业的或者是学过计算机网络课程的童鞋们,相信大家都知道网络模型的划分,本文首先来聊一聊目前对于B/S结构中,网络模型分解的两种方式. 没错,相信大家看到这个图片的时候就已经明白了 ...
- 详解BLE 空中包格式—兼BLE Link layer协议解析
BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...
- netty对http协议解析原理解析
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- MODBUS协议解析中常用的转换帮助类(C#)
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
随机推荐
- P5020 货币系统 (NOIP2018)
传送门 BFS解法 显然如果一个面额A可以被其他面额表示出来 那么这个面额A就没用了 且如果A不能被其他面额表示,那么A一定有用(A本身的值只有自己可以表示) 发现面额最大不超过 25000 那么设 ...
- mongodb 基础语法
参考原文:菜鸟教程 目录 一.数据库二.文档三.索引四.聚合 一.数据库 show dbs -- 查看所有数据库 use DATABASE_NAME -- 如果数据库不存在,则创建数据库,否则切换到指 ...
- 一个基于QT简单登录对话框
1. 登录对话框式样 2. QLoginDialog.h #ifndef DIALOG_H #define DIALOG_H #include <QtGui/QDialog> #inclu ...
- Socket 代码收藏
class SocketHelper { public delegate void Uplistbox(string txt); public Uplistbox u ...
- mybatis用法
转载:https://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架 ...
- python进制转换或数据格式转换
以下是部分进制转换的,都是python内置函数 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 f ...
- 查看linux系统各种参数配置的命令
查看linux系统各种参数配置的命令 last |grep shutdown //查看上次关机时间 last |grep reboot ...
- UGUI [TextArea]
- Kudu的概念术语
不多说,直接上干货! Columnar Data Store(列式数据存储) Kudu 是一个 columnar data store(列式数据存储).列式数据存储在强类型列中.由于几个原因,通过适当 ...
- pat1020. Tree Traversals (25)
1020. Tree Traversals (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...