SOCKS5

SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。

官方文档:

https://www.ietf.org/rfc/rfc1928.txt

https://www.ietf.org/rfc/rfc1929.txt

(socks5 TCP认证过程)

(socks5 proxy工作图)

rfc1928

1. 简介

2. 现有做法

3. Procedure for TCP-based clients

4. Requests

5. Addressing

6. Replies

7. Procedure for UDP-based clients

8. Security Considerations

1. 简介

防火墙可以隔离内部网络与外部网络。防火墙通常充当网络之间的应用层网关,例如受控制的TELNET,FTP和SMTP访问。随着更复杂的应用层协议的出现,需要为这些协议提供通用框架以透明且安全地穿越防火墙。

各组织的网络之间出现了client-server关系,需要受到控制,严格的身份验证和以细粒度方式进行强认证。

SOCKS5协议旨在为TCP和UDP中的client-server应用程序提供一个框架,以便安全地使用网络防火墙。该协议是应用层和传输层之间的“中介层”,不提供网络层服务。

2. 现有做法

SOCKS版本4协议为基于TCP的client-server应用程序(包括TELNET,FTP和流行的information-discovery协议,例如HTTP,WAIS和GOPHER)提供了不安全的防火墙穿越。该新协议将SOCKS版本4模型扩展为包括UDP,并扩展了框架以包含针对通用强身份验证方案的规定,并将寻址方案扩展为包含domain-name and V6 IP addresses。(5版比4版多了一个验证功能和udp代理的功能。)SOCKS协议的实现通常涉及重新编译或重新链接基于TCP的客户端应用程序以使用SOCKS库。

注意:

默认出现在数据包格式图中的十进制数字表示相应字段的长度(以字节(octets)为单位1octets=8bit)。如果给定的字节必须采用特定值,X'hh'表示该字段中单个字节的值。“ Variable”表示相应的字段具有可变的长度,该长度由关联的(1或2个字节)长度字段或数据类型字段定义。

3. Procedure for TCP-based clients

当TCP-based clients希望建立到只能通过防火墙才能访问的对象的连接时,它必须打开与SOCKS server上相应SOCKS端口的TCP连接。SOCKS服务通常位于TCP端口1080上。如果连接请求成功,则client将为要使用的身份验证方法进行协商,并使用所选方法进行身份验证,然后发送中继请求(relay request)。SOCKS server评估请求,然后建立适当的连接或拒绝它。

client连接到server,并发送版本标识符/方法选择(version identifier/method selection)消息:

VER字段设置为X'05'表示这是socks的第五版协议。

NMETHODS字段表示METHODS字段长度。

服务器从“METHODS”中给出的方法之一中进行选择,并发送“METHODS”选择消息:

如果所选方法是X'FF',则客户端列出的所有方法都不可接受,并且客户端必须关闭连接。

当前为METHOD定义的值是:

o X'00' NO AUTHENTICATION REQUIRED

o X'01' GSSAPI

o X'02' USERNAME/PASSWORD

o X'03' to X'7F' IANA ASSIGNED

o X'80' to X'FE' RESERVED FOR PRIVATE METHODS

o X'FF' NO ACCEPTABLE METHODS

客户端和服务器然后输入特定于方法的子协商(method-specific sub-negotiation)(method-dependent sub-negotiations 描述在单独的备注中)。

为此协议提供新的METHOD支持的开发人员应与IANA联系以获取METHOD编号。有关方法编号及其相应协议的最新列表,请参考ASSIGNED NUMBERS文档。

兼容的实现必须支持GSSAPI(通用安全服务应用程序接口(GSSAPI) 是为了让程序能够访问安全服务的一个应用程序接口。),并且应该支持USERNAME / PASSWORD身份验证方法。

4. Requests

与方法有关的子协商(method-dependent subnegotiation)完成后,客户端将发送请求详细信息。如果出于完整性检查和/或机密性的目的(integrity checking and/or confidentiality),协商的方法包括封装,则这些请求必须封装在方法相关的封装中(method-dependent encapsulation)。

SOCKS请求的格式如下:

o VER protocol version: X'05'

o CMD

o CONNECT X'01'

o BIND X'02'

o UDP ASSOCIATE X'03'

o RSV RESERVED保留字段

o ATYP address type of following address后面的地址类型

o IP V4 address: X'01'

o DOMAINNAME: X'03'

o IP V6 address: X'04'

o DST.ADDR desired destination address目的地址

o DST.PORT desired destination port in network octet order以网络字节顺序出现的端口号

SOCKS服务器通常将根据源地址和目标地址请求分析,并根据请求类型返回一个或多个应答。

5. Addressing

在地址字段(DST.ADDR,BND.ADDR)中,ATYP字段指定该字段中包含的地址类型:

o X'01' IPV4地址,长度为4个字节

o X'03' 基于域名的地址,地址字段中的第一字节是该域名的长度,没有结尾的NUL字节。

o X'04' IPV6地址,长度为16个字节

6. Replies

客户端与SOCKS服务器建立连接并完成身份验证协商后,客户端便立即发送SOCKS请求信息。服务器分析请求,并返回如下形式的回复:

o VER protocol version: X'05'

o REP Reply field:

o X'00' succeeded

o X'01' general SOCKS server failure普通的SOCKS服务器请求失败

o X'02' connection not allowed by ruleset现有的规则不允许的连接

o X'03' Network unreachable 网络不可达

o X'04' Host unreachable主机不可达

o X'05' Connection refused连接被拒

o X'06' TTL expiredTTL超时

o X'07' Command not supported不支持的命令

o X'08' Address type not supported不支持的地址类型

o X'09' to X'FF' unassigned未定义

o RSV RESERVED保留字段

o ATYP address type of following address后面的地址类型

o IP V4 address: X'01'

o DOMAINNAME: X'03'

o IP V6 address: X'04'

o BND.ADDR server bound address服务器绑定的地址

o BND.PORT server bound port in network octet order以网络字节顺序表示的服务器绑定的段口

RSV字段必须设为X’00’。

如果选中的方法中有以完整性检查和/或安全性( authentication, integrity and/or confidentiality)为目的的封装,这些应答必须按照该方法所定义的方式进行封装。

CONNECT

在对一个CONNECT命令的应答中,BND.PORT包含了服务器分配的用来连到目标机的端口号,BND.ADDR则是相应的IP地址。由于SOCKS服务器通常有多个IP,应答中的BND.ADDR常和客户端连到SOCKS服务器的那个IP不同。

SOCKS服务器可以利用DST.ADDR和DST.PORT,以及客户端源地址和端口来对一个CONNECT请求进行分析。

BIND

BIND请求通常被用在那些要求客户端接受来自服务器的连接的协议上。FTP是一个典型的例子。它建立一个从客户端到服务器端的连接来执行命令以及接收状态的报告,而使用另一个从服务器到客户端的连接来接收传输数据的要求(如LS,GET,PUT)。

建议只有在一个应用协议的客户端在使用CONNECT命令建立主连接后才可以使用BIND命令建立第二个连接。建议SOCKS服务器使用DST.ADDR和DST.PORT来评价BIND请求。

在一个BIND请求的操作过程中,SOCKS服务器要发送两个应答给客户端。当服务器建立并绑定一个新的套接口时发送第一个应答。BND.PORT字段包 含SOCKS服务器用来监听进入的连接的端口号,BAND.ADDR字段包含了对应的IP地址。客户端通常使用这些信息来告诉(通过主连接或控制连接)应 用服务器连接的汇接点。第二个应答仅发生在所期望到来的连接成功或失败之后。在第二个应答中,BND.PORT和BND.ADDR字段包含了连上来的主机 的IP地址和端口号。

UDP ASSOCIATE

UDP ASSOCIATE请求通常是要求建立一个UDP转发进程来控制到来的UDP数据报。DST.ADDR和DST.PORT 字段包含客户端所希望的用来发送UDP数据报的IP地址和端口号。服务器可以使用这个信息来限制进入的连接。如果客户端在发送这个请求时没有地址和端口信 息,客户端必须用全0来填充。

当与UDP相应的TCP连接中断时,该UDP连接也必须中断。

应答UDP ASSOCIATE请求时,BND.PORT 和BND.ADDR字段指明了客户发送UDP消息至服务器的端口和地址。

Reply Processing

当一个应答(REP值不等于00)指明出错时,SOCKS服务器必须在发送完应答消息后一小段时间内终止TCP连接。这段时间应该在发现错误后少于10秒。

如果一个应答(REP值等于00)指明成功,并且请求是一个BIND或CONNECT时,客户端就可以开始发送数据了。如果协商的认证方法中有以完整性、 认证和/或安全性为目的的封装,这些请求必须按照该方法所定义的方式进行封装。类似的,当以客户机为目的地的数据到达SOCKS服务器时,SOCKS服务 器必须用正在使用的方法对这些数据进行封装。

(socks5 udp认证)

7. Procedure for UDP-based clients

在UDP ASSOCIATE应答中由BND.PORT指明了服务器所使用的UDP端口,一个基于UDP协议的客户必须发送数据报至UDP转发服务器的该端口上。如 果协商的认证方法中有以完整性、认证和/或安全性为目的的封装,这些数据报必须按照该方法所定义的方式进行封装。每个UDP数据报都有一个UDP请求头在其首部:

The fields in the UDP request header are:

o RSV Reserved X'0000'

o FRAG Current fragment number当前的分段号

o ATYP address type of following addresses:后面的地址类型

o IP V4 address: X'01'

o DOMAINNAME: X'03'

o IP V6 address: X'04'

o DST.ADDR desired destination address目的地址

o DST.PORT desired destination port以网络字节顺序出现的端口号

o DATA user data用户数据

当一个UDP转发服务器转发一个UDP数据报时,不会发送任何通知给客户端;同样,它也将丢弃任何它不能发至远端主机的数据报。当UDP转发服务器从远端服务器收到一个应答的数据报时,必须加上上述UDP请求头,并对数据报进行封装。

UDP转发服务器必须从SOCKS服务器得到期望的客户端IP地址,并将数据报发送到UDP ASSOCIATE应答中给定的端口号。如果数据报从任何IP地址到来,而该IP地址与该特定连接中指定的IP地址不同,那么该数据报会被丢弃。

FRAG字段指明数据报是否是一些分片中的一片。如果SOCKS服务器要实现这个功能,X’00’指明数据报是独立的;其他则越大越是数据报的尾端。介于 1到127之间的值说明了该分片在分片序列里的位置。每个接收者都为这些分片提供一个重组队列和一个重组的计时器。这个重组队列必须在重组计时器超时后重 新初始化,并丢弃相应的数据报。或者当一个新到达的数据报有一个比当前在处理的数据报序列中最大的FRAG值要小时,也必须重新初始化从组队列。重组计时 器必须小于5秒。只要有可能,应用程序最好不要使用分片。

分片的实现是可选的;如果某实现不支持分片,所有FRAG字段不为0的数据报都必须被丢弃。

一个SOCKS的UDP编程界面必须报告当前可用UDP数据报缓存空间小于操作系统提供的实际空间。

o if ATYP is X'01' - 10+method_dependent octets smaller

o if ATYP is X'03' - 262+method_dependent octets smaller

o if ATYP is X'04' - 20+method_dependent octets smaller

8. Security Considerations

这篇文档描述了一个用来穿过IP网络防火墙的应用层协议。这种传输的安全性部分依赖于在SOCKS客户端与SOCKS服务器之间经协商所选定的特殊的认证和封装方式。系统管理员需要对用户认证方式的选择进行仔细考虑。

rfc1929

1.简介

2. Initial negotiation

3. Security Considerations

1.简介

SOCKS版本5的协议规范指定了在初始socks连接设置中使用任意身份验证协议的通用框架。本文档介绍了其中一种协议,因为它适合SOCKS版本5身份验证“子协商”。

2. Initial negotiation

一旦SOCKS V5服务器启动,并且客户端选择了用户名/密码验证协议,则用户名/密码子协商开始。首先从客户端产生一个用户名/密码请求:

VER字段包含子协商的当前版本,即X'01'。

ULEN字段包含后面的UNAME字段的长度。

UNAME字段包含源操作系统已知的用户名。

PLEN字段包含后面的PASSWD字段的长度。

PASSWD字段包含与给定UNAME的密码关联。

服务器验证提供的UNAME和PASSWD,并发送以下响应:

VER:鉴定协议版本,其中鉴定状态 0x00 表示成功,0x01 表示失败。

STATUS:鉴定状态

X'00'的状态字段指示成功。如果服务器返回“失败”(除X'00'以外的状态值)状态,则必须关闭连接。

3. Security Considerations

本文档介绍了为SOCKS协议提供身份验证服务的子协商。 由于请求以明文形式携带密码,因此在可能进行“嗅探”的环境中,不建议进行此子协商。

本文分享自微信公众号 - 包罗万想(An-mind),作者:安包

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RL08 Uncertainty & Bayesian Networks

    Learningunder uncertainly is where an agent decides what to do when it does not ...

    安包
  • RL12 Multi-agent systems

    代理是能够代表其用户或所有者采取独立行动的计算机系统。智能代理应具有以下主要属性:–反应性–积极主动–社交能力

    安包
  • GCAC61 13.8 Certificates and the public-key infrastructure

    13.8 Certificates and the public-key infrastructure(PKI)证书和公钥基础设施

    安包
  • oracle中如何删除重复数据

            我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?         重复的数据可能有这样...

    源哥
  • 网站渗透测试安全检测登录认证分析

    圣诞节很快就要到了,对渗透测试的热情仍然有增无减。我们SINE安全在此为用户认证登录安全制定一个全面的检测方法和要点Json web token (JWT), ...

    网站安全专家
  • 网站安全渗透测试检测认证登录分析

    圣诞节很快就要到了,对渗透测试的热情仍然有增无减。我们SINE安全在此为用户认证登录安全制定一个全面的检测方法和要点Json web token (JWT), ...

    技术分享达人
  • spark save parquet in impala dir not support add columns

    1.问题: 项目中使用 spark save parquet 到 impala( impala 为分区表 ) 的目录下面,然后在 impala 中添加字段,报...

    shengjk1
  • 使用腾讯云开发来部署Svelte Sapper应用

    Svelte是前端框架界新秀,以小巧、响应式、无virtual Dom著称,就像React有对应的SSR框架Next.js一样,Svelte也有自己官方的SSR...

    腾讯云开发TCB
  • 再聊计算机网络基础知识总结

    如果说计算机把我们从工业时代带到了信息时代,那么计算机网络就可以说把我们带到了网络时代。随着使用计算机人数的不断增加,计算机也经历了一系列的发展,从大型通用计算...

    小小许
  • Android bionic 和 其中的libc由什么组成

    The C library. Stuff like fopen(3) and kill(2).

    望天

扫码关注云+社区

领取腾讯云代金券