tcpdump工作原理

2020-01-09  本文已影响0人  mysimplebook

Linux中强大的网络数据采集分析工具——TcpDump。用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性。tcpdump存在于基本的 FreeBSD系统中,如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式(promiscuous,表示混杂无差别,即使MAC地址变化也没有区别,NIC能够接收包的含义),所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。在威胁。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig

eth* promisc,eth*是你要打开混杂模式的网卡。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

tcpdump 工作原理

tcpdump 接收从底层过滤程序上传的分组,并按指定格式打印出来,tcpdump 由两个组件组成,一个是内核组件,负责从网络上捕获分组并可能会过滤;另一个是用户空间组件,负责处理用户界面、格式化显示,以及在内核中完成未完成的过滤。

用户空间组件使用libpcap(packet capture library,分组捕获库)与内核组件通信,在基于BSD的系统中,libpcap和BPF打交道,BPF凭借用户提供的过滤器来检查通过链路层的每个分组,如果过滤器选中了一个分组,就将它的一个副本送入提供该过滤器的应用程序在内核中的缓冲区,当缓冲区满或或用户指定时间到,缓冲区的信息通过libpcap提交给应用程序。

下图显示了BSD分组过滤器BPF(BSD Packet Filter)向tcpdump传递分组的过程。

BPF将以太网设备驱动程序设置为混杂模式,驱动程序每收到或发送一个分组,都将分组的一个拷贝传给BPF,BPF根据上层用户进程设置的过滤规则对分组进行过滤。事实上,tcpdump并未直接使用BPF,而是调用libpcap库函数,libpcap封装了不同平台下的分组过滤器。BPF是Unix操作系统提供的访问数据链路层服务接口,为用户提供了一种从核心保护外获取数据的能力,从网络接口设备获取的数据包在被传送到操作系统的核心缓冲区的同时,向一个非核心的缓冲区也发送一份,从而使应用程序可以获取原始的数据包。

由于数据链路层收到的分组相对于高层协议所收到的分组数多,这就要求BPF能够快速地处理收到的每一个分组,为了减少开销(减少内核到用户空间的数据复制次数和数量),BPF采取了下列措施:

1、过滤器在内核中运行,以减少从BPF复制到应用进程的数据量

2、BPF只将满足条件的分组的部分数据传递给应用程序,因为大多数应用进程只需要分组头部,而不需要分组数据

3、采用双缓存技术,先将传送给应用进程的分组缓存起来,当缓存已满或超时发生时才复制给应用进程。缓存减少了调用的次数

上一篇下一篇

猜你喜欢

热点阅读