一种高性能Kernel-Bypass透明代理系统
文献发布时间:2023-06-19 11:44:10
技术领域
本发明涉及计算机网络的技术领域,特别是涉及一种高性能 Kernel-Bypass透明代理系统。
背景技术
随着SSL/TLS协议的普及,网络DLP系统需要全面接管数据流量,才能对数据进行检查。目前传统透明中间人使用内核协议栈来实现TCP连接的代理。但由于内核协议栈的使用存在锁冲突,以及用户态和内核态之间的切换带来的性能损耗,性能很难得到提升,包括局部修改算法还是增加硬件的规格。
所以需要一种代理系统,可以通过增加硬件的规格来线性的增加性能。
发明内容
为解决上述技术问题,本发明提供一种通过提升硬件性能线性的提升代理系统的性能的高性能Kernel-Bypass透明代理系统。
本发明的一种高性能Kernel-Bypass透明代理系统,包括多进程模式下的数据分流和使用用户态协议栈的透明代理;
所述多进程模式下的数据分流分为分流进程和工作进程,分流进程通过网卡的收队列收取数据包,通过分流算法将数据包分流到不同的工作进程中;
所述使用用户态协议栈的透明代理通过用户态协议栈创建一个虚拟网卡,所述虚拟网卡上设置一个虚拟IP地址,一个TCP代理会话分为四个方向,这四个方向分别对应四个转换,所述四个转换分别为:c2p,目的地址替换成代理IP;p2c,源地址替换成Server IP;p2s,源地址替换成Client IP和s2p目的地址替换成代理IP。
本发明的一种高性能Kernel-Bypass透明代理系统,TCP连接建立包括以下步骤:
S1、客户端发起TCP连接,数据包为:客户端到服务端,SYN;
S2、透明代理模块判断为SYN包,查询ACL表,判断此连接需要代理,则根据数据包中的四元组信息和ACL表中的信息创建c2p,p2c 表;
S3、透明代理在接受客户端的连接后,根据客户端返回的地址信息,还有服务端地址信息创建p2s,s2p表;
S4、然后透明代理向服务器发起连接,此时的地址信息为:代理地址到服务端地址;
S5、透明代理根据之前建立的p2s表项修改数据包中的数据,修改为:客户端地址到服务端地址,发送到服务器。
本发明的一种高性能Kernel-Bypass透明代理系统,其中TCP数据传输包括以下步骤:
客户端到服务端流程:
1)、客户端发往服务端的数据,数据包中的地址为:客户端地址到服务端地址;
2)、网桥查询c2p表,将数据包中的地址替换为:客户端地址到代理地址,然后将数据发送到代理;
3)、数据自底向上依次通过各协议模块进行处理,然后自顶向下依次通过各协议模块处理,通过系统协议栈发送到网桥,此时数据包中的地址为:代理地址到服务端地址;
4)、网桥查询p2s表,将数据包中的地址替换为:客户端地址到服务端地址;
服务端到客户端流程:
a)、服务端发往客户端的数据,数据包中的地址为:服务端地址到客户端地址;
b)、网桥查询s2p表,将数据包中的地址替换为:服务端地址到代理地址,然后将数据发送到代理;
c)、数据自底向上依次通过各协议模块进行处理,然后自顶向下依次通过各协议模块处理,通过系统协议栈发送到网桥,此时数据包中的地址为:代理地址到客户端端地址;
d)、网桥查询p2c表,将数据包中的地址替换为:服务端地址到客户端地址。
与现有技术相比本发明的有益效果为:通过提升硬件性能线性的提升代理系统的性能。
附图说明
图1是本发明多进程模式下的数据分流的逻辑流程图;
图2是本发明TCP连接建立阶段的逻辑流程图;
图3是本发明TCP数据传输阶段的逻辑流程图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
一种高性能Kernel-Bypass透明代理系统的技术方案包括两个方面:多进程模式下的数据分流和使用用户态协议栈的透明代理;
多进程模式下的数据分流
如图1所示,出于性能的考虑,本发明使用的协议栈为用户态协议栈,但已存在的用户态协议栈大多由现有操作系统的协议栈修改而成,例如f-stack(freebsd),lkl(linux)存在很多全局的数据结构不适用于多线程结构,所以本发明使用多进程结构。
系统分为分流进程(Distributor)和工作进程(Worker),分流进程通过网卡的收队列收取数据包,通过分流算法将数据包分流到不同的工作进程中,例如图1所示,系统包括两个多队列网卡(NIC0、 NIC1),每个网卡的读队列(rx)为1,写队列(tx)的个数为3(写队列的个数=分流进程的个数+工作进程的个数),一个分流进程 Distributor,两个工作进程worker0,worker1;
其中分流算法一般为,用户完整性算法,以tcp syn源ip做 hash。
数据流的具体步骤以图1为例
1.分流进程首先需要绑定到CPU CORE0,实时轮询读取网卡 NIC0的读队列rx0和网卡NIC1的读队列rx0。两个工作队列 worker0和worker1分别绑定到CPU CORE1和CPUCORE2;
2.分流进程读取到数据包后,通过分流算法来判断数据包被分流到那个工作进程(worker0或者worker1),数据包通过进程间通信无锁队列(ring)传递给工作进程;
3.工作进程通过无锁队列(ring)收取数据包后,将数据包提交给透明代理模块,透明代理模块负责数据的透明化处理以及上层的用户态协议栈处理,处理完数据后,代理可能会吐出两个方向的数据包,一个方向是NIC0,一个方向是NIC1,工作进程会根据数据包的发送方向,将数据包发送到对应网卡的对应发队列。
使用用户态协议栈的透明代理
TCP透明化原理
用户态协议栈会创建一个虚拟网卡,虚拟网卡上会设置一个虚拟 IP地址,我们称之为代理IP,一个TCP代理会话分为四个方向,这四个方向分别对应四个转换表:
TCP连接建立阶段
如图2所示:
1.客户端发起TCP连接,数据包为:(客户端到服务端,SYN);
2.透明代理模块判断为SYN包,查询ACL表,判断此连接需要代理,则根据数据包中的四元组信息和ACL表中的信息创建c2p, p2c表;
3.透明代理在接受客户端的连接后(ACCEPT),根据客户端返回的地址信息,还有服务端地址信息创建p2s,s2p表;
4.然后透明代理向服务器发起连接,此时的地址信息为:代理地址到服务端地址;
5.透明代理根据之前建立的p2s表项修改数据包中的数据,修改为:客户端地址到服务端地址,发送到服务器。
TCP数据传输阶段
如图3所示
客户端到服务端流程
1.客户端发往服务端的数据,数据包中的地址为:客户端地址到服务端地址;
2.网桥查询c2p表,将数据包中的地址替换为:客户端地址到代理地址,然后将数据发送到代理;
3.数据自底向上依次通过各协议模块进行处理,然后自顶向下依次通过各协议模块处理,通过系统协议栈发送到网桥,此时数据包中的地址为:代理地址到服务端地址;
4.网桥查询p2s表,将数据包中的地址替换为:客户端地址到服务端地址。
服务端到客户端流程
1.服务端发往客户端的数据,数据包中的地址为:服务端地址到客户端地址;
2.网桥查询s2p表,将数据包中的地址替换为:服务端地址到代理地址,然后将数据发送到代理;
3.数据自底向上依次通过各协议模块进行处理,然后自顶向下依次通过各协议模块处理,通过系统协议栈发送到网桥,此时数据包中的地址为:代理地址到客户端端地址;
网桥查询p2c表,将数据包中的地址替换为:服务端地址到客户端地址。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变型,这些改进和变型也应视为本发明的保护范围。
- 一种高性能Kernel-Bypass透明代理系统
- 一种多线程高性能http代理实现方法及系统