socket5的实现--(RFC1928)Socket5协议中⽂⽂档
(RFC1928)Socket5协议中⽂⽂档
1、socket5的介绍:
利⽤⽹络防⽕墙可以将组织内部的⽹络结构从外部⽹络如INTERNET中有效地隔离,这种⽅法在许多⽹络系统中正变得流⾏起来。这种防⽕墙系统通常以应⽤层⽹关的形式⼯作在两个⽹络之间,提供TELNET、FTP、SMTP等的接⼊。随着越来越多的使全球信息查更容易的复杂的应⽤层协议的出现,有必要提供⼀个通⽤框架来使这些协议安全透明地穿过防⽕墙。⽽且在实际应⽤中还需要⼀种安全的认证⽅式⽤以穿越防⽕墙。这个要求起源于两个组织的⽹络中客户/服务器关系的出现,这个关系需要得到控制并要求有安全的认证。
在这⼉所描述的协议框架是为了让使⽤TCP和UDP的客户/服务器应⽤程序更⽅便安全地使⽤⽹络防⽕墙所提供的服务所设计的。这个协议从概念上来讲是介于应⽤层和传输层之间的"中介层(shim-layer)",因⽽不提供如传递ICMP信息之类由⽹络层⽹关的所提供的服务。2、现有的协议:
当前存在⼀个协议SOCKS 4,它为TELNET、FTP、HTTP、WAIS和GOPHER等基于TCP协议的客户/服务器程序提供了⼀个不安全的防⽕墙。⽽这个新的协议扩展了SOCKS V4,以使其⽀持UDP、框架规定的
安全认证⽅案、地址解析⽅案(addressing scheme)中所规定的域名和IPV6。为了实现这个SOCKS协议,通常需要重新编译或者重新链接基于TCP的客户端应⽤程序以使⽤SOCKS库中相应的加密函数。
注意:
除⾮特别注明,所有出现在数据包格式图中的⼗进制数字均以字节表⽰相应域的长度。如果某域需要给定⼀个字节的值,⽤X'hh'来表⽰这个字节中的值。如果某域中⽤到单词'Variable',这表⽰该域的长度是可变的,且该长度定义在⼀个和这个域相关联(1 – 2个字节)的域中,或⼀个数据类型域中。
3、基于TCP协议的客户端:
当⼀个基于TCP协议的客户端希望与⼀个只能通过防⽕墙可以到达的⽬标(这是由实现所决定的)建⽴连接,它必须先建⽴⼀个与SOCKS 服务器上SOCKS端⼝的TCP连接。通常这个TCP端⼝是1080。当连接建⽴后,客户端进⼊协议的"握⼿(negotiation)"过程:认证⽅式的选择,根据选中的⽅式进⾏认证,然后发送转发的要求。SOCKS服务器检查这个要求,根据结果,或建⽴合适的连接,或拒绝。
客户端连到socks服务器后,然后客户端就发送请求协商版本和认证⽅法到服务端:
VER NMETHODS METHODS
11 1 to 255
这个版本的SOCKS协议中,VER字段被设置成X'05'。NMETHODS字段包含了在METHODS字段中出现的⽅法标⽰的数⽬(以字节为单位)。
服务器从这些给定的⽅法中选择⼀个并发送⼀个⽅法选中的消息回客户端:
VER METHOD
11
如果选中的消息是X'FF',这表⽰客户端所列出的⽅法列表中没有⼀个⽅法被选中,客户端必须关闭连接。
当前定义的⽅法有:
· X'00' 不需要认证
· X'01' GSSAPI
· X'02' ⽤户名/密码
· X'03' -- X'7F' 由IANA分配
· X'80' -- X'FE' 为私⼈⽅法所保留的
· X'FF' 没有可以接受的⽅法
然后客户和服务器进⼊由选定认证⽅法所决定的⼦协商过程(sub-negotiation)。
4、客户端请求:
⼀旦⼦协商过程结束后,客户端就发送详细的请求信息。如果协商的⽅法中有以完整性检查和/或安全性为⽬的的封装,这些请求必须按照该⽅法所定义的⽅式进⾏封装。
SOCKS请求的格式如下:
VER CMD RSV ATYP DST.ADDR DST.PROT
11X'00'1Variable2
其中各字段含义:
VER协议版本: X'05'
CMD
CONNECT:X'01'
BIND:X'02'
UDP ASSOCIATE:X'03'
RSV 保留
ATYP 后⾯的地址类型
IPV4:X'01'
域名:X'03'
IPV6:X'04'
DST.ADDR⽬的地址
DST.PORT以⽹络字节序出现的端⼝号(⽹络字节序是TCP/UDP中规定好的⼀种数据表⽰格式,它与具体的CPU类型、操作系统⽆关,从⽽可以保证数据在不同主机之间传输时能够被正确解释,⽹络字节序采⽤big endian排序⽅式)
SOCKS服务器会根据源地址和⽬的地址来分析请求,然后根据请求类型返回⼀个或多个应答。
5、地址格式分析:
ATYP字段中描述了地址字段(DST.ADDR,BND.ADDR)所包含的地址类型:
· X'01'
基于IPV4的IP地址,4个字节长
· X'03'
基于域名的地址,地址字段中的第⼀字节是以字节为单位的该域名的长度,没有结尾的NUL字节。
· X'04'
基于IPV6的IP地址,16个字节长
6、服务端应答:
⼀旦建⽴了⼀个到SOCKS服务器的连接,并且完成了认证⽅式的协商过程,客户机将会发送⼀个SOCKS请求信息给服务器。服务器将会根据请求,以如下格式返回:
VER REP RSV ATYP BND.ADDR BND.PORT
11X’00’1Variable2
其中各字段的含义如下:
VER 协议版本: X'05'
REP 应答字段:
X'00' 成功
X'01' 普通的SOCKS服务器请求失败
X'02' 现有的规则不允许的连接
X'03' ⽹络不可达
X'04' 主机不可达
X'05' 连接被拒
X'06' TTL超时
X'07' 不⽀持的命令
X'08' 不⽀持的地址类型
X'09' – X'FF' 未定义
tcp ip协议中文名RSV 保留 (此字段必须设置为X'00')
ATYP 后⾯的地址类型
IPV4:X'01'
域名:X'03'
IPV6:X'04'
BND.ADDR服务器绑定的地址
BND.PORT以⽹络字节顺序表⽰的服务器绑定的端⼝
如果选中的⽅法中有以完整性检查和/或安全性为⽬的的封装,这些应答必须按照该⽅法所定义的⽅式进⾏封装。
7、客户端请求字段中CMD的含义:
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消息⾄服务器的端⼝和地址。
8、基于UDP协议的客户端:
在UDP ASSOCIATE应答中由BND.PORT指明了服务器所使⽤的UDP端⼝,⼀个基于UDP协议的客户必
须发送数据报⾄UDP转发服务器的该端⼝上。如果协商的认证⽅法中有以完整性、认证和/或安全性为⽬的的封装,这些数据报必须按照该⽅法所定义的⽅式进⾏封装。每个UDP数据报都有⼀个UDP请求头在其⾸部:
RSV FRAG ATYP DST.ADDR DST.PORT DATA
211Variable2Variable
在UDP请求头中的字段是:
RSV 保留 X'0000'
FRAG 当前的分段号
ATYP 后⾯的地址类型
IPV4:X'01'
域名:X'03'
IPV6:X'04'
DST.ADDR⽬的地址
DST.PORT以⽹络字节顺序出现的端⼝号
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编程界⾯(The programming interface for a SOCKS-aware UDP)必须报告当前可⽤UDP数据报缓存空间⼩于操作系统提供的实际空间。
如果 ATYP是X'01' - 10+method_dependent octets smaller
如果 ATYP是X'03' - 262+method_dependent octets smaller
如果 ATYP是X'04' - 20+method_dependent octets smaller
Socket5协议图标:
RFC1928英⽂⽂档:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论