郭 伟
(湖北工业大学计算机学院,湖北武汉430068)
网络监听技术的应用
郭 伟
(湖北工业大学计算机学院,湖北武汉430068)
网络监听系统是网络安全维护的基础技术和核心手段,是利用计算机技术捕获网络上的数据包,并对捕获的数据包进行分析。本文探析了网络监听技术的基本原理。阐述了利用Libpcap技术在Linux下捕获数据包的方法和应用技术。
网络数据包;捕获;Linux;Libpcap
当今计算机网络及通讯技术的广泛应用,促使Internet迅速发展,给我们带来了巨大的社会和经济效益。尽管开放的、自由的、国际化的Internet的发展给政府机构、企事业单位带来了革命性的改革和开放,使他们能够利用Internet提高办事效率和市场反应能力,从而更具竞争力,但同时网络开放也带来了数据安全的危险和挑战。因此,如何保护机密信息不受黑客和间谍的入侵,确保网络系统的正常安全运行,已成为政府机构、企事业单位信息化健康发展所要考虑的重要因素之一[1]。
计算机网络监听和检测软件就是在这种情况下而产生发展起来的。本文主要论述了如何在Linux环境中利用Libpcap开发包开发网络实时监听程序,并给出了具体的设计与实现方法。
共享式以太网所采用的是广播信道,也就是说每台主机所发出的报文都会被整个网络内的所有主机接收到,而现在通常采用的交换式以太网则是基于数据链路层的Peer T o Peer信道,它检测经过以太网端口的数据包的源地址和目标地址的介质访问层(MAC)地址,然后与系统内部的动态查找表进行比较,若数据包的MAC地址不在查找表中,则将该地址加入查找表,并将数据包发送给相应的目标端口。因此,对于这种交换式以太网可以为交换机配置一个监听端口,交换机上所有被传送的数据包都会拷贝一份传输至监听端口,在该端口上进行监听则可以完全按照共享式以太网的工作方式来处理。
一般情况下,主机对接收到的数据帧的处理方式主要是根据网卡的工作模式来决定的。一般网卡具有四种工作模式:广播模式、多播模式、直接模式和混杂模式。网卡缺省的工作模式包含广播模式和直接模式,所谓直播模式即只能接收发送给自己和广播的数据帧。正常情况下接收主机的网卡根据数据帧中所包含的目标MAC地址进行判断,如果与自己的MAC地址相等,或者是广播MAC地址,则提交给上层处理程序,否则将丢弃此数据帧。当网卡处于混杂模式时,网卡对接收到的任何数据帧都不作任何判断,直接把接收到的所有数据帧交给上层处理程序。网络监听技术就是基于这个原理来捕获网络中所有的数据包,实现计算机网络实时监测和实时流量分析的。
在通常情况下,网络通信的Socket程序只能响应与自己硬件地址相匹配的数据帧或者以广播形式发出的数据帧,对于其他形式的数据帧,比如已到达网卡接口但目标地址却不是发往此处的数据帧,网络接口在检查目标地址不等于自身地址之后将不做任何处理,也就是说应用程序无法接收与自己无关的数据包。
假如我们要想实现捕获流经网络设备的所有数据包,就必须转换网卡工作模式:将网卡设置为混杂模式。这样的话该主机的网卡就可以捕获到所有流经其网卡的数据包和数据帧。但是要注意的是,这种捕获只是针对数据包的简单复制,而不能对其进行截断。
Libpcap主要结构由两部分组成:网络分流器和数据过滤装置。网络分流器从网络网卡处理的数据中收集数据拷贝,过滤装置决定是否接收该数据包。Libpcap利用BPF算法对网卡接收到的数据链路层数据包进行过滤操作。BPF算法的基本思想是在包含BPF监听环境的计算机网络中,网卡驱动将接收到的数据包拷贝一份副本传递给BPF过滤装置,过滤装置根据使用者定义的规则决定是否接收此数据包的过滤,以及需要拷贝该数据包的哪些内容。然后将过滤后的数据传递到与过滤装置相对应的上层应用程序。
Libpcap的数据包捕获机制是在数据链路层的基础上增加一个处理环节。当一个数据包到达网络接口时,Libpcap首先利用已经创建好的Socket会话从数据链路层驱动程序中获得该数据包的拷贝,再通过分流函数将数据包传递给BPF过滤装置。BPF过滤装置根据使用者定义好的过滤规则对数据包进行一对一的匹配操作,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则予以丢弃。还有一种情况,假若没有设置过滤规则,所有数据包将会放入内核缓冲区,并传递给用户层缓冲区[2]。
Libpcap-mmap是Libpcap的一个增强版,它们捕获数据包的结构大致相同。不同的地方主要有以下两部分:Libpcap采用额定大小的存储缓冲器和保持缓冲器来实现数据包从内核到用户层的传递工作,而Libpcap-mmap设计了一个空间大小可以调整的循环缓冲器,允许用户程序和内核程序同时对该循环缓冲器的不同存储区域进行直接的读取。
在采用Libpcap进行网络数据包捕获的过程中,网卡一旦接收到有效的数据包,网卡驱动程序便会通过直接内存访问方式调用系统函数Netif_rx ()。将数据包从网卡拷贝到核心态内存缓冲区中,应用程序假如想访问位于核心态内存缓冲区的数据,必须将数据包从核心态内存缓冲区中拷贝到用户态内存缓冲区中,这样便会导致占用更多的内存以及CPU时间等系统资源,并且会造成一定的处理延迟,这样也会降低数据包的捕获性能以及对数据包的处理性能。
而Libpcap-mmap采用内存映射技术,建立核心态内存和用户态内存的映射,将系统分配给网卡设备文件的核心态内存映射到一块用户态内存中,这样一来应用程序可以通过调用Recv_From()函数把数据包从网卡上直接传送到用户态内存中,减少了一次数据拷贝操作过程,减少了系统资源的消耗,相应地数据包捕获效率提高了。
以下是捕获网络数据包的实例代码:
这个程序监听由pcap_Lookupdevice()函数返回的设备,并将它置为工作在混杂模式下。程序监听每一个经过端口25(SMTP简单邮件传输系统的工作端口)的数据包。并且告诉用户此数据包的大小,以字节为单位。这个程序最后包含了一个新的函数调用pcap_close(),用来终止当前会话。
我们可以使用的另一种手段,但是要复杂的多,并且可能也更为有用。一般情况下,编程人员使用pcap_loop()或pcap_dispatch()。实际上pcap_dispatch()是具有pcap_loop()的某些相似功能。为了了解这两个函数的用法,你必须了解回调函数的思想。回调函数在很多的程序API中是非常常见的。它的概念是比较简单的。假设我有一段程序,正在等候某一个事件的结果。为了达到这个例子的目的,让我们假设我希望用户通过在键盘上按一个按键,只要用户按下一个按键,程序便呼叫具有相应处理功能的函数。这个具有处理用户行为消息的函数便是一个回调函数。用户每次按下一个按键,程序便会调用回调函数一次。结合在pcap函数的回调函数中,当用户按下一个功能按键,并且这个按键具有网络数据包捕获功能的时候,pcap函数便会立即调用回调函数。执行消息的传递和处理。它们可以被定义在以下两个函数中pcap_loop()和pcap_dispatch()。这两个函数在回调函数中的使用方法非常类似。它们都是当捕获到一个符合网络数据包过滤装置所要求的规则和数据包时,随即调用回调函数,前提是必须要有一个数据包过滤装置,否则所有被捕获到的数据包都会被回调函数处理。
Pcap_Loop()的原型函数如下:Int Pcap_Loop (Pcap_T*pcap,Int Count,Pcap_handle Callback, u_char*The_User)。其中*pcap是会话句柄,其次是一个整型变量,它表示pcap_loop()返回前必须捕获数据包的数目。如果是负数,则表示是这项工作直到发生了错误才会停止。第三个参数是回调函数的系统保留字,系统检测到该保留字将会自动调用回调函数。最后一个参数在某些应用场合可能会用到,作为保留使用。但更多时候则置为NULL。假设我们有我们自己的想送往回调函数的参数,另外还有pcap_loop()发送的参数,这就需要用到它。很明显,必须是一个u_char类型的指针以确保结果正确;正像我们稍后见到的,pcap使用了很有意思的方法以u_char指针的形式传递数据。Pcap_dispatch()的用法几乎是一样的。唯一不同的是它们如何处理超时。还记得在调用pcap_open_live()时怎样设置超时吗?这就是它起作用的地方。Pcap_ loop()忽略超时,而pcap_dispatch()则不。在使用pcap_loop()之前,我们必须检查我们的回调函数的格式。我们不能武断地定义回调函数的原型,否则pcap_loop()将会不知道如何去使用它。
因此,使用下述格式作为回调函数的原型:
首先,你会注意到该函数返回void类型,这是符合逻辑的,因为pcap_loop()不知道如何去处理一个回调返回值。*args对应于 pcap_loop()的*The_User参数。回调函数一旦被调用的时候,不管*The_User传给pcap_loop()的是什么值,都会传递到我自己的回调函数的*args参数中。Pcap_ pkhdr是在pcap头文件中定义的,包括数据包被捕获的时间、大小和长度等信息。
这些变量的作用注释中已经描述得非常清楚。*pakt在函数中是一个 u_char指针,它包括由Pcap_Loop()所捕获到的所有的数据包。至此,我们实现了数据包捕获的基本框架:打开一个pcap会话,有关它的全体属性,嗅探数据包,使用过滤装置,使用回调函数,等等。如果有网络数据包捕获方面的应用,可以在此基础上再做修改和完善。
本文对网络监听系统的概念、原理进行了简单的讨论。通过具体代码实例演示了如何实现网络上数据包的实时捕获。对于网络安全系统设计人员来说是非常重要的,它使得网络安全工程师能够通过数据包捕获,动态了解当前网络安全状态以及迅速发现网络可能遭受的风险。很大程度上提高了网络的安全性和可靠性。
[1]徐其兴.计算机网络技术及应用[M].北京:高等教育出版社,2008:277.
[2]闫丽丽,涂天禄,周兴涛.Libpcap数据包捕获机制剖析与研究[J].网络安全技术与应用,2006(4):38-40.
Application of Network Monitoring Technology
GUO Wei
(School of Computer Science,Hubei University of Technology,Wuhan 430068,China)
Network monitoring system is the basic technology and core means of network security maintenance.It is the use of computer technology to capture and analyze packets on the network.This article explores the basic principles of network monitoring technology,describes the methods and application technology using Libpcap technology to capture packets under Linux.
network packet;capture;Linux;Libpcap
book=91,ebook=135
TP393.08
A
1008-4738(2010)04-0091-03
2010-06-20
郭 伟(1981-),男,湖北工业大学计算机学院在读硕士,十堰职业技术学院信息与智能工程系讲师,研究方向:计算机应用技术。