Socks5协议中⽂⽂档
译者:Radeon(Radeon bise@cmmail)
译⽂公布时间:2001-6-18
⽂件夹
1.介绍
2.现有的协议
3.基于TCP协议的客户
4.请求
5.地址
6.应答
7.基于UDP协议的客户
8. 安全性考虑
9. 參考书⽬
1.介绍
利⽤⽹络防⽕墙能够将组织内部的⽹络结构从外部⽹络如INTERNET中有效地隔离,这样的⽅法在很多⽹络系统中正变得流⾏起来。这样的防⽕墙系统通常以应⽤层⽹关的形式⼯作在两个⽹络之间,提供TELNET、FTP、SMTP等的接⼊。随着越来越多的使全球信息查更easy的复杂的应⽤层协议的出现,有必要提供⼀个通⽤框架来使这些协议安全透明地穿过防⽕墙。并且在实际应⽤中还须要⼀种安全的认证⽅式⽤以穿越防⽕墙。这个要求起源于两个组织的⽹络中客户/server关系的出现,这个关系须要得到控制并要求有安全的认证。
在这⼉所描写叙述的协议框架是为了让使⽤TCP和UDP的客户/server应⽤程序更⽅便安全地使⽤⽹络防⽕墙所提供的服务所设计的。这个协议从概念上来讲是介于应⽤层和传输层之间的“中介层(shim-layer)”,因⽽不提供如传递ICMP信息之类由⽹络层⽹关的所提供的服务。
2.现有的协议
当前存在⼀个协议SOCKS 4,它为TELNET、FTP、HTTP、WAIS和GOPHER等基于TCP协议的客户/s
erver程序提供了⼀个不安全的防⽕墙。⽽这个新的协议扩展了SOCKS V4,以使其⽀持UDP、框架规定的安全认证⽅案、地址解析⽅案(addressing scheme)中所规定的域名和IPV6。为了实现这个SOCKS协议,通常须要⼜⼀次编译或者⼜⼀次链接基于TCP的client应⽤程序以使⽤SOCKS库中对应的加密函数。注意:
除⾮特别注明,全部出如今数据包格式图中的⼗进制数字均以字节表⽰对应域的长度。假设某域须要给定⼀个字节的值,⽤X’hh’来表⽰这个字节中的值。假设某域中⽤到单词’Variable’,这表⽰该域的长度是可变的,且该长度定义在⼀个和这个域相关联(1 – 2个字节)的域中,或⼀个数据类型域中。
3.基于TCP协议的客户
当⼀个基于TCP协议的client希望与⼀个仅仅能通过防⽕墙能够到达的⽬标(这是由实现所决定的)建⽴连接,它必须先建⽴⼀个与SOCKSserver上SOCKSport的TCP连接。通常这个TCPport是1080。当连接建⽴后,client进⼊协议的“握⼿(negotiation)”过程:认证⽅式的选择,依据选中的⽅式进⾏认证,然后发送转发的要求。SOCKSserver检查这个要求,依据结果,或建⽴合适的连接,或拒绝。
除⾮特别注明,全部出如今数据包格式图中的⼗进制数字均以字节表⽰对应域的长度。假设某域须要给定⼀个字节的值,⽤X’hh’来表⽰这个字节中的值。假设某域中⽤到单词’Variable’,这表⽰该域的长度是可变的,且该长度定义在⼀个和这个域相关联(1 – 2个字节)的域中,或⼀个数据类型域中。
client连到server后,然后就发送请求来协商版本号和认证⽅法:
VER NMETHODS METHODS
11 1 to 255
这个版本号的SOCKS协议中,VER字段被设置成X'05'。NMETHODS字段包括了在METHODS字段中出现的⽅法标⽰的数⽬(以字节为单位)。
server从这些给定的⽅法中选择⼀个并发送⼀个⽅法选中的消息回client:
VER METHOD
11
假设选中的消息是X’FF’,这表⽰client所列出的⽅法列表中没有⼀个⽅法被选中,client必须关闭连接。
当前定义的⽅法有:
· X’00’ 不须要认证
· X’01’ GSSAPI
· X’02’ username/password
· X’03’ -- X’7F’ 由IANA分配
· X’80’ -- X’FE’ 为私⼈⽅法所保留的
· X’FF’ 没有能够接受的⽅法
然后客户和server进⼊由选定认证⽅法所决定的⼦协商过程(sub-negotiation)。各种不同的⽅法的⼦协商过程的描写叙述请參考各⾃的备忘录。
开发⼈员假设要为⾃⼰的⽅法得到⼀个⽅法号,能够联系IANA。能够參考关于已经被分配号码的⽂档以得到当前全部⽅法的列表和对应的协议。
符合本⽂档的SOCKS V5实现必须⽀持GSSAPI,⽽且在将来⽀持username/password认证⽅式。
符合本⽂档的SOCKS V5实现必须⽀持GSSAPI,⽽且在将来⽀持username/password认证⽅式。
4.请求
⼀旦⼦协商过程结束后,client就发送具体的请求信息。假设协商的⽅法中有以完整性检查和/或安全性
为⽬的的封装,这些请求必须依照该⽅法所定义的⽅式进⾏封装。
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 ⽬的地址tcp ip协议中文名
· DST.PORT 以⽹络字节顺序出现的port号
SOCKSserver会依据源地址和⽬的地址来分析请求,然后依据请求类型返回⼀个或多个应答。
5.地址
ATYP字段中描写叙述了地址字段(DST.ADDR,BND.ADDR)所包括的地址类型:
· X'01'
基于IPV4的IP地址,4个字节长
·
X'03'
基于域名的地址,地址字段中的第⼀字节是以字节为单位的该域名的长度,没有结尾的NUL字节。
· X'04'
基于IPV6的IP地址,16个字节长
6.应答
⼀旦建⽴了⼀个到SOCKSserver的连接,⽽且完毕了认证⽅式的协商过程,客户机将会发送⼀个SOCKS请求信息给server。server将会依据请求,以例如以下格式返回:
VER REP RSV ATYP BND.ADDR BND.PORT
11X’00’1Variable2
当中:
· VER 协议版本号: X’05’
· REP 应答字段:
· X’00’ 成功
· X’01’ 普通的SOCKSserver请求失败
· X’02’ 现有的规则不同意的连接
· X’03’ ⽹络不可达
· X’04’ 主机不可达
· X’05’ 连接被拒
· X’06’ TTL超时
· X’07’ 不⽀持的命令
· X’08’ 不⽀持的地址类型
· X’09’ – X’FF’ 没有定义
· RSV 保留
·
ATYP 后⾯的地址类型
· IPV4:X’01’
· 域名:X’03’
· IPV6:X’04’
· BND.ADDR server绑定的地址
· BND.PORT 以⽹络字节顺序表⽰的server绑定的段⼝
标识为RSV的字段必须设为X’00’。
假设选中的⽅法中有以完整性检查和/或安全性为⽬的的封装,这些应答必须依照该⽅法所定义的⽅式进⾏封装。
CONNECT
在对⼀个CONNECT命令的应答中,BND.PORT包括了server分配的⽤来连到⽬标机的port号,BND.ADDR则是对应的IP地址。因为SOCKSserver通常有多个IP,应答中的BND.ADDR常和client连到
SOCKSserver的那个IP不同。
SOCKSserver能够利⽤DST.ADDR和DST.PORT,以及client源地址和port来对⼀个CONNECT请求进⾏分析。
SOCKSserver能够利⽤DST.ADDR和DST.PORT,以及client源地址和port来对⼀个CONNECT请求进⾏分析。
BIND
BIND请求通常被⽤在那些要求client接受来⾃server的连接的协议上。FTP是⼀个典型的样例。它建⽴⼀个从client到server端的连接来运⾏命令以及接收状态的报告,⽽使⽤还有⼀个从server到client的连接来接收数据传输的要求(如LS,GET,PUT)。
建议仅仅有在⼀个应⽤协议的client在使⽤CONNECT命令建⽴主连接后才⼲够使⽤BIND命令建⽴第⼆个连接。建议SOCKSserver使⽤DST.ADDR和DST.PORT来评价BIND请求。
在⼀个BIND请求的操作过程中,SOCKSserver要发送两个应答给client。当server建⽴并绑定⼀个新的套接⼝时发送第⼀个应答。BND.PORT字段包括SOCKSserver⽤来监听进⼊的连接的port号,BAND.ADDR字段包括了相应的IP地址。client通常使⽤这些信息来告诉(通过主连接或控制连接)应⽤
server连接的汇接点。第⼆个应答仅发⽣在所期望到来的连接成功或失败之后。在第⼆个应答
中,BND.PORT和BND.ADDR字段包括了连上来的主机的IP地址和port号。
UDP ASSOCIATE
UDP ASSOCIATE请求⼀般是要求建⽴⼀个UDP转发进程来控制到来的UDP数据报。DST.ADDR和DST.PORT 字段包括client所希望的⽤来发送UDP数据报的IP地址和port号。server能够使⽤这个信息来限制进⼊的连接。假设client在发送这个请求时没有地址和port信息,client 必须⽤全0来填充。
当与UDP对应的TCP连接中断时,该UDP连接也必须中断。
应答UDP ASSOCIATE请求时,BND.PORT 和BND.ADDR字段指明了客户发送UDP消息⾄server的port和地址。
应答处理
当⼀个应答(REP值不等于00)指明出错时,SOCKSserver必须在发送完应答消息后⼀⼩段时间内终⽌TCP连接。这段时间应该在发现错误后少于10秒。
假设⼀个应答(REP值等于00)指明成功,⽽且请求是⼀个BIND或CONNECT时,client就能够開始发送数据了。假设协商的认证⽅法中有以完整性、认证和/或安全性为⽬的的封装,这些请求必须依照该⽅法所定义的⽅式进⾏封装。类似的,当以客户机为⽬的地的数据到达SOCKSserver时,SOCKSserver必须⽤正在使⽤的⽅法对这些数据进⾏封装。
7.基于UDP协议的客户
在UDP ASSOCIATE应答中由BND.PORT指明了server所使⽤的UDPport,⼀个基于UDP协议的客户必须发送数据报⾄UDP转发server的该port上。假设协商的认证⽅法中有以完整性、认证和/或安全性为⽬的的封装,这些数据报必须依照该⽅法所定义的⽅式进⾏封装。每⼀个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 以⽹络字节顺序出现的port号
· DATA ⽤户数据
当⼀个UDP转发server转发⼀个UDP数据报时,不会发送不论什么通知给client;相同,它也将丢弃不论什么它不能发⾄远端主机的数据报。当UDP转发server从远端server收到⼀个应答的数据报时,必须加上上述UDP请求头,并对数据报进⾏封装。
UDP转发server必须从SOCKSserver得到期望的clientIP地址,并将数据报发送到UDP ASSOCIATE应答中给定的port号。假设数据报从不论什么IP地址到来,⽽该IP地址与该特定连接中指定的IP地址不同,那么该数据报会被丢弃。
FRAG字段指明数据报是否是⼀些分⽚中的⼀⽚。假设SOCKSserver要实现这个功能,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
8. 安全性考虑
这篇⽂档描写叙述了⼀个⽤来透过IP⽹络防⽕墙的应⽤层协议。这样的传输的安全性在⾮常⼤程度上依赖于特定实现所拥有以及在SOCKS 客户与SOCKSserver之间经协商所选定的特殊的认证和封装⽅式。
系统管理员须要对⽤户认证⽅式的选择进⾏细致考虑。
作者地址
Marcus Leech
Bell-Northern Research Ltd
P.O. Box 3511, Station C
Ottawa, ON
Ottawa, ON CANADA K1Y 4H7 Phone: (613) 763 - 9145 EMail: mleech@bnr.ca 05-15 22:39
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论