基于VxWorks的IP层数据包监听技术研究*
2023-06-05张国超
张国超 周 畅
(上海船舶电子设备研究所 上海 201108)
1 引言
VxWorks 操作系统是美国风河(WindRiver)公司于1983年设计开发的一种嵌入式实时操作系统。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中[1~2]。
随着计算机技术的飞速发展和互联网时代的到来,很多不法分子利用操作系统安全漏洞编写计算机病毒、木马等植入程序窃取、篡改设备中重要信息[3],对用户造成不可估量的损失。近年来针对VxWorks 操作系统的漏洞展开的网络攻击频现,VxWorks 操作系统是目前全球成熟度最高和应用最为广泛的嵌入式实时操作系统之一,并且很多诸如医疗基础设施、航空航天、船舶等关键基础设施及军事相关行业都对VxWorks 操作系统有着广泛的应用,因此针对VxWorks操作系统的网络安全研究迫在眉睫,而网络攻击的识别是网络安全中重要的一个环节,数据包监听技术是网络攻击检测的较为有效手段之一。数据包监听技术通过捕获特定过滤条件的网络数据包进行综合分析实现对数据来源、流量、数据内容、时戳等重要信息全面监控的功能,是系统级网络调试的重要技术手段之一,也是识别恶意网络攻击等网络安全威胁的关键技术方法[4]。在Unix/Linux 类操作系统中,数据包监听技术主要是基于开源软件libpcap[5~6],在Windows类操作系统中,常用的网络数据包监听技术是基于WinPcap函数库进行二次开发的,著名的Wireshark软件就是基于该技术的具体实现[7],但目前libpcap和WinPcap 函数库并不支持VxWorks 操作系统,为解决这一紧迫需求,本文提出了几种基于MUX 接口、伯克利封包过滤器(BPF)和原始套接字三种技术方式实现VxWorks 操作系统网络数据监听和捕获技术,并在本文最后给出了三种方式的实验结果及结果分析情况。
2 VxWorks的网络协议栈
VxWorks 中的网络协议栈叫作SENS(Scalable Enhanced Network Stack),即可裁减增强网络协议栈。SENS 是基于4.4 BSD TCP/IP 协议栈发展而来的,包含了许多4.4 BSD TCP/IP 协议栈没的协议;而且SENS在实现一些协议功能时增加了许多新特性,如在IP 协议实现时增加了多播功能。SENS 的基本特征和传统的TCP/IP 网络协议栈相似,但SENS最大的特点是在数据链路层和网络协议层之间多了MUX层。在SENS中,网络接口的驱动程序是叫作END(Enhanced NetworkDriver),即增强型网络驱动程序,它处于数据链路层。IP层和TCP/UDP层合称为网络协议层。在数据链路层和网络协议层之间有应用程序接口(API),这个接口在SENS中叫作MUX(Multiplexer)接口[8]。MUX 接口的作用是分解协议和网络驱动程序,从而增强独立性,这种独立性使得增加新的驱动程序和协议变得很简单,可以利用这一机制,创建用户自主协议栈,通过修改stackRcvRtn 函数,将网络数据直接返回给用户,实现数据包侦听的功能[9]。
可以利用mux 层进行网络数据的监听和嗅探。首先可以利用VxWorks特有的mux 层,注册一个自定义网络驱动,直接截获网络数据,并根据过滤条件返回给用户进程,达到报文捕获的目的。其次,VxWorks 的TCP/IP 协议栈支持BPF 过滤器,可以利用BPF 技术进行报文捕获。最后,VxWorks 的协议栈与BSD协议栈兼容,可以利用原始套接字进行报文捕获。
3 MUX层抓包技术
Mux 层允许用户自主开发协议栈,一个mux 网络协议至少包括以下四个接口:协议栈卸载回调函数接口stackShutDownRtn,数据接收错误处理函数接口stackErrorRtn,数据接收回调函数接口stack-RcvRtn,重启被协议栈函数接口stackTxRestartRtn。以上四个接口函数中,对于数据监听最重要的函数是stackRcvRtn,网卡接收到的以太网数据时自动调用该函数,返回到系统内核,当该函数的返回值设置为FALSE 时,网络协议栈接收到的数据直接返回给用户,实现数据包的捕获和侦听的功能,用户可以根据接收的数据头部进行定制的数据报文的过滤和抓取。在设计好stackRcvRtn 等用户自定义四个函数后,通过muxBind 系统接口进行协议的注册,即可完成。可以利用这一机制,修改stackRcvRtn 函数,将网络数据直接返回给用户。具体流程如图1所示。
图1 Mux层数据包截取流程图
muxBind 的第一个和第二个参数分别传递网卡的名称和序号,例如pci0,接下来的四个函数指针分别指向回调函数,默认处理可传递NULL 指针。在捕获数据帧应用时,只需要定义接收回调函数stackRcvRtn,该函数将从内存池中返回M_BLK结构体指针,通过解析MBLK 的mBlkHdr 数据段mData,完成数据包的过滤和捕获。以太网数据类型报文是我们最为关心的报文类型,IP数据包报文头部的组织格式如图2所示。
图2 数据链路层和IP层数据报头部示意图
4 BPF报文捕获技术
伯克利封包过滤器(Berkeley Packet Filter,BPF)是类Unix 系统上数据链路层的一种原始接口,提供原始链路层数据包的收发,可以用于监听链路层数据[10],如tcpdump 程序就是基于该技术进行开发的。应用进程通过系统调用open 创建并打开一个BPF设备,并利用若干ioctl命令配置BPF设备,把它关联到某个网络接口,并安装过滤程序从而能够选择性地接收输入的分组。BPF 设备经过适当配置,能够根据过滤程序的定义丢弃或接收输入的分组,过滤程序的定义类似于伪计算机指令。可以将网卡设置为混杂模式,这一可以收到网络上所有经过交换机的数据包,不管它们的目的地址是不是所在主机,从而实现数据包侦听的功能。除此之外,BPF 支持“包过滤”功能,可以将满足过滤条件的数据包拷贝到应用层,避免从操作系统内核向用户态复制不需要的数据包,降低抓包过程中CPU的负担及所需的缓冲区空间,从而降低丢包率。
BPF 的过滤功能是以BPF 虚拟机机器语言的解释器的形式实现的,这种语言的程序可以抓取封包数据,对封包中的数据采取算数操作,并将结果与常量或封包中的数据或结果中的测试位比较,根据比较结果决定是否拒绝封包。
BPF 实现数据包截取的流程如图3所示。BPF过滤器写法类似于汇编代码,BPF 常用指令对照表如表1所示。BPF 过滤器的可能写法是:使用BPF_LD 将k 值存入寄存器A 中,使用BPF_JMP 将A中的值与k进行比较,实现指令的跳转,可以跳转到下一步的过滤指令,或者跳转到BPF_RET 进行截取包长度的限制,如果,截取包的长度为0,则代表未匹配。
表1 BPF过滤器指令对照表
图3 数据链路层和IP层数据报头部示意图
5 原始套接字报文捕获技术
vxWorks 网络编程支持BSD4.4 TCP/IP 兼容的编程接口,在TCP/IP 网络应用中,同通信的两个任务间主要模式是客户端/服务器模式(C/S),即客户首先向服务器提出服务请求,服务器收到请求后,提供相应的服务。原始套接字(Raw socket),工作在数据链路层,而其他类型的套接字工作在传输层,只能进行传输层的数据收发,只接收目标地址是本机的数据包,而原始套接字可以通过设置网卡混杂模式,接收所有经过网卡的数据包,我们可以使用原始套接字这一特点进行数据监听[11~12]。当网卡除以混杂模式下能够接收包括广播在内的所有经过网卡的数据包。使用原始套接字进行数据监听的流程如下:
1)通过设置套接字类型为SOCK_RAW 创建原始套接字
2)通过ioctl指定网卡为混杂模式
3)通过recv()函数进行数据包的接收
4)针对接收到的数据包进行包头判断,拷贝满足条件的报文到缓冲区。
6 试验结果及分析
为了对比本文提出的三种报文捕获方法,首先需要搭建软件运行的目标环境,利用Vmware 虚拟机软件创建VxWorks 操作系统虚拟机作为目标环境,然后分别设计良好网络环境、中等网络环境和拥堵网络环境三种试验条件下,测试本文提出方法的报文捕获功能及性能。试验环境搭建步骤如下:
1)利用Workbench3.2 创建并生成VxWorks6.8的引导文件和镜像文件(需要配置网卡为lnPci);
2)在VMware虚拟机安装dos6.22引导系统;
3)利用dos 引导并启动步骤1)中编译好的Vx-Works 镜像,使用上述方法创建vxWorks6.8 虚拟机环境,并利用文中的三种方法进行IP 层数据包捕获。为验证三种方法的网络数据抓包性能,使用VC6.0 编写UDP 发送客户端软件,并分为以下三种网络环境下进行试验,几组试验场景:
(1)良好网络环境:利用UDP 发送客户端软件以每包间隔1ms 的频率发送10000 包长度为1400字节的测试数据,并利用共享内存方式统计接收到的数据包量;
(2)中等网络环境:利用UDP 发送客户端软件不间断的连续发送10000 包长度为1400 字节的测试数据,并利用共享内存方式统计接收到的数据包量;
(3)拥堵网络环境:同时运行5 个UDP 发送客户端软件,分别不间断的连续发送10000 包长度为1400 字节的测试数据,并利用共享内存方式统计接收到的数据包量。
利用蒙特卡洛算法针对上述三种网络环境下分别对文中的三种方法进行50 次试验统计,统计三种方法的实际报文接受速率的均值,统计结果如表2所示。
表2 BPF过滤器指令对照表
实验结果表明三种方法在网络流量不大的情况下都有较低的丢包率,当网络出现拥塞时,MUX方法的丢包率最低,原始套接字方法丢包率最高;三种方法在网络数据较多情况下,针对特定报文的抓包速率bpf 速度最快,原始套接字方法最慢。由于NET_ETH_P_ALL 选项目前只有在VxWorks6.x及以上版本才支持,目前不支持VxWorks5.x 版本,因此原始套接字方法只有在VxWorks6.x 及以上版本才有效,低版本的无法适配。
7 结语
数据包监听技术是网络数据监控、网络功能调试以及网络数据记录等应用的重要基础,一个重要的应用场景是报文的网络数据记录及回放功能,在一个复杂的网络通信系统中,经常需要将经过网卡的数据包进行记录存储,便于后续的数据回放及复盘分析。可利用本文提出的方法进行基于Vx-Works 操作系统的IP 层数据记录及过滤工作。本文提出的三种方法能够实现VxWorks 操作系统下的IP 层数据包侦听的基本功能,可以捕获经过网卡的全部数据包,同时支持捕获特定条件的数据包,例如指定源IP 地址、端口号、报文长度或者某些特定字段数值满足要求的数据报文,具有较好的实用性。本文提出了基于VxWorks 操作系统的IP层数据包的三种方法的原理及关键技术细节,并在文中给出了试验环境搭建的详细步骤,提出了在不同网络情况下测试报文捕获功能性能的试验方法,并给出了文中三种数据包捕获的性能对比结果及结果分析,在工程应用中可以根据需要灵活选择适合的方法进行报文捕获。