`
liujianguangaaa
  • 浏览: 237567 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论
阅读更多

笔者在实际学习中,由于在有些软件用到了socks5(如oicq,icq等),对其原理不甚了解,相信很多朋友对其也不是很了解,于是仔细研读
了一下rfc1928,觉得有必要译出来供大家参考。

1.介绍:

  防火墙的使用,有效的隔离了机构的内部网络和外部网络,这种类型的Internet架构变得越来越流行。这些防火墙系统大都充当着网络之
间的应用层网关的角色,通常提供经过控制的Telnet,FTP,和SMTP访问。为了推动全球信息的交流,更多的新的应用层协议的推出。这就有必要
提供一个总的架构使这些协议能够更明显和更安全的穿过防火墙。也就有必要在实际上为它们穿过防火墙提供一个更强的认证机制。这种需要
源于客户机-服务器联系在不同组织网络之间的实现,而这种联系需要被控制和是很大程度上被认证的。
  该协议被描述为用来提供在TCP和UDP域下为客户机-服务器应用程序便利和安全的穿过防火墙的一个架构。该协议在概念上被描述为一个介
于应用层和传输层之间的"隔离层",但是这类服务并不提供网络层网关服务,如ICMP报文的传输。

2.现状:

  SOCKS
4为基于TCP的客户机-服务器应用程序提供了一种不安全的穿越防火墙的机制,包括TELNET,FTP和当前最流行的信息发现协议如HTTP,WAIS和GOP
HER.
  新协议为了包括UDP扩展了SOCKS
4,为了包括对总体上更强的认证机制的支持扩展了协议架构,为了包括域名和IPv6地址的支持扩展了地址集。
  SOCKS协议执行最具代表性的是包括了在SOCKS库中利用适当的封装程序来对基于TCP的客户程序进行重编译和重链结。

注意:
  除非特别提及,封装在包格式中的十进制数表示的是通讯域的长度(用八位组octect表示)。一个给定的八位组必须具有指定的值,格式X'h
h'被用来表示在该域中单个八位组的值。当单词"变量Variable"被使用时,它指出了通讯域拥有一个可变长度,这个可变长度要么由一个联合
的(一个或两个八位组)长度域定义,要么由一个数据类型域所定义。

3.基于TCP客户机的程序

  当一台基于TCP的客户机希望和目标主机建立连接时,而这台目标主机只有经过防火墙才能到达(这种情况?一直持续到?它被执行时),它
就必须在SOCKS服务器端的适当的SOCKS端口打开一个TCP连结。SOCKS服务按常例来说定位于TCP端口1080。如果连接请求成功,客户机为即将使
用的认证方式进行一种协商,对所选的方式进行认证,然后发送一个转发请求。SOCKS服务器对该请求进行评估,并且决定是否建立所请求转发
的连接。
  客户机连接到服务器,发送一个版本标识/方法选择报文:

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

  VER(版本)在这个协议版本中被设置为X'05'。NMETHODS(方法选择)中包含在METHODS(方法)中出现的方法标识八位组的数目。
  服务器从METHODS给出的方法中选出一种,发送一个METHOD selection(方法选择)报文:

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

  如果所选择的METHOD的值是X'FF',则客户机所列出的方法是没有可以被接受的,客户机就必须关闭连接。

当前被定义的METHOD的值有:
  >> X'00' 无验证需求
  >> X'01' 通用安全服务应用程序接口(GSSAPI)
  >> X'02' 用户名/密码(USERNAME/PASSWORD)
  >> X'03' 至 X'7F' IANA 分配(IANA ASSIGNED)
  >> X'80' 至 X'FE' 私人方法保留(RESERVED FOR PRIVATE METHODS)
  >> X'FF' 无可接受方法(NO ACCEPTABLE METHODS)
***IANA是负责全球INTERNET上的IP地址进行编号分配的机构(译者著)***
  于是客户机和服务器进入方法细节的子商议。方法选择子商议另外描述于独立的文档中。
  欲得到该协议新的METHOD支持的开发者可以和IANA联系以求得到METHOD号。已分配号码的文档需要参考METHOD号码的当前列表和它们的通
讯协议。
  如果想顺利的执行则必须支持GSSAPI和支持用户名/密码(USERNAME/PASSWORD)认证方法。

4.需求

  一旦方法选择子商议结束,客户机就发送请求细节。如果商议方法包括了完整性检查的目的和/或机密性封装,则请求必然被封在方法选择
的封装中。

SOCKS请求如下表所示:

  +----+-----+-------+------+----------+----------+
  |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
  +----+-----+-------+------+----------+----------+
  | 1 |  1 | X'00' |  1 | Variable |   2  |
  +----+-----+-------+------+----------+----------+

其中:
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

5.地址

  在地址域(DST.ADDR,BND.ADDR)中,ATYP域详细说明了包含在该域内部的地址类型:
    o X'01'

  该地址是IPv4地址,长4个八位组。
    o X'03'

  该地址包含一个完全的域名。第一个八位组包含了后面名称的八位组的数目,没有中止的空八位组。
    o X'04'

  该地址是IPv6地址,长16个八位组。

6.回应

  到SOCKS服务器的连接一经建立,客户机即发送SOCKS请求信息,并且完成认证商议。服务器评估请求,返回一个回应如下表所示:


  +----+-----+-------+------+----------+----------+
  |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
  +----+-----+-------+------+----------+----------+
  | 1 | 1 | X'00' | 1  | Variable |   2  |
  +----+-----+-------+------+----------+----------+

其中:

o VER protocol version: X'05'
o REP Reply field:
  o X'00' succeeded
  o X'01' general SOCKS server failure
  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 expired
  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
标志RESERVED(RSV)的地方必须设置为X'00'。

  如果被选中的方法包括有认证目的封装,完整性和/或机密性的检查,则回应就被封装在方法选择的封装套中。

CONNECT

  在CONNECT的回应中,BND.PORT包括了服务器分配的连接到目标主机的端口号,同时BND.ADDR包含了关联的IP地址。此处所提供的BND.ADDR
通常情况不同于客户机连接到SOCKS服务器所用的IP地址,因为这些服务器提供的经常都是多址的(muti-homed)。都期望SOCKS主机能使用DST.A
DDR和DST.PORT,连接请求评估中的客户端源地址和端口。

BIND

  BIND请求被用在那些需要客户机接受到服务器连接的协议中。FTP就是一个众所周知的例子,它通过使用命令和状态报告建立最基本的客户
机-服务器连接,按照需要使用服务器-客户端连接来传输数据。(例如:ls,get,put)
都期望在使用应用协议的客户端在使用CONNECT建立首次连接之后仅仅使用BIND请求建立第二次连接。都期望SOCKS主机在评估BIND请求时能够
使用DST.ADDR和DST.PORT。
  有两次应答都是在BIND操作期间从SOCKS服务器发送到客户端的。第一次是发送在服务器创建和绑定一个新的socket之后。BIND.PORT域包
含了SOCKS主机分配和侦听一个接入连接的端口号。BND.ADDR域包含了关联的IP地址。  客户端具有代表性的是使用这些信息来通报应用程序
连接到指定地址的服务器。第二次应答只是发生在预期的接入连接成功或者失败之后。在第二次应答中,BND.PORT和BND.ADDR域包含了欲连接
主机的地址和端口号。

UDP ASSOCIATE(连接?)

  UDP
连接请求用来建立一个在UDP延迟过程中操作UDP数据报的连接。DST.ADDR和DST.PORT域包含了客户机期望在这个连接上用来发送UDP数据报的地
址和端口。服务器可以利用该信息来限制至这个连接的访问。如果客户端在UDP连接时不持有信息,则客户端必须使用一个全零的端口号和地址

  当一个含有UDP连接请求到达的TCP连接中断时,UDP连接中断。

  在UDP连接请求的回应中,BND.PORT和BND.ADDR域指明了客户端需要被发送UDP请求消息的端口号/地址。

回应过程

  当一个回应(REP值非X'00')指明失败时,SOCKS主机必须在发送后马上中断该TCP连接。该过程时间必须为在侦测到引起失败的原因后不超
过10秒。
  如果回应代码(REP值为X'00')时,则标志成功,请求或是BIND或是CONNECT,客户机现在就可以传送数据了。如果所选择的认证方法支持完
整性、认证机制和/或机密性的封装,则数据被方法选择封装包来进行封装。类似,当数据从客户机到达SOCKS主机时,主机必须使用恰当的认
证方法来封装数据。

7.  Procedure for UDP-based clients

   A UDP-based client MUST send its datagrams to the UDP relay server at
   the UDP port indicated by BND.PORT in the reply to the UDP ASSOCIATE
   request.  If the selected authentication method provides
   encapsulation for the purposes of authenticity, integrity, and/or
   confidentiality, the datagram MUST be encapsulated using the
   appropriate encapsulation.  Each UDP datagram carries a UDP request
   header with it:

      +----+------+------+----------+----------+----------+
      |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |
      +----+------+------+----------+----------+----------+
      | 2  |  1   |  1   | Variable |    2     | Variable |
      +----+------+------+----------+----------+----------+

     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

   When a UDP relay server decides to relay a UDP datagram, it does so
   silently, without any notification to the requesting client.
   Similarly, it will drop datagrams it cannot or will not relay.  When
   a UDP relay server receives a reply datagram from a remote host, it
   MUST encapsulate that datagram using the above UDP request header,
   and any authentication-method-dependent encapsulation.

   The UDP relay server MUST acquire from the SOCKS server the expected
   IP address of the client that will send datagrams to the BND.PORT
   given in the reply to UDP ASSOCIATE.  It MUST drop any datagrams
   arriving from any source IP address other than the one recorded for
   the particular association.

   The FRAG field indicates whether or not this datagram is one of a
   number of fragments.  If implemented, the high-order bit indicates
   end-of-fragment sequence, while a value of X'00' indicates that this
   datagram is standalone.  Values between 1 and 127 indicate the
   fragment position within a fragment sequence.  Each receiver will
   have a REASSEMBLY QUEUE and a REASSEMBLY TIMER associated with these
   fragments.  The reassembly queue must be reinitialized and the
   associated fragments abandoned whenever the REASSEMBLY TIMER expires,
   or a new datagram arrives carrying a FRAG field whose value is less
   than the highest FRAG value processed for this fragment sequence.
   The reassembly timer MUST be no less than 5 seconds.  It is
   recommended that fragmentation be avoided by applications wherever
   possible.

   Implementation of fragmentation is optional; an implementation that
   does not support fragmentation MUST drop any datagram whose FRAG
   field is other than X'00'.

   The programming interface for a SOCKS-aware UDP MUST report an
   available buffer space for UDP datagrams that is smaller than the
   actual space provided by the operating system:

          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

   This document describes a protocol for the application-layer
   traversal of IP network firewalls.  The security of such traversal is
   highly dependent on the particular authentication and encapsulation
   methods provided in a particular implementation, and selected during
   negotiation between SOCKS client and SOCKS server.

   Careful consideration should be given by the administrator to the
   selection of authentication methods.

9.  References

   [1] Koblas, D., "SOCKS", Proceedings: 1992 Usenix Security Symposium.

Author's Address

       Marcus Leech
       Bell-Northern Research Ltd
       P.O. Box 3511, Stn. C,
       Ottawa, ON
       CANADA K1Y 4H7

       Phone: (613) 763-9145
       EMail: mleech@bnr.ca

分享到:
评论

相关推荐

    SOCK5协议的代理服务器

    ### SOCKS5协议详解 1. **协议结构**:SOCKS5协议分为两个阶段,即握手阶段和数据传输阶段。握手阶段用于建立连接,包括客户端请求、服务器响应和身份验证;数据传输阶段则进行实际的数据交换。 2. **身份验证**:...

    Socks5.rar_socks5_socks5编程

    Socks5是Socks协议的第五个版本,相比之前的版本,它增加了身份验证机制和对TCP、UDP协议的支持,提高了安全性与灵活性。Socks5协议的基本工作流程包括以下几个步骤: 1. **连接建立**:客户端首先与Socks5服务器...

    socks5-v1.0r11.rar

    【袜子协议(Socks5)详解】 Socks5是一种网络通信协议,全称为“SOCKet Secure Version 5”,它允许应用程序通过代理服务器与Internet上的任意其他服务器进行通信。Socks5协议提供了通用的网络代理服务,适用于TCP...

    sock5 代理服务器 源码

    其中,SOCKS5是该协议的最新版本,支持TCP和UDP协议,并提供了身份验证和数据加密等功能。 本篇将详细介绍SOCKS5代理服务器的源码,帮助你理解其工作原理和实现方法。 1. **SOCKS5协议流程** - **连接建立**:...

    socket5 服务器代理 tcp udp实现 vc++

    Socket5服务器代理是一种网络通信协议,它允许客户端通过代理服务器与目标服务器进行TCP或UDP通信。在本资源中,我们讨论的是使用C++语言实现的Socket5代理服务器,这对于理解和学习网络编程,尤其是代理服务器技术...

    Socks Proxy 源代码

    其中,Socks Proxy(SOCKS协议)是一种广泛应用的代理协议,支持多种网络协议,包括TCP和UDP。本文将深入探讨C#环境下实现Socks Proxy的相关知识。 Socks Proxy协议分为多个版本,主要为Socks4、Socks4a和Socks5。...

    易语言-socks5代理简易服务器

    《易语言-Socks5代理简易服务器详解》 在IT领域,网络通信是不可或缺的一部分,而代理服务器作为一种网络通信工具,其重要性不言而喻。本文将深入探讨一个基于易语言实现的Socks5代理简易服务器,以及其中涉及到的...

    SOCK-HTTP代理协议解析

    #### 二、SOCKS代理详解 SOCKS代理是一种通用的网络代理协议,支持多种网络层协议如TCP、UDP等,并且能够处理不同类型的网络请求。目前最新的版本为SOCKS5,相比之前的SOCKS4版本增加了更强的安全性和灵活性。 ###...

    vc++编写的基于socket5的代理服务器源代码

    "vc++编写的基于socket5的代理服务器源代码" 指的是一项使用Microsoft Visual C++(vc++)编程语言开发的软件项目,该项目实现了基于Socket5协议的代理服务器功能。Socket5是一种通用的代理协议,允许客户端通过...

    TCP-IP详解全三卷\TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议.rar

    《TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议》是网络通信领域的经典之作,深入解析了TCP/IP协议族中的关键协议和技术。本卷内容涵盖广泛,包括TCP事务协议、HTTP超文本传输协议、NNTP新闻传输协议以及...

    PyPI 官网下载 | easysocks5-0.0.4.tar.gz

    《PyPI官网下载 | easysocks5-0.0.4.tar.gz——Python中的Socks5代理库详解》 在Python编程中,我们经常会遇到需要处理网络请求的情况,而网络请求有时需要通过代理服务器,特别是在处理跨国或者特殊网络环境下的...

    sock5 udp 透传 总结

    **sock5 UDP 透传技术详解** 在网络安全和网络编程领域,sock5协议因其支持多种认证方式和数据传输协议(包括TCP和UDP)而被广泛使用。本文将深入探讨如何利用sock5实现UDP数据的透传,这对于需要绕过网络限制、...

    网络抓包、错误分析工具SockMon5,free

    《网络抓包与错误分析工具SockMon5详解》 网络抓包和错误分析是网络调试过程中不可或缺的环节,它们能够帮助我们深入理解网络通信过程,定位并解决各种网络问题。在此,我们将详细介绍一款名为SockMon5的专业工具,...

    C++网络编程实例四

    (8)代理服务器编程实例 Socks 5协议编程【\chap8\Socks5】 HTTP代理服务器【\chap8\HTTP代理服务】 <br>(9)高级网络通信编程实例 串口通信编程实例【\chap9\SerialPort】 网络流量监控【\chap9\...

    TDP协议 网络编程协议

    - **代理支持**: 支持穿越代理,如Socks5代理,扩大了应用场景。 #### 四、TDP协议的技术细节 **1. 协议栈设计** TDP协议栈的设计借鉴了TCP协议的关键机制,包括但不限于: - **流量控制**: 采用类似TCP的滑动...

    常见协议端口号

    - **SOCKS代理协议服务器**:1080端口是SOCKS协议的标准端口。 - **FTP协议代理服务器**:21端口是FTP协议的标准端口。 - **Telnet协议代理服务器**:23端口是Telnet协议的标准端口。 #### 五、协议号与端口号的...

    delphi HOOK

    SOCKS协议有多个版本,最常见的是SOCKS4和SOCKS5,后者支持UDP和认证。 5. **数据包修改**: 动态修改SOCKS传输的数据包意味着在数据包离开客户端或到达服务器前,可以进行读取、分析甚至篡改。这在网络安全、数据...

    curl命令详解.pdf

    - `--socks4 [:port]>` 和 `--socks5 [:port]>`: 使用SOCKS4或SOCKS5代理。 - `-t/--telnet-option <OPT=val>`: 设置telnet选项。 - `-T/--upload-file <file>`: 上传文件到服务器。 - `-w/--write-out [format]`: ...

    Linux curl命令参数详解.docx

    curl --socks5 202.113.65.229:443 http://iframe.ip138.com/ic.asp | iconv -f gbk2312 代理服务器地址可以从爬虫代理上获取。 三、处理 Cookies Linux curl 命令可以接收和发送 Cookies,例如: curl -c /tmp/...

Global site tag (gtag.js) - Google Analytics