基于FPGA实现的报文分类智能网卡

时间:2022-10-24 07:22:04

基于FPGA实现的报文分类智能网卡

【 摘 要 】 一般的网络安全应用软件,只对网络中的某类报文进行处理,基于通用的网卡采集网络数据,会收到大量的无用报文,降低系统效率。本文基于FPGA和零拷贝技术,设计并实现了一种智能网卡,将报文分类过滤工作下移到网卡硬件中实现,智能网卡完成了网络数据包报文捕获、报文分析、规则匹配等工作,可以过滤掉无用报文,只把应用关心的报文提交给到主机系统。与普通网卡相比,智能网卡可以有效提升网络数据采集的效率。

【 关键词 】 智能网卡;FPGA;报文分类

1 引言

在信息安全应用领域中,网络安全应用软件从底层的网卡硬件和操作系统的协议栈收取报文,网卡和协议栈软件负责对网络数据包进行收发和处理。对网络数据的传输工作消耗了大量的CPU计算资源。随着万兆带宽时代的到来,一味通过提高服务器CPU的工作频率、扩充服务器内存等方法来提升服务器对网络数据包的处理速度,将会面临功耗、成本、机房散热等一系列瓶颈。更重要的是,服务器CPU对网络数据的处理能力并非随CPU速度的增长而线性增长。如果CPU的很多开销是进行响应中断、数据拷贝、校验、对网络数据包的地址进行过滤等比较简单但费时的I/O类操作,其能够为应用层处理软件提供的计算能力将受到很大影响,从而影响应用层处理软件的速度与性能。

通过取消UC(Un-cacheable)模式、采用零拷贝、数据预取等方式,可在一定程度上提高网络数据处理能力,但其对上层CPU负载卸载有限。现有部分NIC可提供校验和计算并减少CPU约10%的负载,但是对于64字节小包来说,使用NIC卸载校验和运算对于降低CPU使用率并无多大帮助,这是因为校验和运算是基于字节的运算,因此卸载校验和对于大数据报文比较有效而对64字节小包效果很小。利用硬件处理的高速性以及可并行处理的特性,可将比较简单但费时的I/O类操作由智能网卡来完成,从而有效降低CPU工作负载并提高网络数据报文的捕获能力,特别是对密集小报文的处理能力。现有的高速FPGA具有丰富的逻辑运算资源,非常适合处理高速的网络数据报文,从而配合服务器应用层处理软件提供更高的网络数据报文捕获与处理能力。

本文介绍的一种智能网卡实现将报文分析和分类过滤工作完全下移至智能网卡中,由智能网卡上的高速FPGA实现硬件的报文分类,把上层不需要的流量直接过滤调,把上层需要的流量打上协议标签提交给服务器的应用层数据处理软件处理,由应用层数据处理软件对智能网卡获取的网络数据进行应用层数据的解析。

智能网卡通过PCI-E接口与服务器进行通信与管理,并通过加载配置文件和调用API接口的方式,实现IP 、端口以及协议规则的动态更新。由此大大提高服务器网络报文的处理能力,减轻上层CPU的负载。

文章共分为四个部分:第一部分分析了智能网卡的总体架构;第二部分介绍了关键技术;第三部分介绍了智能网卡的测试结果及分析;第四部分对全出总结。

2 智能网卡体系结构

与普通网卡相比,智能网卡增加了报文的协议分析和根据用户配置规则对报文分类的功能,这部分处理逻辑在FPGA中用硬件实现,在板载RAM中存储过滤规则和缓冲报文,并基于零拷贝驱动把过滤后的报文传给上层应用程序。上层系统管理员可基于配置管理程序分析、建立、修改规则配置文件,通过驱动提供的接口实现FPGA中过滤规则的实时更新和网卡状态监控。智能网卡的逻辑结构如图1所示。

在FPGA芯片上,分为GIGABIT MAC模块、规则设置模块、规则查找模块、DDR3 SDRAM控制器、QDR SRAM控制器、PCI-E接口等六大部分。千兆以太网控制模块主要功能是数据流的反压、MAC侧数据MIB信息的监控、报文的CRC校验、包长度设置、将接收到的链路层数据的前导码和CRC去掉,给后续模块,将发送的报文加上前导码和CRC发送出去,检测报文是否为IP报文,根据软件的设置开启VLAN工作模式并把五元组信息提取出来给后续模块。

规则查找与设置模块其主要功能为根据应用软件的配置,更新硬件中的规则表。并根据接收到报文的五元组信息在规则表中查找,如果找到,则根据规则指定的动作丢弃报文或上传报文至CPU。PCI-E接口模块主要实现上传报文到CPU、下载规则到FPGA、配置FPGA内部寄存器、监控FPGA内部工作状态、根据EEPROM中的内容做PCI-E的基本配置。DDR3 SDRAM控制器和QDR SRAM控制器分别实现DDR3 、QDR总线仲裁机制及配置控制。

3 关键技术实现

3.1 报文处理

FPGA内部的报文处理过程有两个大的执行模块,报文的接收模块和五元组过滤模块,模块间的接口是一个报文索引FIFO队列。先入先出报文索引缓冲队列是FPGA内不同功能模块间的主要接口,一个模块处理完报文后,把报文索引放入另一个模块的输入队列,由另一个模块从队列中取出报文索引,作进一步处理。

报文索引缓冲队列中保存报文在DDR3中的缓冲区索引,同时也是报头信息(包括五元组、Payload偏移等)在BRAM中的存储区索引。系统初始化时,所有的缓冲区空闲可用,全部缓冲区的索引都放在全局可用队列中。当接收到报文时,接收模块从全局可用缓冲区队列获得一个空闲缓冲区索引,把报文存入缓冲区后,把缓冲区索引送入报文过滤的输入队列。

报文过滤模块处理完缓冲区内的报文后把报文缓冲区索引再放入全局可用缓冲队列。报文上传和丢弃也分别有一个队列,作为命中动作执行模块的输入队列。报文接收模块分为两个子模块:报文缓冲模块和链路层过滤模块。负责把MAC来的报文在片内缓冲,如果不是IP报文,则丢弃,如果是IP报文则缓冲到DDR3。当报文在片内缓冲时,报头信息提取模块负责把报头中的五元组信息提取出来,存入BRAM中。

报文过滤模块包括几种。

(1)并发流匹配模块

负责根据存在BRAM中的报文的五元组,到DDR3中的并发流hash表中寻找该报文对应的流,如果找到,则根据该流的命中动作,把报文索引放入丢弃或上传队列。如果找不到,则把该报文交给规则匹配模块进行五元组规则的匹配。

(2)规则匹配模块

当一个报文是一个流中的第一个报文时,在并发流hash表中没有该流的表项,因此并发流匹配模块不能决定对该报文的动作,这时需要规则匹配模块负责查找五元组规则表,(也是一个hash表),把报文五元组和查找到的规则表项比较,不管是否命中规则,规则过滤模块都会通知规则控制模块把该报文的五元组和对应动作写入并发流表,(可认为没有命中五元组规则的报文命中了默认的上传规则)。并把报文索引放入丢弃或上传队列。

(3)规则和并发流控制模块

当一个新的流被规则匹配模块发现后,把该流的五元组写入并发流表。另外,每条规则有一个生存期,保存在一个规则生存期数组中,(如果规则的生存期无限长,就用0表示),规则控制模块负责每隔一秒轮询一遍规则的生存期数组,把生存期减少,对生存期从1降到0的规则,把有效标志位置为无效。同样,对并发流中的每一个流,该模块也处理其超时。

(4)命中动作执行模块

当一个报文在并发流表中匹配上相应的五元组后,根据该流应该采取的动作,报文的索引会进入丢弃或上传队列,同样,一个报文在规则表中命中了某条规则后,也会进入丢弃或上传队列。动作执行模块的作用就是从丢弃和上传队列中获取要处理的报文索引,执行相应的动作。上述功能模块和报文流经各模块的情况如图2所示。

3.2 五元组规则匹配算法

智能网卡支持多达5万条五元组规则过滤,每一个规则通过hash运算进入hash表,每一个报文通过hash运算查找hash表中的规则,从而规则数增加不会引起规则读取时QDR SRAM压力的增加,可扩展性较好。这里需要解决的是五元组掩码的问题,方法如下:A)把规则加上每个元素(IP、协议、端口)的掩码标志,构成固定的规则;B)把规则存入一个Hash表中;C)对收到的每个报文的五元组信息,也加上每个元素的掩码规则,构成(32-1)个五元组待匹配项;D)每个待匹配项通过Hash表查找规则,进行匹配。上述过程如图3所示。

下面结合上图举例说明规则匹配过程。假设规格式为(掩码)(五元组)(其它),掩码表示五元组的哪一元素有效,五元组为源地址ip、目的地址IP、协议、源地址端口、目的地址端口,其它信息包括规则编号和命中动作等,这里省略。配置文件中有两条规则,第一条规则规定从10.0.0.1发出的报文,第二条规则规定发送到10.0.0.1的报文,两条规则经过hash运算写入hash表的m和n位置。假设一个从10.0.0.1到10.0.0.2的ICMP(协议号为0)报文,报文的五元组(实际是三元组)首先要经过一个“带掩码五元组”产生器,这里要把五元组配上不同的掩码产生出多个(三元组7个,五元组31个)与规则相同格式的结构。在这里产生的是:(10000)(10.0.0.1, 0, 0, 0, 0)等。每一个带掩码五元组经过hash运算得到对应的规则在hash表中的位置,取出规则进行比较。比如本例中掩码在第一位的五元组经过hash运算也会得到m,因为它实际上与第一条规则相同。但是掩码在第二位的五元组经过hash运算不能在hash表中得到匹配的规则。上面的掩码五元组产生器和比较器有多个并行以保证报文处理速率。

4 性能评价

为测试智能网卡的性能,我们采用Ixia网络测试仪表和曙光网络流量审计软件,对智能网卡进行了系统资源占用率、吞吐率、帧丢失率测试。测试主机采用曙光I610服务器(CPU: Intel Xeon 5500、4G内存、OS:Linux2.6.18)。智能网卡和网络测试仪采用光纤直接相连。

在加载100000条五元组过滤规则情况下上层系统CPU资源占用率和内存占用率均为0.00%。因智能网卡对网络数据包的处理不需要上层CPU参与,存储资源也采用板上存储资源,故上层CPU占有率和内存占用率均为0.00%。普通libpcab千兆网卡因其存在大量的用户态和内核态数据拷贝导致上层CPU负载非常高。基于零拷贝驱动的千兆网卡虽没有用户态和内核态数据拷贝导致的上层CPU开销,但在海量数据包到达时,大量的中断和频繁的进程切换同样导致较大的上层CPU负载。

在内存消耗方面,零拷贝网卡需在用户空间开辟固定大小的数据缓冲区,其内存占用率固定。智能网卡和基于libpcab千兆网卡及基于零拷贝千兆网卡100000条五元组规则过滤系统资源占用率测试结果对比如图4所示。

吞吐量测试时在发送端指定发送速度,在接收端上计算收到的帧的速度。吞吐量是接收器收到的好帧数量/时间,测试通过改变帧长度,重复以上测试得到不同速率下的测试结果。测试中,采用了100000条五元组过滤规则,线速发包来计算不同包长度下的吞吐量,测试结果如图5所示,可以看出,智能网卡因采用板级FPGA逻辑,可充分利用硬件的并行性,与基于libpcab千兆网卡及基于零拷贝千兆网卡吞吐量相比,在64字节小包下可获得近30倍的加速比。

5 结束语

基于FPGA的智能网卡可以在硬件中实现报文的分类和过滤,有效卸载应用软件进行底层网络报文处理的开销,在高速网络上的网络安全应用软件,如果基于智能网卡开发报文捕获和数据采集功能,会大大提升系统的整体性能。

参考文献

[1] 田志宏,方滨兴,云晓春等. RTLinux下基于半轮询驱动的用户级报文传输机制[J].软件学报,2004,15(6):834-841.

[2] 杨 武,方滨兴等. 基于Linux系统的报文捕获技术研究[J].计算机工程与应用,2003,26:28-30.

[3] K Compton, S Hauck. Reconfigurable Computing : A Survey of Systems and Software [J] ACM Computing Surveys, 2002;34(2).

作者简介:

刘朝辉(1980-), 男,毕业于清华大学,硕士研究生;现任曙光信息产业股份有限公司研发中心副总经理兼网络安全产品部经理。

上一篇:如何加强电力企业队伍建设管理探讨 下一篇:隧道施工临时弃渣堆载与车辆荷载同时作用对桩...