免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1007 | 回复: 0
打印 上一主题 下一主题

详解网络数据截获方法及流程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-19 23:14 |只看该作者 |倒序浏览

网络数据包截获机制是网络入侵检测系统的基础组件。一般指通过截获整个网络的所有信息流量,根据信息源主机,目标主机,服务协议端口等信息简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更高层的应用程序进行分析。流程图如下:

图5.1 网络数据截获流程
    一方面要,网络截取模块要能保证截取到所有网络上的数据包,尤其是检测到被分片的数据包(这可能蕴涵着攻击)。
    另方面,数据截取模块截取数据包的效率也是很重要的。
    它直接影响整个入侵检测系统的运行速度。
    5.2各种数据流截获方法
    5.2.1 利用广播截取网络数据流
    数据包的截取技术是依赖网卡的。而网卡可以通过广播监听到以太网络上的数据包,这就是数据包截取技术的基础。
    要想截获不是给自己数据流,就必须绕开系统正常工作的机制,直接通过网卡的混杂模式,使之可以接受目标地址不是自己的MAC地址的数据包,直接访问数据链路层,取数据。
    5.2.2各系统截取数据包机制
    Linux系统为用户提供一种在理论上是数据链路层的,基于网卡驱动程序的,可以不用操作系统自身协议栈的接口(也称套接字)- SockPacket. 这种套接字可以从数据链路层(就是网线)上直接截取所有链路层数据包。而Unix则是通过Libpcap库直接与内核交互,实现网络截取。如: Libpcap,Tcpdump等。如图:   

图5.2 Unix系统监听机制
    BSD Packet Filter(BPF)机制来截取数据包。BPF可以说是各系统中最棒的截获方式。很多开源嗅探工具就是基于它而开发的。Windows系统也有类似情况,如:win系列上有*.vxd (VxD,VirtualDeviceDrive)(packet*.vxd) 和网卡.sys(为网卡芯片所开发)来驱动网卡截取数据包。
    5.2.3 BPF过滤
    Unix&Linux系统有两种数据链路层截取机制,分别是BSD系列系统(NetBSD,OpenBSD,FreeBSD等)的BPF和Linux的SOCKET_PACKET。
    BPF过滤
    BPF主要由两大部分组成:
    网络头接口
    数据包过滤器。
    网络头接口从网络设备驱动程序处收集数据包复制(在提交给系统协议栈之前),并传递给正在截获数据包的应用程序。而过滤器决定某一数据包是被接受或者拒绝以及如果被接受,数据包的那些部分会被复制给应用程序。如:TCPDump注:(1), Libpcap, Sniffer, eeye,等。一般情况,网卡驱动通过网卡把网络上的电平信号转化成数据包,再把截取到的数据传给系统自带的协议栈,然后在交由系统处理。这种方式与 Unix下的BPF不同,它使得网卡驱动在把从网络截取的数据提交给系统之前,先拷贝一份给BPF,再由BPF 决定是否符合规则,不符合则丢弃,符合则存放到内存指定区,等待处理。
    当然,BPF对网卡驱动交给系统协议栈的数据包不做任何干涉。
    注1:TCPDump是伯克利实验室的Van Jacobson,Craig Leres和Stenven McCanne为分析TCP性能问题而写的跨平台的监听程序。
    5.3基于Libpcap库的通用数据截获技术
    Libpcap是用户态的数据包截获API函数接口,有独立和可移植行。最初,Libpcap是为了强大的,健壮TCPDump而编写的。它支持BPF过滤机制。Snort就是依赖于libpcap库进行数据包截取的程序之一(还有Ethereal,eeye等)。它的优点是可以从任何Unix内核平台上截取数据包,而不考虑什么芯片类型的网卡和驱动程序。更重要的是,它可以使开发人员编写自己的解码,显示,记录等程序。
    5.2.2.1 Libpcap库主要函数
    1. 头文件特征(pcap.h)
    Libpcap库(数据流存储头文件 的结构定义如下图)。前半部分是数据库存储文件头的数据结构定义。
    图5.5 头文件(pcap.h)定义部分截图

    后半部是信息包头文件数据结构定义。
    2. 打开并读取设备,设置过滤器部分
    与最基层设备打交道。有三个函数:pcap_read() pcap_open_live 和pcap_setfilter()
    3. 脱机方式截取数据
    及读取存储在营盘上的文件。有两个Pcap_open_offline()和Pcap_offline_read().
    4. 本地网络设置检测部分
    主要检测网络设置的函数有几个,包括Pcap_lookupdev() pcap_lookupnet()等。 因为前面提过,Libpcap可移植。所以各种平台的Socket借口都是兼容的。
    5. 主程序
    都在Pcap.c中,该文件定义了读取数据的统一接口函数pcap_next(),调用此函数获取下一个数据包。
    5.4 Snort调用Libpcap
    在Snort运行启动时,Snort调用Libpcap库。当调用libpcap函数并初始化接口时,进入截取数据的循环模块—pcap循环。
    在这个主循环—Pcaploop(),当网卡从网络介质上接收数据开始,Pcap_loop便对采集来的每个数据包都ProcessPacket()函数处理,如果出错或达到指定的处理包数就退出。(相关代码如下)
    具体就是,Pcap_loop()最后根据数据链路类型来选择数据包,然后由ProcessPacket()来进行协议分析,实施信息流的匹配。
    如:ProcessPaceket函数调用DecodeEthPkt函数来对以太网数据进行解码。其中DecodeEthPkt()函数再调用子函数Decode IP来对IP协议进行解码……
    Libpcap函数功能列举:
    Pcap_open_live(): 获得数据包通用句柄。
    Pcap_lookup_dev(): 指向网络可用设备。
    Pcap_looknet(): 初步判断网络设备本身的IP & netmask。
    Pcap_Dump(): 基于TCPDump的,将网络数据包保存成文件。
    程序部分代码如下:
    /* Read all packets on the device. Continue until cnt packets read */
    pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
    {
    register int n;
    for  { //for循环
    if (p->sf.rfile != NULL) {
    n = pcap_offline_read(p, cnt, callback, user);
    } else {
    // XXX keep reading until we get something
    do {
    n = p->read_op(p, cnt, callback, user);
    } while (n == 0);
    }
    if (n  0) {
    cnt -= n;
    if (cnt

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/71872/showart_1005772.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP