一种无协议栈模式下针对TCP的中间人处理方法
技术领域
本发明涉及网络通信领域,特别涉及一种无协议栈模式下针对TCP的中间人处理方法。
背景技术
随着互联网的发展,网络传输媒体日益多样化,网络安全问题也逐渐受到人们的重视。作为网络攻击的一种,中间人攻击具有很强的隐蔽性,威胁巨大。攻击者使自己位于信息发送者和接收者之间,对双方交互的信息进行处理。但在某些特定情况下,中间人技术也有可取之处。例如中间人技术可以在一定程度上对网络犯罪进行监测、对网络中非法暴力色情信息进行屏蔽。
现有的TCP中间人处理方法都是工作在正常TCP/IP协议栈模式下,中间人采用与两端分别建立两个连接的方法,监听两端的交互报文。这种方法的优点是实现简单。由于该方法工作在正常TCP/IP协议栈模式下,因此每当收到数据包时,需要将数据包先后提交到网络层(IP协议栈)、传输层(TCP协议栈)、应用层进行处理;之后再经过应用层、传输层(TCP)、网络层(IP)进行封装;最后将数据包进行转发。显然现有TCP中间人处理方法的实时性较差,会对网络吞吐量造成影响。另外,该方法也会对两端的正常交互造成影响。
发明内容
本发明的目的在于克服现有技术中的TCP中间人处理方法实时性差、会对客户端与服务端的正常交互造成影响的缺陷,从而提供一种实时性高、对发送端与接收端透明的TCP中间人处理方法。
为了实现上述目的,本发明提供了一种无协议栈模式下针对TCP的中间人处理方法,包括:
截取发送端向接收端发送的TCP数据包后,对TCP数据包进行TCP/IP重组;然后修改该TCP数据包的载荷长度;修改TCP数据包的TCP首部信息,至少包括序列号、确认号;最后对TCP数据包进行缓存,并向接收端转发。
上述技术方案中,该方法进一步包括:
步骤S101、收到一个TCP数据包;
步骤S102、对该TCP数据包进行TCP/IP重组;
步骤S103、通过TCP重组的信息判断该TCP数据包是否为重传包,若是,则转到重传包处理流程S108,否则,转到正常包处理流程S104;
步骤S104、按照需求修改该数据包的载荷长度,载荷长度变化值记为offset,转步骤S105;
步骤S105、检查该TCP数据包是否捎带了确认号,若是,则转步骤S106,否则,转步骤S107;
步骤S106、提取该TCP数据包的五元组,进行反向哈希查找,对反向的TCP流进行确认,在反向缓存队列中删除已经确认过的TCP数据包,并修改TCP首部的确认号,转步骤S107;
步骤S107、以TCP数据包的五元组进行正向哈希查找,修改TCP首部的序列号,将该包插入正向缓存队列的队尾,并向前转发,转步骤S111;
步骤S108、确定该TCP数据包为重传包,判断该重传包是否已经被TCP中间人处理模块确认,若是,则转步骤S109,否则,转步骤S110;
步骤S109、以该TCP数据包的五元组进行反向哈希查找,找到反向缓存队列中对应的TCP数据包,将缓存队列中对应的TCP数据包向后转发,丢弃原TCP数据包,转步骤S111;
步骤S110、以该TCP数据包的五元组进行正向哈希查找,找到正向缓存队列中对应的TCP数据包,将缓存队列中对应的TCP数据包向前转发,丢弃原TCP数据包,转步骤S111;
步骤S111、该TCP数据包处理结束。
上述技术方案中,所述反向哈希查找将TCP数据包的目的地址、目的端口、源地址、源端口、协议类型作为value进行哈希匹配;所述正向哈希查找将TCP数据包的源地址、源端口、目的地址、目的端口、协议类型作为value进行哈希匹配。
上述技术方案中,在步骤S107中,所述修改TCP首部的序列号按如下计算公式进行:
修改后的序列号=修改前的序列号+累计的offset;其中,累计的offset=队尾TCP包的累计的offset+该TCP数据包的offset。
上述技术方案中,在步骤S106中,修改TCP首部的确认号采用如下计算公式:修改后的确认号=期望确认号-累计的offset;其中,所述期望确认号=修改后的序列号+修改后的TCP载荷长度。
上述技术方案中,在步骤S108中,采用如下方法对TCP数据包是否为重传包 进行判断:若该TCP数据包的序列号大于TCP/IP重组过程输出的最大的序列号值,则说明该TCP包不是重传包,否则,该TCP包是重传包。
上述技术方案中,所述向前转发表示转发的方向与源TCP数据包发往的方向相同;所述向后转发表示转发的方向与源TCP数据包发往的方向相反。
本发明的优点在于:
1、本发明的无协议栈模式下针对TCP的中间人处理方法工作在无协议栈的模式下,对TCP数据包的修改对发送端和接收端来说是透明的,且不会影响到发送端和接收端的正常交互;
2、本发明的无协议栈模式下针对TCP的中间人处理方法通过缓存机制,为重传包的处理提供了一定的加速作用;
3、本发明的无协议栈模式下针对TCP的中间人处理方法可以为其他基于TCP协议的中间人方案提供底层技术支持。
附图说明
图1是本发明的无协议栈模式下针对TCP的中间人处理方法的基本流程图;
图2是本发明的无协议栈模式下针对TCP的中间人处理方法中所采用的缓存哈希表的结构示意图;
图3是本发明的无协议栈模式下针对TCP的中间人处理方法的详细流程图;
图4是本发明的无协议栈模式下针对TCP的中间人处理方法中修改序列号与确认号的示例图;
图5是TCP数据包在发送端与接收端之间的一个传送流程示意图。
具体实施方式
现结合附图对本发明作进一步的描述。
本发明的中间人处理方法不采用TCP/IP协议栈,该方法直接在网络层中对传输层(TCP)和应用层(各种协议)的数据报文进行处理。在本发明中,将位于通信网络中的两个网络节点之间的、采用本发明方法的TCP中间人称为TCP中间人模块。在两个网络节点间进行通信时,所述TCP中间人模块对流经的TCP数据包进行接收、重组、修改、转发处理,并保持正常TCP连接。在这一过程中,需要根据TCP数据包处理前后长度的变化值,修改TCP首部的序列号和确认号的值,并且不影响发送端、可接收端的正常交互。
参考图1,本发明的方法包括:
步骤S1、TCP中间人处理模块进行初始化;
步骤S2、发送端向接收端发送TCP数据包;
步骤S3、TCP中间人处理模块截取TCP数据包,并对TCP数据包进行TCP/IP重组,以保证所收到的TCP包的有序性;
步骤S4、TCP中间人处理模块修改TCP数据包的载荷长度;
步骤S5、TCP中间人处理模块修改数据包的TCP首部信息,包括序列号、确认号,校验和等字段;
步骤S6、TCP中间人处理模块对TCP数据包进行缓存,并向接收端转发。
参考图3,本发明的方法可进一步细化为以下步骤:
步骤S101、TCP中间人处理模块收到一个TCP数据包;
步骤S102、TCP中间人处理模块对该TCP数据包进行TCP/IP重组;
正常协议栈会提供TCP/IP重组的功能,由于本发明的方法不采用协议栈,因此在本步骤中需要对TCP数据包做TCP/IP重组;
步骤S103、通过TCP重组的信息判断该TCP数据包是否为重传包,若是,则转到重传包处理流程S108,否则,转到正常包处理流程S104;
步骤S104、TCP中间人处理模块按照相应需求修改该数据包的载荷长度,载荷长度变化值为offset,转步骤S105;
本发明的方法主要适用于如下情况:在收到网络层数据包后,需要根据具体的需求(如删除敏感词)从TCP载荷中找到对应的数据并加以修改。因此在本步骤中按照相应需求修改数据包的载荷长度。
步骤S105、检查该TCP数据包是否捎带了确认号(ACK),若是,则转步骤S106,否则,转步骤S107;
一个TCP数据包可能从属于两个方向上的数据流,一是发送端->接收端方向,二是接收端->发送端方向。每个方向上的TCP数据包的确认号都是对反方向的TCP数据包的确认,即:若发送端->接收端方向上有个TCP数据包中有确认号,则该确认号是对接收端->发送端方向上的之前某个TCP数据包的确认;反之亦然。
步骤S106、提取该TCP数据包的五元组,进行反向哈希查找,对反向的TCP流进行确认,在反向缓存队列中删除已经确认过的TCP数据包,并修改TCP首部的确认号,转步骤S107;
TCP数据包的五元组包括:源地址、源端口、目的地址、目的端口、协议类型。所述反向哈希查找是指将TCP数据包的目的地址、目的端口、源地址、源端口、协 议类型作为value进行哈希匹配。本步骤中提到的反向缓存队列是指反向哈希查找所查找到的队列。图2中头指针与尾指针所指向的TCP数据包就是一个队列的头与尾。
在之前的步骤S104中提到,TCP中间人处理模块会修改TCP数据包的载荷长度,因此为了维持TCP数据包序列号和确认号的准确性,需要对TCP数据包的序列号和确认号进行修改。在后面的步骤S107中完成了对TCP数据包序列号的修改,经序列号修改后的TCP数据包被发送到接收端,由接收端返回包含有确认号的TCP数据包,进而在本步骤中实现了对TCP首部的确认号的修改。
对TCP数据包的确认可通过将该TCP包的确认号与反向缓存队列中各个数据包的“期望确认号”进行比较实现,若该TCP包的确认号与反向缓存队列中某一数据包P1的“期望确认号”相同,则表明该TCP数据包时对该数据包P1的确认。在确认数据包后,修改TCP包的确认号,其计算式为:修改后的确认号=修改前的期望确认号-累计的offset。
步骤S107、以TCP数据包的五元组进行正向哈希查找,修改TCP首部的序列号,将该包插入正向缓存队列的队尾,并向前转发,转步骤S111;
所述正向哈希查找是指将TCP数据包的源地址、源端口、目的地址、目的端口、协议类型作为value进行哈希匹配。本步骤中提到的正向缓存队列是指正向哈希查找所查找到的队列。
本申请中提到的向前转发表示转发的方向与源TCP数据包发往的方向相同。
在本步骤中,修改TCP首部的序列号按如下计算公式:修改后的序列号=修改前的序列号+累计的offset;其中,累计的offset=队尾TCP包的累计的offset+该TCP数据包的offset。在修改TCP首部的序列号后,还需要为修改后的序列号计算“期望确认号”,期望确认号=修改后的序列号+修改后的TCP载荷长度;修改后的TCP包、累计的offset、期望确认号都存入缓存队列中。
步骤S108、确定该TCP数据包为重传包,判断该重传包是否已经被TCP中间人处理模块确认,若是,则转步骤S109,否则,转步骤S110;
本步骤中,采用如下方法对TCP数据包是否为重传包进行判断:若该TCP数据包的序列号大于TCP/IP重组过程输出的最大的序列号值,则说明该TCP包不是重传包,否则,该TCP包是重传包。
步骤S109、以该TCP数据包的五元组进行反向哈希查找,找到反向缓存队列中对应的TCP数据包,将缓存队列中对应的TCP数据包向后转发,丢弃原TCP数据包,转步骤S111;
本申请中的向后转发表示转发的方向与源TCP数据包发往的方向相反。
步骤S110、以该TCP数据包的五元组进行正向哈希查找,找到正向缓存队列中对应的TCP数据包,将缓存队列中对应的TCP数据包向前转发,丢弃原TCP数据包,转步骤S111;
步骤S111、该TCP数据包处理结束。
为了便于理解,下面结合图4,对本发明的方法做进一步说明。
如图4所示,客户端首先发送一TCP数据包,该TCP数据包的序列号Seq为c1,数据包长度len为l1,TCP中间人模块接收到该TCP数据包后,对该TCP数据包进行TCP/IP重组,并修改数据包长度,假设数据包长度增加Δ1,则修改后的数据包长度为l1+Δ1;为了维持TCP数据包序列号的准确性,TCP中间人模块在对该TCP数据包做转发前,还要将该TCP数据包的序列号增加Δ1,即修改后的数据包序列号为c1+Δ1。TCP中间人模块将这一TCP数据包做修改后,向服务器发送。
服务器接收到前述TCP数据包后,返回一个带有确认号的TCP数据包,该确认号表示为c1+Δ1+l1;为了维持TCP数据包确认号的准确性,需要从确认号值中减去Δ1,新的确认号为c1+l1;TCP中间人模块将这一确认号的TCP数据包返回给客户端。
TCP中间人模块对客户端之后发送的TCP数据包做同样的处理,即:在收到客户端发送的TCP数据包后,为该数据包的长度改变Δi,然后为了维持TCP数据包序列号的准确性,在转发前,将该TCP数据包的序列号增n加在收到接收端回复的确认号包时,把TCP数据包中的确认号值相应减去,再将确认号包发给发送端。
图5描述了TCP数据包在发送端与接收端之间的一个完整流程,结合该附图,对之前所描述的本发明方法中的步骤S108-步骤S110做补充说明。
在图5中,包1表示发送端发给接收端的一个包Packet1,包2表示Packet1经过TCP中间人模块处理过后的包Packet2,包3表示接收端收到Packet2之后,给发送端回复的确认包Packet3,包4表示Packet3经过中间人处理后的包Packet4。
当Packet3丢失时,发送端会发一个重传包Packet1,由于中间人没有收到Packet3,代表重传包Packet1没有被TCP中间人处理模块确认;此时,根据步骤S110的描述,在正向缓存队列中找到与Packet1对应的Packet2,将Packet2进行向前转发。
当中间人收到Packet3,而Packet4丢失时,发送端也会发一个重传包Packet1,由于中间人已经收到Packet3,代表重传包Packet1已经被TCP中间人处理模块确认; 此时,根据步骤S109的描述,在反向缓存队列中找到Packet1的确认包Packet4,将Packet4进行向后转发。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。