libpcap原理及使用

2.9 libpcap

本文最初整理在我的github上SDN-Learning-notes

libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的

libpcap可以实现以下功能:
- 数据包捕获:捕获流经网卡的原始数据包
- 自定义数据包发送:任何构造格式的原始数据包
- 流量采集与统计:网络采集的中流量信息
- 规则过滤:提供自带规则过滤功能,按需要选择过滤规则

libpcap工作原理

libpcap主要由两部份组成:网络分接口(Network Tap)和数据过滤器(Packet Filter)。

网络分接口从网络设备驱动程序中收集数据拷贝(旁路机制),过滤器决定是否接收该数据包。Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。如果没有定义规则,则把全部数据交给上层应用程序。

libpcap

如图所示一个数据包的捕捉分为三个主要部分:
- 面向底层包捕获、
- 面向中间层的数据包过滤
- 面向应用层的用户接口

libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用链路层PF_PACKET原始套接字从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。所以整个过程并不干扰系统自身的网路协议栈的处理。

libpcap使用流程

  1. 决定对那一个接口进行嗅探,如eth0。我们也可以用一个字符串来定义这个设备。

  2. 初始化pcap。使用文件句柄传入需要嗅探的设备。同时支持多个设备的嗅探。

  3. 设置BPF. 创建一个规则集合,编译并且使用它。这个过程分为三个阶段: 1.规则集合被置于一个字符串内,并且被转换成能被pcap读的格式。2.编译该规则(就是调用一个不被外部程序使用的函数)。3.告诉pcap使用它来过滤数据包。

  4. pcap进入它的主循环。在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。每当它收到一个包(或者多个数据包)就调用另一个已经定义好的函数,这个函数可以做我们想要的任何工作,比如它可以剖析包的上层协议信息并给用户打印出结果,它可以将结果保存为一个文件,或者什么也不作。

  5. 在嗅探到所需的数据后,我们要关闭会话并结束。

tcpdump

tcpdump命令:

$ tcpdump --help
tcpdump: invalid option -- '-'
tcpdump version 4.5.1
libpcap version 1.5.3
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX] [ -B size ] [ -c count ]
        [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
        [ -i interface ] [ -j tstamptype ] [ -M secret ]
        [ -P in|out|inout ]
        [ -r file ] [ -s snaplen ] [ -T type ] [ -V file ] [ -w file ]
        [ -W filecount ] [ -y datalinktype ] [ -z command ]     [ -Z user ] [ expression ]

tcpdump选项可划分为四大类型:控制tcpdump程序行为,控制数据怎样显示,控制显示什么数据,以及过滤命令。

控制程序行为

这一类命令行选项影响tcpdump程序行为,如包括数据收集的方式:-w选项允许用户将输出重定向到一个文件,之后可通过-r选项将捕获数据显示出来。

如果用户知道需要捕获的报文数量或对于数量有一个上限,可使用-c选项。则当达到该数量时程序自动终止,而无需使用kill命令或Ctrl-C。下例中,收集到100个报文之后tcpdump终止:
bsd1# tcpdump -c 100

如果用户在多余一个网络接口上运行tcpdump,用户可以通过-i选项指定接口。在不确定的情况下,可使用ifconfig –a来检查哪一个接口可用及对应哪一个网络。例如,一台机器有两个接口,eth0接口IP地址192.168.0.1,eth1接口IP地址192.168.0.2。要捕捉192.168.0.1网络的数据流,使用以下命令:

bsd1# tcpdump -i eth0

没有指定接口时,tcpdump默认为最低编号接口。

-p选项将网卡接口设置为非混杂模式。这一选项理论上将限制为捕获接口上的正常数据流——来自或发往主机,多播数据,以及广播数据。

-s选项控制数据的截取长度。通常,tcpdump默认为一最大字节数量并只会从单一报文中截取到该数量长度。实际字节数取决于操作系统的设备驱动。通过默认值来截取合适的报文头,而舍弃不必要的报文数据。减少数据量。

如果用户需截取更多数据,通过-s选项来指定字节数。也可以用-s来减少截取字节数。对于少于或等于200字节的报文,以下命令会截取完整报文:

# tcpdump -s200

更长的报文会被缩短为200字节。

控制信息如何显示

-a-n-N-f选项决定了地址信息是如何显示的。-a选项强制将网络地址显示为名称,-n阻止将地址显示为名字,-N阻止将域名转换。-f选项阻止远端名称解析。下例中,从sloan.lander.edu (205.153.63.30) ing远程站点,分别不加选项,-a,-n,-N,-f。(选项-c1限制抓取1个报文)

# tcpdump -c1 host 192.31.7.130
tcpdump: listening on xl0
14:16:35.897342 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request
# tcpdump -c1 -a host 192.31.7.130
tcpdump: listening on xl0
14:16:14.567917 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request
# tcpdump -c1 -n host 192.31.7.130
tcpdump: listening on xl0
14:17:09.737597 205.153.63.30 > 192.31.7.130: icmp: echo request
# tcpdump -c1 -N host 192.31.7.130
tcpdump: listening on xl0
14:17:28.891045 sloan > cio-sys: icmp: echo request
# tcpdump -c1 -f host 192.31.7.130
tcpdump: listening on xl0
14:17:49.274907 sloan.lander.edu > 192.31.7.130: icmp: echo request

默认为-a选项。

-t-tt选项控制时间戳的打印。-t选项不显示时间戳而-tt选项显示无格式的时间戳。以下命令显示了tcpdump命令无选项,-t选项,-tt选项的同一报文:

12:36:54.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 8647 (DF)
934303014.772066 sloan.lander.edu.1174 > 205.153.63.238.telnet: . ack 3259091394 win 
  • 15
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Libpcap是一个数据包捕获函数库,它提供了C函数接口,用于捕获经过指定网络接口的数据包。它是在Unix/Linux平台下使用的,被用作网络监控软件的基础。著名的软件TCPDUMP就是基于Libpcap开发而成的。TCPDUMP是一个命令行工具,它使用Libpcap来捕获和分析网络数据包。通过tcpdump命令,可以在命令行中查看到经过指定网络接口的数据包,并对其进行过滤、分析等操作。要理解tcpdump和libpcap原理,需要对Libpcap的功能和接口有深入的理解。了解Libpcap原理可以参考和中提供的参考资料。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [tcpdump与libpcap原理分析](https://blog.csdn.net/dillanzhou/article/details/96913981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [libpcap及tcpdump简介](https://blog.csdn.net/jiechuhoudeshang/article/details/89215091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值