阳亦斌,欧盛芬,杨 将
(湖南中车时代通信信号有限公司,长沙 410119)
换装系统的网络安全防护方案充分采用已验证过的功能和技术。硬件方面采用支持国密算法的高性能安全芯片提供安全的密码服务功能,具备接口丰富、配置灵活、安全可靠的特点。软件方面提供了丰富的业务功能和强大的管理功能,为全面提升系统保障和维护服务质量水平提供有力支撑。LKJ车载数据无线换装系统的网络安全防护方案是1套具有高安全、高可靠、高性价比、可扩展性强、用户选择灵活的通用化、系列化成熟解决方案。
其中采用入侵检测系统实时检测网络中的违法攻击行为,与防火墙设备联动及时阻断攻击来源设备。在应对网络攻击时,Snort IDS具有实时分析数据流量和记录IP网络数据包功能。在协议分析时,根据规则对网络数据包内容进行搜索和匹配,进而检测各种不同的攻击方式,对攻击行为实时报警。作为一个开源的入侵检测系统,Snort具有很好的扩展性和可移植性。Snort采用实时处理网络入侵流量的方法,在日益增长的数据背景下,网络性能已成为瓶颈,需要在入侵检测系统中开发高效率的数据包捕获模块,以应对庞大的数据需求。
Snort IDS体系结构由4大软件模块组成:数据包嗅探模块、预处理模块、检测模块、报警/日志模块。检测模块作为核心模块,是制约Snort之类入侵检测系统的重要因素,其中一个因素就是对数据处理效率过低。这是由于Snort是基于Libpcap或Winpcap获取报文,需要频繁的内存拷贝和系统调用。而这些软件大多工作在单线程的工作模式,虽然结构简单,但是会使报文等待队列长时间处于阻塞状态,使报文处理能力严重受限。
DPDK对核心模块的收包部分进行有效提升,与传统采用中断方式对比,DPDK会在用户态采用轮询的方式对网络包进行收取,从而极大地提高收包的速率,最大化利用了程序分析数据包的能力。DPDK和Snort结合使用,会显著提高Snort网络I/O能力和处理数据包的效率。
由于Snort在设计之初网络数据量低,约为100 Mbit/s。面对当前网络数据量已经达到10~40 Gbit/s的量级时,Snort网络I/O和数据包处理能力已无法满足应用需求。针对LKJ数据无线换装系统高并发高流量的特点,以及Snort的应用现状,本文提出DPDK-Snort方案,采用DPDK技术对数据包IO进行模块化设计,引入数据捕获模块DAQ(Data AcQuisition Library),尝试在DAQ中加入DPDK的支撑。
换装系统总体结构包含LKJ车载系统、无线通信网络和地面系统,地面系统由IT基础架构和防护系统2部分组成。IT基础架构采用虚拟化、双机热备等技术保障数据换装业务系统稳定、可靠运行,满足100台机车同时并发性换装和3 000台机车同时在线接入需求。防护系统在IT基础架构基础上,根据国家信息安全等级保护基本要求对其进行全面的安全风险防范,以满足系统总体安全性应用需求。
换装系统总体结构如图1所示(橙色椭圆圈内为DPDK高速入侵检测系统)。
入侵检测(Intrusion Detection)作为一种积极主动的安全防护技术,被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测。在图1中,入侵检测系统部署在车地防火墙和内网防火墙网络边界旁路,通过网络监听所有设备的网络通信,并通过内置的攻击特征库识别网络中的攻击行为,对网络攻击行为进行记录。当发现存在入侵后,入侵检测系统会及时作出响应,包括切断网络连接、记录事件和报警等,供系统管理员通过运维审计系统对攻击行为进行识别和分析,有效提高了系统的安全管控能力。采用DPDK技术进行网络内部入侵行为探测与报警,在不影响网络性能的情况下,及时发现非LKJ协议数据并联动防火墙阻断,以满足对系统网络安全防护的要求。
图1 LKJ数据换装系统总体结构Fig.1 Overall structure of LKJ data reloading system
传统的Snort模块关系与运行架构如图2所示。
图2 传统Snort模块关系与运行架构Fig.2 Traditional snort module relationship and operation architecture
最新版本的Snort嗅探软件中,将数据包嗅探模块修改单独分离出来,使Snort可以进行用户自定义式的扩展和修改,因此对于传统入侵检测系统的改进,可以从改写数据包嗅探模块DAQ开始进行。即修改DAQ的代码逻辑和架构,使其可以支持DPDK的核心功能,进而达到高速包捕获的目的。
核心开发模块就是DPDK数据包嗅探模块,其他模块直接使用Snort原生的模块往下执行即可,加入DPDK后的Snort运行架构如图3所示。
图3 加入DPDK模块后的Snort调用Fig.3 Snort call after adding DPDK module
DPDK总体框架如图4所示,在网卡收包时底层通过intel提供的UIO接口来实现用户态和内核态数据包之间的零拷贝传递,然后通过DPDK库中的Driver驱动将数据包交给应用层的用户处理,DPDK框架提供各种功能库,比如:MEMORY、RING、MBUF、PDM、MEMPOOL等。
2.3.1 DPDK基本原理
DPDK应用程序运行在操作系统的用户态,利用自身提供的数据平面库进行数据包的处理,绕过了Linux的内核协议栈,从而提高了报文处理效率。DPDK的主要组件含义如下。
1)PMD驱动:代表轮询模式驱动,通过非中断方式和零拷贝机制,提高发送和接收数据帧的效率。
2)流分类:提供最优化的查找算法。
3)无锁环队列:DPDK基于Linux内核的无锁环形缓冲kfifo实现自己的1套无锁机制,支持单个或者多个数据包生产者、单个数据包的消费者的出入队列操作,有效减少系统开销。
4)MBUF管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧。
5)EAL抽象层:DPDK的环境抽象层,包括DPDK核心功能的加载和初始化,CPU亲和力处理,各种操作的接口,时钟,跟踪调试接口等。
综上所述,DPDK的核心思想。
1)用户态模式的PMD驱动,不使用中断而改用轮询的方式,避免内核态和用户态之间来回切换,有效提升I/O的吞吐能力。
2)用户态下运行,程序的崩溃不会影响到内核,实现内核的安全和稳定。
3)使用大页内存技术,减少内存Miss发生的概率。
4)多核设备上创建多线程,每个线程绑定到独立的物理核,充分利用DPDK对CPU的亲和性,减少线程调度的开销,同时每个线程对应独立免锁队列。
5)向量指令集,提升了流水线效率,降低内存等待开销。
2.3.2 DPDK特点
1)轮询:处理数据包时,在包处理时利用UIO提供的接口进行数据包的轮询,避免中断使系统状态切换的额外开销。
2)用户态驱动:避免不必要的内存拷贝和系统调用,便于快速迭代和优化。
3)亲和性独占:DPDK利用CPU的亲和性将一个线程或多个线程绑定到一个或多个CPU上,在线程执行过程中,不会被随意调度,减少了线程间的频繁切换带来的开销,避免了CPU缓存的局部失效性,增加了CPU缓存的命中率。
4)降低访存开销:利用内存大页hugepages,降低了访问内存转换时未命中的可能性,DPDK实现了一组大页内存分配、使用和释放的API,上层应用可以很方便使用API申请使用大页内存。同时也兼容普通的内存申请,通过更大的内存页(如1 G内存页),减少TLB(Translation Lookaside Buffer,即快表) Miss,Miss对报文转发性能影响很大。
2.4.1 Snort嗅探技术
Snort是1套开源的网络入侵检测系统,主要功能有包嗅探、包记录和入侵检测功能。
Snort能够对获取到的数据包进行特征分析,但区别于其他嗅探器的是它能自己定义分析的规则,只需要扩展它特定的模块。Snort通过对获取的数据包,进行各规则的分析后,根据规则链,可以采取Activation(报警并启动另外一个动态规则链)、Dynamic(由其他的规则包调用)、Alert(报警)、Pass(忽略)、Log(不报警但记录流量)5种响应的机制。
图4 DPDK框架图Fig.4 DPDK frame diagram
Snort有数据包嗅探、数据包分析、数据包检测、相应处理等多种功能。每个模块实现不同的功能,各个模块都是用插件的方式和Snort相结合,功能扩展十分方便。例如预处理插件的功能就是在规则匹配误用检测之前运行,完成TCP碎片重组、http解码、telnet解码等功能,处理插件完成检查协议等字段、关闭连接、攻击响应等功能,输出插件将各种情况以日志和警告的方式输出。
体系结构如图5所示。
图5 Snort体系结构Fig.5 Snort architecture
由图5可见,Snort主要由4大软件模块构成,分别是:
1)数据包嗅探模块:主要是负责监听数据包,对抓取到的数据包进行规则分析。
2)预处理模块:数据包被送到各种各样的预处理器中,在检测引擎处理之前进行检查和操作。每个预处理器检查数据包是否应该注意、报警或者修改某些东西。
3)检测模块:是Snort的核心模块,当数据包从预处理器送过来之后,检测引擎先根据规则检查数据,规则中的每个关键字选项对应于检测引擎插件,能够提供不同的检测功能,只要发现数据包中的内容和某些规则相匹配,就通知报警模块。
4)报警和日志模块:规则匹配之后输出报警信息,并传送给日志文件。
2.4.2 Snort模块调用
Snort 2.9版本后,为数据包的捕获功能实现引入了DAQ,也可以称作数据采集库。DAQ取代了之前版本中对libpcap或winpcap的直接调用,具有抽象层的功能,因此可以非常方便地进行扩展,便于在各种硬件或者软件接口上操作,调用Snort执行pcap时,也可以设置DAQ的运行类型和模式。
DPDK提供了友好的API,Snort的DAQ模块的扩展规则是需要符合基本的要求,即可以插入到Snort中,为主要框架流程设计,如图6所示。
图6 DPDK-Snort设计框架Fig.6 DPDK-Snort design framework
根据DPDK提供给的API,再结合Snort的扩展DAQ模块的编写规则,可以编写出DPDK-DAQ的模块,以此来拓展Snort的数据包嗅探功能,为之后Snort的数据分析提供大量可用的数据包,以此提升入侵检测系统的处理性能。
其中DAQ是Snort的包捕获模块,在Snort初始化时,先载入DAQ模块,如图7所示。
图7 Snort初始化过程Fig.7 Snort initialization process
在Snort初始化时载入DAQ模块,此时Snort调用的API是daq_load_modules,主线程还没有启动网卡和初始化实例。在初始化Snort之后(载入默认配置,载入DAQ和其他各个模块后),Snort进入分析数据包的阶段,此时起作用的是pig线程,或者更加精确的说,是pig下的analyzer子线程,Snort下开启n个pig线程,在pig主线程下再调用analyzer子线程进行数据包解析,数据包解析的过程是在pig线程中,多线程并行进行,在每一个analyzer线程下都初始化一个DAQ实例,并调用函数acquire进行数据包分析,在每一个DAQ下都使用多个网卡来获取数据,逻辑关系如图8所示。
图8 DAQ线程逻辑关系Fig.8 DAQ threads logical relationship
从图8中可以看出,在一个Snort下面有多个DAQ instance并行运行,每一个DAQ instance都会进行初始化操作,占用系统资源,获取网卡信息,数据包捕获与解析,pig线程之间相互独立,导致DAQ instance之间也相互独立,为单线程运行。
根据以上思想,可以开始DAQ和DPDK的结合工作,从而在Snort中运行模块修改后的DAQ模块,从而提高数据包捕获的效率。
在LKJ车载数据无线换装系统实验室环境下,实现对DPDK-Snort模块的性能测试。
1)Snort和包捕获模块DAQ的环境配置和测试。
2)DAQ模块扩展的尝试,找到一个合适的方式,参考DPDK的包捕获模块DPDKCAP的核心代码部分,根据Snort的DAQ编写规则,写出DPDK-DAQ,加入到Snort中的DAQ包捕获模块核心部分,从而提高获取数据包的速度和效率。
3)尝试扩展模块后,使得入侵检测系统能够高效地获取数据包,从而实现入侵检测。
2.6.1 DAQ模块安装
Snort在面临大数据流时处理效率低,甚至会卡死,此时使用DPDK开发加速对网络数据包的抓取,从而增大Snort对数据包的分析速率,在最新的Snort2.9版本中,针对数据包I/O提出模块化的思想,引入数据捕获模块DAQ,可以尝试在DAQ中,加入对DPDK的支持。
首先在IDS虚拟机中安装DAQ模块,使用如下指令,如图9所示。
图9 DAQ安装指令Fig.9 DAQ installation instructions
之后make和make install,提示编译和安装完成。
2.6.2 DAQ模块替换
使用如下指令进行DAQ模块的替换和加载DPDK的Snort的运行:
sudo Snort --daq-dir /usr/local/lib/daq/--daq dpdk --daq-var dpdk_args="-c 1" -i dpdk0:dpdk1 -c /usr/local/etc/snort/snort.lua-z 2
其中各个参数的含义如下所示:
--daq-dir:DAQ动态运行库的路径。
--daq dpdk:限定Snort使用DPDK模块的方式运行。
--daq-var dpdk_args="-c 1":DPDK的运行参数,按照默认配置运行。
-i dpdk0:dpdk1:选择DPDK接口。
-z 2:DPDK的线程设置,这里选择2个包捕获线程。
之后运行加载DPDK的Snort,发现与普通的Snort运行界面无任何区别,为了检测其效果,之后进行抓包测试。
2.6.3 运行测试
为了能够直观明了地显示加载DPDK之后的抓包效果,首先在两个客户机上部署了相应的发包工具小兵以太网测试仪,编译成功后,会生成一个./target/xb_ether_tester.exe的程序,运行程序后构造数据包并设置发送规则进行测试。
为了检测数据包接收效率,首先将客户机软件上发包工具中的发包速率部署到一个非常高的数值,之后进行发包测试,经过一段时间后停止,对比客户机上的报文发送数量和Snort面板上的数据包接收数量,进行对比,计算出收到包和发送包的比例,从而验证是否存在接收数据包效率的提高。
这里在发包速率上选择4.46、5.00、5.49、5.97、6.49、6.98、7.49、7.797、8.41、8.93、9.49、9.74、10.00、10.49、10.98、11.5 Gbit/s几组数值,每次增加约为0.5 Gbit/s的数据包发送速率,通过两方对比得到相应的结果,并绘制折线图,结果如图10所示。
图10 接收包比例折线图Fig.10 Scale line chart of receiving package
可以发现在小于10 Gbit/s的数据量时,加载DPDK模块的Snort可以基本实现100%的数据包接收率。在高于10 Gbit/s后,数据包接收比例开始呈现出下降的趋势。10 Gbit/s时约为0.997,10.49 Gbit/s时 约 为0.92,10.98 Gbit/s时 约 为0.82,11.5 Gbit/s时下降到0.7左右。而在传统的Snort中断接收下,大约1 Gbit/s,数据包的接收效率就难以达到100%,且经常因数据量过大而导致应用卡死,可以看出在加载DPDK后,数据包的接收效率得到了成倍的提高。但是随着数据量的进一步增加,DPDK接收的效率也在下降,这也是今后需要进一步研究和改善的问题。
通过编程和架构设计,在DPDK平台基础上实现了高性能的入侵检测系统,从LKJ车载数据无线换装试验过程中可以验证,在数据量进一步增加的情况下,传统的中断处理方式已经越来越难以适应需要,需要采用其他方式提高数据包收发效率。DPDK已证明是一个很好的解决方案,在传统的Snort下,加入DPDK模块的支持,可以成倍提高收发包的效率,从而提高入侵检测系统的安全性和健壮性,有效保障了基于公共移动通信网络进行LKJ车载数据换装业务的安全性和可靠性。