谁能提供完整的 Socks5 协议中文版?

rwdx 2004-10-28 11:08:48
RT.
...全文
59107 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
stevenW 2004-10-31
  • 打赏
  • 举报
回复
mark
rwdx 2004-10-29
  • 打赏
  • 举报
回复
rwdx@163.net
谢谢 gdy119(中国制造)
老夏Max 2004-10-29
  • 打赏
  • 举报
回复
hehe
baojian88888 2004-10-29
  • 打赏
  • 举报
回复
mark
pclili 2004-10-29
  • 打赏
  • 举报
回复
好东西,收藏先!
kingzai 2004-10-28
  • 打赏
  • 举报
回复
其中:
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.ADDR和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.基于UDP客户机的程序

  一个基于UDP的客户端必须使用在BND.PORT中指出的UDP端口来发送数据报到UDP延迟服务器,而该过程是作为对UDP连接请求的回应而进行的。如果所选择的认证方法提供认证机制、完整性、和/或机密性,则数据报必须使用恰当的封装套给予封装。每一个UDP数据报携带一个UDP请求的报头(header):

  +----+------+------+----------+----------+----------+
  |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |  DATA |
  +----+----

kingzai 2004-10-28
  • 打赏
  • 举报
回复
有实现的代码:
http://www.vccode.com/file_show.php?id=2608
http://kuga.51.net/
介绍:
SOCKS 5协议详解   

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

1.介绍:

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

2.现状:

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

注意:
  除非特别提及,封装在包格式中的十进制数表示的是通讯域的长度(用八位组octect表示)。一个给定的八位组必须具有指定的值,格式X'hh'被用来表示在该域中单个八位组的值。当单词"变量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  |
  +----+-----+-------+------+----------+----------+

changlin365 2004-10-28
  • 打赏
  • 举报
回复
gz
gdy119 2004-10-28
  • 打赏
  • 举报
回复
网上有些代码(client)很乱,
前不久我为公司写了个类,总体测试还错,如果要的话
我发给你
chlchen 2004-10-28
  • 打赏
  • 举报
回复
收藏!
月吻长河 2004-10-28
  • 打赏
  • 举报
回复
还是看rfc1928比较清楚
danyueer 2004-10-28
  • 打赏
  • 举报
回复
mark,结贴了以后别忘了提FAQ~
huaboy408 2004-10-28
  • 打赏
  • 举报
回复
mark
DentistryDoctor 2004-10-28
  • 打赏
  • 举报
回复
赶紧收藏!
gdy119 2004-10-28
  • 打赏
  • 举报
回复
TCP数据字节序列:
协议版本 | Socks命令 | 保留字节 | 地址类型 | 特定地址 | 特定端口
Socks命令有3种:CONNECT (编号0x01) BIND (0x02) UDP(编号0x03)
保留字节长度1,为0x00
地址类型有3种:
0X01  该地址是IPv4地址,长4个8bit字节。
0X03  该地址包含一个完全的域名。第一个8bit字节包含了后面名称的8bit的数目,
没有中止的’\0’。
0X04 该地址是IPv6地址,长16个8bit字节。
特定地址一般对于多IP的主机有意义,如果不是或者不关心哪一个IP发起UDP数据传输,
就可以填0。0。0。0,地址类型选择0x01。比较重要的就是UDP传输将要从哪一个UDP端
口发起。一般为了避免因为硬性指定一个端口导致引起冲突,会首先生成一个UDP套接字
,用生成的套接字既定端口来作为自己传输UDP的端口,并通过此步骤告知代理服务器。
譬如临时生成一个UDP套接字,UDP选择端口2233作为传输UDP数据的本地端口,那么此报
文就为:0x05 0x03 0x00 0x00 0x00 0x00 0x00 0x08 0xb9 其中0x08 0xb9换算成10进
制就是2233。
代理服务器会根据自己的端口占用情况,给出一个有关代理服务器的端口的回复字节序
列,告诉客户可以将UDP数据发送到此地址和端口中去,以实现UDP穿透代理。返回的字
节序列为:
版本 | 代理的应答 | 保留1字节 | 地址类型 | 代理服务器地址 | 绑定的代理端口

代理的应答可以为值:
0X00 成功协商
0X01 常见的Socks故障
0x02 不允许连接
0X03 网络不可到达
0X04 主机不可到达
0X05 连接被重置
0X06 TTL 失效
0X07 命令不支持
0X08 地址类型不支持
0X09 一直到0xff都保留
代理的地址指客户端需要发给那一个IP,绑定的端口指代理将在哪一个端口上为客户接
收数据并转发出去。地址类型、地址参照上面的解释。
通过以上的TCP协商几个步骤后,现在客户端明确了自己将需要发送的UDP数据发给代理
服务器的某个IP的某个端口了。代理服务器也知道是哪一个IP发送数据报给自己,如果
接收到由于转发此UDP数据报而从远端目标主机传回的数据报,他需要根据协议将收到的
数据报返回给客户的特定端口。此特定端口就是此步骤中字节序列中绑定的代理端口
在传输UDP数据时,由于通过代理,所以需要按照一定的格式进行包装,在需要传送的数
据之前添加一个报头,具体为:
保留2字节的0 | 是否数据报分段重组标志 | 地址类型 | 将要发到代理外的目标地址
| 远端目标主机的端口 | 需要通过代理传送出去的数据
是否数据报分段重组标志为0表示该数据报文是独立的不需要重新组合,其他的表示特定
的序列号,以利于UDP报文整合。
gdy119 2004-10-28
  • 打赏
  • 举报
回复
,并且为了简单起见,采用不需要验证客户的验证方法。好了,交代了背景后,下面我
们就开始穿越代理的旅程吧。
无论是TCP还是UDP通过代理,首先要同代理取得联系。为了能够确保在第一阶段顺利确
保数据传输,协议规定客户端采用TCP方式连接联系代理服务器。
一旦客户同代理的1080端口连接上,客户首先要发送一个版本标识/方法选择的TCP报文
给代理服务器,具体格式为:
  版本号(1字节) | 可供选择的认证方法(1字节) | 方法序列(1-255个字节长度)

如果是socks4协议,版本号就是0x04,但是这里是支持UDP的Socks5,所以是字节0x05。
此说明对于后面的报文格式解释的版本部分也都适用。
Socks协议定义了0-255种通过代理的认证方法:
0x00 无验证需求
0x01 通用安全服务应用程序接口(GSSAPI)
  0x02 用户名/密码(USERNAME/PASSWORD)
  0x03 至 X'7F' IANA 分配(IANA ASSIGNED)
  0x80 至 X'FE' 私人方法保留(RESERVED FOR PRIVATE METHODS)
0xFF 无可接受方法(NO ACCEPTABLE METHODS)
显然,无论是发起Socks请求的客户端还是负责转发Socks数据的代理都不可能完全实现
所有的(起码目前还没有)方法,所以客户端需要把自己能够支持的方法列出来供代理
服务器选择。如果支持无验证,那么此报文的字节序列就为:0x05 0x01 0x00,其中的
0x01表示客户端只支持一种验证,0x00表示能够支持的方法是编号为0x00的(无验证)
的方法。如果客户端还支持用户名/密码的验证方式,那么报文就应当是:0x05 0x02 0
x00 0x02。
代理接收到客户的请求,会根据自身系统的实现返回告诉客户验证采用哪一种方法,返
回的保文格式为:
版本号 | 服务器选定的方法
如果服务器仅支持无验证的验证方法,它返回字节序列:0x05 0x00。客户端同代理的数
据报文的来回应答就是Socks协议的验证方法选择阶段。
接下来就是根据选择的方法来,验证客户身份了。虽然我们这里不需要验证,但是还是
简单讲一下0x02的用户名/口令的验证客户端发送报文格式:
0x01 | 用户名长度(1字节)| 用户名(长度根据用户名长度域指定) | 口令长度(1
字节) | 口令(长度由口令长度域指定)
不清楚为什么报文的首字节是0x01(按照惯例应当是0x05)。整个报文长度根据用户名和
口令的实际长度决定。用户名和口令都不需要以’\0’结束。服务器会根据提供的信息
进行验证,返回如下的报文字节序列映像为:
0x01 | 验证结果标志
验证结果标志可以为:0x00 验证通过,其余均表示有故障,不可以继续下一步的协议步
骤。
在通过了验证步骤之后,接下来就是确定UDP传输的端口了。这里面需要确定两个重要的
端口:1、客户端发送UDP数据的本机端口,一方面可以为发送数据指定端口,另一方面
告诉代理,如果有数据返回,就传递给该端口,构成一个UDP传输回路。2、代理想在哪
个端口接收客户发送的UDP数据报,作为对外UDP Socket的申请方,双方协商确定一个端
口后,可以持续通过此端口向外部主机发送数据,也可以通过此端口由代理接收外部主
机发回的UDP数据,再通过此端口发给UDP发送请求客户端。客户端会按照以下格式发送
gdy119 2004-10-28
  • 打赏
  • 举报
回复
1. 具体概念和编程

网络编程中,对于数据传输实时性要求较高的场合,大家都会选择UDP来作为数据传输协
议,在TCP/IP协议族中UDP协议较TCP协议需要的网络系统资源更少。然而在企业应用中
,由于网络安全原因等会导致除了特定端口以外的IP数据无法通过专用的路由或网关。
为了支持这类应用,制定了专门的支持Socks连接的socks4/socsk5协议。Socks协议允许
实现此类功能的代理软件可以允许防火墙(本文以下内容中防火墙与代理的称谓可以等同
视之)以内的客户通过防火墙实现对外部的访问,甚至可以允许等待外部的连接。对于防
火墙内部的软件客户端,仅同防火墙协商,同防火墙的特定端口取得联系,然后交换数
据,而防火墙外部的程序也直同防火墙进行数据交换,外部看不到防火墙的内部网情况
,这样起到了防火墙的监护功能,也满足了大多数通过非常用(如http ftp等)端口交
换数据的应用程序需求。防火墙内部的应用程序如何通过防火墙将UDP数据传输到防火墙
外部,并且接受外部的UDP数据报文,这就是所谓穿透Socks代理的UDP编程。
RFC1928描述了Socks协议的细节,告诉我们客户程序如何同Socks代理协商,取得透过该
协议对外传输的途径。英文的URL为:http://www.ietf.org/rfc/rfc1928.txt,中文的
翻译参考不是很贴切(但译者还是值得尊敬的),但对于E文不大好的可以将就一下:h
ttp://www.china-pub.com/computers/emook/0541/info.htm。建议先了解以上链接内容
后在阅读下文。
一般的代理软件都实现了两个版本的Socks协议—Socks4以及Socks5,其中Socks5协议支
持UDP报文的传输以及多种验证方法,该协议还考虑IP发展需要,支持Ipv6。
TCP透过代理支持两种方法:Bind以及Connection。Connection是指作为客户端,主动连
接代理外部的服务程序,在这种方式中代理将替代客户程序发起真正的对外部服务程序
的连接,并来回传输在此连接中需要交流的数据;Bind方式则用在那些需要客户机接受
到服务器连接的协议中,例如FTP协议之类的除了需要建立一个客户--服务器的连接报告
状态外,还需要建立一个服务器—客户的连接来传输实际的数据(当然要注意这里的FT
P协议通过Socks协议连接远程主机,并非通过FTP代理协议)。UDP报文传输则意味着代
理充当UDP数据传输的中间人,将防火墙内的主机对外的数据传递出去,将需要引入到防
火墙内的UDP数据报文转给防火墙特定的主机。关于TCP穿透的讨论和例子很多(给出一
个实现的例子:http://www.codeproject.com/internet/casyncproxysocket.asp ),
就不多讲了,在此着重讨论如何实现UDP数据的穿透Socks5代理。
为了测试方便我简单写了一个服务进程在代理外IP为192。168。0。250上监听UDP8100端
口,接收到一个UDP的数据报后,返回服务器上的当前时间给发送UDP报文的客户端。代
理采用Wingate,他在192。168。0。1上运行,Socks的标准端口1080来运行服务监听程序
。我的机器为192。168。0。10,你可以看到,我不能够直接联系运行时间服务的机器,
我会向代理提出我的要求,由代理进程负责UDP数据报文的转发。代理软件选择Wingate

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧