SOCKS代理协议的学习点滴【第一部分】
SOCKS协议解决了什么问题?
它为我们应用层协议安全的穿过网络防火墙提供了一个通用的框架,由于他工作在一个夹在传输层和应用层中间的东东,所以其应用在代理服务时对应用层是透明的,也就是说不管什么应用协议都能通过SOCKS协议进行代理。这就解决了我们必须为每一个新出的应用协议设计专门的代理协议,有了SOCKS协议,我们就能代理所有的应用服务了。
那我就想他怎么个工作呢?
其实阅读RFC文档之后发现很简单(尤其体现在RFC文档页数少),首先说SOCKSV4吧,当PC1通过代理访问远端一个WEB服务器时,他首先会作为SOCKS Client发送一个请求(CONNECT命令)到SOCKS服务器(使用SOCKS协议的就是SOCKS服务器),该请求包含的数据有 版本号+命令吗(1:CONNECT)+远端端口号+远端IP+用户表示(IDENTD)+NULL结尾。(当然在发送这种请求连接的前提是TCP经过了三次握手成功建立连接)SOCKS Server接受到请求之后首先会对这个请求进行综合的判别(V4的策略),判别的方法是通过IDENT协议,也就是发送一个请求,内容包括了一对port,(一个是服务器,一个是PC1),PC1上的IDENT协议软件收到这个请求之后会发送对应自己的标识。SK 服务器通过对比之前用户发送的USERID和IDENT发送的USERID 若一样则,服务器接受客户端的请求,若没有通过评估,服务器会先发送一个reply报文,响应代码设为:91,然后主动断开TCP链接。若接受了请求,服务器会在发送reply报文之前先跟客户端想访问的远端服务器建立TCP链接,若链接成功建立则服务器发送reply报文,当然失败了也会发送reply报文。响应报文的数据包括有,版本号(0X00)+响应代码(每一个代表一个状态如90标识请求通过授权)+远端PORT+远端IP(这两个在CONNECT命令下可以忽略),】链接建立之后就可以转发数据了,SK 客户端发送给远端应用服务器(任意)的数据,SK服务器会无条件进行转发,不管应用层是什么协议。整个代理服务开始进行......
【BIND】实际应用中会存在一种情况那就是整个应用的进行需要远端服务器主动与客户端建立TCP链接(FTP是个很好的例子),这种情况SOCKS协议通过BIND命令来实现,BIND命令是怎么回事呢?他就是想让SK服务器建立一个socket绑定一个IP(服务器通常多个IP)和端口号供客户端访问的远端服务器链接。该怎么做呢? SK客户端会重新与服务器重新建立一条TCP链接,另一条TCP称为主链接仍存在。TCP链接建立之后,SK客户端会在TCP链接上发送BIND命令给SK服务器。请求中仍然包含远端服务器的地址。SK服务器会做什么呢?接收到请求之后,他首先仍然会对这个请求进行评估,方法与CONNECT一样。评估通过之后,SK服务器会创建一个SOCKET,侦听在 ADDRA:PORTA. 并向客户端发送第一个BIND响应。该响应中包含的内容和CONNECT响应一样,只不过当CD=0x5A时候,包中的DSTIP和DSTPORT对应ADDRA和PORTA,如果DSTIP=0(INADDR_ANY)则SK客户端会将其设为SK服务器的IP地址,这说明该SK服务器没有多个IP地址。这个响应包是告诉服务器已经接受了客户端的请求,并创建来了一个新的套接字等待远端应用服务器链接。并将其绑定的IP地址和端口发送给了客户端。于是SK客户端接收到第一个BIND响应之后,首先获取ADDRA和PORTA,然后通过另一个TCP链接(主链接,因为这个链接已经连上远端服务器),发送PORT(FTP环境下)命令通知远端应用服务器主动建立到ADDRA:PORTA的TCP链接。(FTP环境下,也就是客户端通过TCP控制流发送命令告诉FTPserver该链接那个套接字进行数据传输),当远端应用服务器收到该PORT命令之后会主动建立到ADDRA:PORTA的TCP链接。然后,SK服务器收到这个链接请求之后会检查这条链接的源IP是否与SK客户端想要链接的远端应用服务器的IP一致,若匹配则会发送第二次BIND响应。然后,远端服务器可以和客户端传输数据了。通过这条TCP链接。当然若是刚才IP不匹配,SK服务器也会发送BIND响应,然后断开这条链接,另一条主链接仍然存在。