发明内容
本发明解决的技术问题是提供一种透明代理及其实现方法,能够实现数据的按应用层协议类型高性能转发。
为解决上述技术问题,本发明提供了一种透明代理实现方法,
透明代理与客户端之间建立TCP链路;
所述透明代理通过链路层网卡获取所述客户端发往目的服务端的业务数据包,并根据所述业务数据包的应用层协议类型选择相应的粘合服务端;
所述透明代理与所述粘合服务端之间建立TCP链路;
所述透明代理修改所述客户端的业务数据包的目的地址,将修改后的业务数据包通过链路层网卡直接发往所述粘合服务端进行处理。
进一步地,所述透明代理与所述客户端建立TCP链路的过程,包括:
所述客户端发起syn建链请求,所述syn建链请求中携带随机产生的第一初始序列号,且源地址和源端口为所述客户端的IP和端口号,目的地址和目的端口为所述服务端的IP和端口号;
所述透明代理获取所述客户端发起的所述syn建链请求,向所述客户端发起第二次握手syn_ack,所述syn_ack中携带随机产生的第二初始序列号,且源地址和源端口为所述目的服务端的IP和端口号,目的地址和目的端口为所述客户端的IP和端口号;
所述客户端发起第三次握手ack,所述透明代理与所述客户端的TCP链路建立完成。
进一步地,所述方法还包括:
所述透明代理与所述客户端建立TCP链路时,所述透明代理保存所述客户端发起的第三次握手ack包,以及所述ack包后续的一个或几个数据包。
进一步地,所述透明代理与所述粘合服务端建立TCP链路的过程,包括:
所述透明代理选择所述粘合服务端,并向所述粘合服务端发起syn建链请求,所述syn建链请求中携带的目的地址和端口为所述粘合服务端的IP和端口号;
所述粘合服务端回应syn_ack,所述syn_ack携带随机产生的序列号;
所述透明代理对序列号进行同步后,将保存的所述客户端发起的第三次握手ack包和后续的一个或几个数据包发送给所述粘合服务端,所述透明代理与所述粘合服务端的TCP链路建立完成。
进一步地,其特征在于,所述方法还包括:
所述链路层网卡维护缓存的数据包内存块,并将内存块索引通知应用层;
应用层根据所述内存块索引对链路层的内存数据包进行收发控制。
进一步地,所述方法还包括:
所述透明代理将所述客户端的业务数据包中的初始目的地址与修改后的目的地址共同组成目的地址池,并将所述目的地址池与源地址、源端口及传输层协议类型与数据流id建立关联后进行保存。
本发明还提供了一种透明代理,所述透明代理包括数据获取模块,建链模块,和数据转发模块,
所述数据获取模块,用于通过链路层网卡获取客户端发往目的服务端的业务数据包,并根据所述业务数据包的应用层协议类型选择相应的粘合服务端;
所述建链模块,用于分别与所述客户端以及所述粘合服务端之间建立TCP链路;
所述数据转发模块,用于修改所述客户端的业务数据包的目的地址,将修改后的业务数据包通过链路层网卡直接发往所述粘合服务端进行处理。
进一步地,所述建链模块用于,按照以下方式与所述客户端建立TCP链路:
所述建链模块获取所述客户端发起的所述syn建链请求,所述syn建链请求中携带随机产生的第一初始序列号,且源地址和源端口为所述客户端的IP和端口号,目的地址和目的端口为所述服务端的IP和端口号;
所述建链模块向所述客户端发起第二次握手syn_ack,所述syn_ack中携带随机产生的第二初始序列号,且源地址和源端口为所述目的服务端的IP和端口号,目的地址和目的端口为所述客户端的IP和端口号;
接收到所述客户端发起的第三次握手ack时,所述建链模块与所述客户端的TCP链路建立完成;且所述建链模块保存所述客户端发起的第三次握手ack包以及后续的一个或几个数据包。
进一步地,所述建链模块用于,按照以下方式与粘合服务端建立TCP链路:
所述建链模块向所述粘合服务端发起syn建链请求,所述syn建链请求中携带的目的地址和端口为所述粘合服务端的IP和端口号;
所述建链模块接收到所述粘合服务端回应的syn_ack时,根据所述syn_ack中携带的随机产生的序列号对序列号进行同步后,将与所述客户端建立TCP链路时保存的所述客户端发起的第三次握手ack包和后续的一个或几个数据包发送给所述粘合服务端,所述建链模块与所述粘合服务端的TCP链路建立完成。
进一步地,所述透明代理还包括数据流粘合模块,
所述数据流粘合模块,用于将所述客户端的业务数据包中的初始目的地址与修改后的目的地址共同组成目的地址池,并将所述目的地址池与源地址、源端口及传输层协议类型与数据流id建立关联后进行保存。
本发明中,透明代理的数据直接来源于链路层网卡,并通过网卡直接发送,不经由操作系统协议栈,无须启动监听,实现数据高效传输;此外,透明代理与客户端及服务端的双边链路建立之后,后续数据流实现透明传输,并且保持了通信过程中客户端和服务端之间五元组信息的一致性和序列空间的同步性。
具体实施方式
本发明提供一种透明代理实施方案,以tcp粘合作为底层实现手段,实现透明代理。通过对客户端和服务端的双边欺诈,实现客户端和服务端直接数据的透明传输,此处所述的服务端不是客户端请求的目的服务端,而是转发处理的专用服务器,数据经由该服务器处理之后再被最终发送至目标服务端。
具体地,本实施方案的tcp代理粘合方案,具有如下主要内容:
1)不需要内核空间与应用层空间的数据交换
内核空间只需要提供一个内存索引,应用空间可以根据这个内存索引操作相应的内存块。不仅是建链完成后的数据传输,包括建链阶段,都不需要应用空间和内核空间的数据交换,可以实现更高的性能。
其中,透明代理如果在应用层实现,由于涉及内核空间和用户空间的海量内存拷贝,会严重影响性能;而如果纯粹在内核层实现,则需要经由tcp/ip协议栈处理,且实现复杂度非常高。
而本发明中用户空间只进行控制,数据全部由网卡直接进行交换,用户空间只需操作内核内存的索引,而无须拷贝,所以性能与直接在内核实现相差无几;同时,因为控制逻辑在应用层实现,又大大降低了实现复杂性,提高了可维护性。
链路层网卡驱动维护大块内存,用于高速数据包缓存,并只向应用空间通知内存块索引。
数据不需要在内核空间和应用空间之间进行拷贝,应用层进程直接对链路层内存进行操作,并以索引的方式通知内核态数据包的发送与接收。应用空间和内核空间之间使用netlink机制进行通信。
透明代理直接通过网卡收发数据包,并修改数据包的源、目的mac,将数据包直接通过网卡发送至相应网络设备(如交换机)并由网络设备转发至目的客户端或服务器。
2)透明代理作为客户端(或者服务端)进行欺诈时不需要启动监听,通信在链路层层面上建立,通过操作网卡驱动发送伪造数据包的方式进行双向欺诈,伪装真实服务端和客户端通信,同时伪装真实客户端去和服务端通信。
3)报文初始传输方向和重定向(粘合)后传输方向相关的数据流参数以流上下文的方式进行约束,可以跟踪完整的用户行为。
为了便于阐述本发明,以下将结合附图及具体实施例对本发明技术方案的实施作进一步详细描述。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
图2和图3分别示出了透明代理对序列空间的转换,以及地址空间的转换处理。需要说明的是,在数据传输处理时,图2和图3是同时完成的。通过序列空间粘合和地址空间粘合,具体是指图中所示的客户端欺诈和服务端欺诈,使得前后两个链路被整合成了一个链路,原数据流传输路径在不知不觉中被重定向至需要的专用服务端(本文中也称粘合服务端),且这一行为不会被客户端和粘合服务端所感知,客户端不知道自己的数据传输方向被改变了,粘合服务端也不知道数据原本可能不是发给自己的,整个过程是透明的。
如图2和图3所示,seqA,seqB,seqC均为随机序列号,分别由客户端、透明代理、服务端产生。reqlen为客户段请求的数据长度,reslen为服务端响应的数据长度。[seqA+1,seq+1+reqlen]表示序列号取值范围在两者之间,数据可能分段传输(当数据长度大于mss(max segment size)时)。现网情况下,客户端或服务器可以能会对每一个分片包进行单独回应,本文中为简化分析,使逻辑更加清晰,假设系统采用时延确认,对每一个完整数据包只响应一次。
参考图2和图3,具体包括如下主要处理:
第一步:客户端欺诈
客户端向服务端发起syn建链,初始序列号seqA,由客户端随机产生,建链目标地址和端口为客户端请求的原始服务器地址(ipB,port B)。
透明代理捕获客户端发出的syn包,将其保存至内存中,并伪装服务端(ipB,portB)向客户端发起第二次握手syn_ack,初始序列号seqB,由透明代理随机产生。
客户端向服务端发第三次握手ack包和后续少数数据包(如前一个,或者前少数几个),透明代理将这部分数据包保存在内存中,待后续发送。至此,透明代理与客户端的tcp链路建立,客户端欺诈完成。
第二步:服务端欺诈
每一种应用层协议都有其区别与其它协议的特征字,透明代理经过特征字扫描等手段分析数据流应用层协议类型,并根据其类型选择专用的处理服务器(即粘合服务端)。
粘合服务端的选取举例说明如下:例如,通过拦截客户端数据并分析,通过特征字扫描,得知是HTTP协议,则将此数据流发送至专门处理HTTP数据的服务器(而不一定是数据流原先的目的服务器);同样,如果判断数据流为邮件数据流,则将数据流转发至专门处理邮件的服务器,等。经过这些专用服务器处理后,还会将数据最终发送至原目的服务器,并将目的服务器的响应通过透明代理发送给客户端。也就是说,客户端和服务器直接数据本来是透明传输的,但在中间搭建了一个专用服务器对各种协议数据进行个性化处理,同时又不改变原数据流目的IP、PORT,使得传输路径改变但不被客户端或服务器所感知。
透明代理选择粘合服务端,并向该粘合服务端发出syn建链。Syn建链包是与客户端建链时保存的,序列号不变,但目的地址、端口被修改为粘合服务端地址(ipC,port C),而不是其原目的服务器地址(ipB,port B)。
粘合服务端(ipC,port C)回应syn_ack,序列号seqC,由服务端随机产生,区别于透明代理回客户端的序列号seqB,两者存在一个差值(Δseq=seqC-seqB)。
透明代理将与客户端建链时保存的第三次握手包和后续少数数据包发送至服务端,发送前将序列号进行Δseq同步。至此,透明代理和粘合服务端的链路建立,服务端欺诈完成。
第三步:链路粘合后的类透明传输
经过上述两步的欺诈,保持了通信过程中客户端和服务端之间五元组信息的一致性和序列空间的同步性,客户端以为一直在和服务端通信,服务端也认为一直在和客户端通信,双方均感受不到中间代理的存在,即本文所称的透明代理。
后续双边数据传输全在客户端和服务器的控制下进行,包括数据包重传、乱序处理等,透明代理不再干预链路,也不再履行网络设备职责,只进行简单序列空间(Δseq)同步。
此外,报文初始传输方向和重定向(粘合)后传输方向相关的数据流参数以流上下文的方式进行约束,可以跟踪完整的用户行为。A->B,A->C,短时间间隔内端口的唯一性决定流的可追溯性。
如图4所示:源地址、源端口、目的地址、目的端口和传输层协议(tcp/udp)构成数据流五元组,五元组信息可以唯一决定一个数据流。
数据包的初始目的地址和可能被重定向(粘合)的目的地址共同组成目的地址池,分别和源地址、端口和传输层协议类型组成hash键值并存入相同的数据流id至hash表,应用进程可以通过流id索引对应的数据流信息。这样可以保证重定向后的数据包也能找到数据流索引,从而能将双边链路粘合前和粘合后的链路关联起来。
此外,本发明实施例中还提供了一种透明代理,该透明代理主要包括数据获取模块,建链模块,和数据转发模块,
所述数据获取模块,用于通过链路层网卡获取客户端发往目的服务端的业务数据包,并根据所述业务数据包的应用层协议类型选择相应的粘合服务端;
所述建链模块,用于分别与所述客户端以及所述粘合服务端之间建立TCP链路;
所述数据转发模块,用于修改所述客户端的业务数据包的目的地址,将修改后的业务数据包通过链路层网卡直接发往所述粘合服务端进行处理。
进一步地,所述建链模块用于,按照以下方式与所述客户端建立TCP链路:
所述建链模块获取所述客户端发起的所述syn建链请求,所述syn建链请求中携带随机产生的第一初始序列号,且源地址和源端口为所述客户端的IP和端口号,目的地址和目的端口为所述服务端的IP和端口号;
所述建链模块向所述客户端发起第二次握手syn_ack,所述syn_ack中携带随机产生的第二初始序列号,且源地址和源端口为所述目的服务端的IP和端口号,目的地址和目的端口为所述客户端的IP和端口号;
接收到所述客户端发起的第三次握手ack时,所述建链模块与所述客户端的TCP链路建立完成;且所述建链模块保存所述客户端发起的第三次握手ack包以及后续的一个或几个数据包。
进一步地,所述建链模块用于,按照以下方式与粘合服务端建立TCP链路:
所述建链模块向所述粘合服务端发起syn建链请求,所述syn建链请求中携带的目的地址和端口为所述粘合服务端的IP和端口号;
所述建链模块接收到所述粘合服务端回应的syn_ack时,根据所述syn_ack中携带的随机产生的序列号对序列号进行同步后,将与所述客户端建立TCP链路时保存的所述客户端发起的第三次握手ack包和后续的一个或几个数据包发送给所述粘合服务端,所述建链模块与所述粘合服务端的TCP链路建立完成。
进一步地,所述透明代理还包括数据流粘合模块,用于将所述客户端的业务数据包中的初始目的地址与修改后的目的地址共同组成目的地址池,并将所述目的地址池与源地址、源端口及传输层协议类型与数据流id建立关联后进行保存。
以上仅为本发明的优选实施案例而已,并不用于限制本发明,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员可根据本发明做出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。