简介

Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump是Linux中强大的网络数据采集分析工具之一。
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。
作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。
tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的 FreeBSD系统中,由于它需要将网络接口设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
基本上tcpdump的总的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数

参数化支持

参数

tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络接口,这在计算机具有多个网络接口时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。
然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

安全

显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP 堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。
并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。
May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled
虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。

解码

从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

TCP 功能

命令详解

不带任何参数的TcpDump将搜索系统中第一个网络接口,并显示它截获的所有数据。这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:

选项描述
-b在网络层上选择协议,包括ip、arp、rarp、ipx都是这一层的。例如:tcpdump -b arp 将只显示网络中的arp即地址转换协议信息。
-i选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据例如:tcpdump -i eth0 只显示通过eth0接口上的所有报头。
-s numbertcpdump默认只会截取前96字节的内容,要想截取所有的报文内容,就需要使用这个选项,其中number是需要截取的报文字节数,如果是0的话,表示截取报文全部内容
-nn表示不解析域名,直接显示IP,在netstat命令中,也有这个选项
-X同时使用hex和ascii显示报文内容
-S显示绝对的序列号(sequence number),而不是相对编号
-v,-vv,-vvv显示更多的详细信息
-c number表示截取number个报文,然后结束
-w将监听到的数据包写入文件中保存,而并不分析和打印出来
-A只使用ascii打印报文的全部数据,不要和-X选项一起使用。截取HTTP请求的时候可以用sudo tcpdump -nSA port 80

过滤器

描述

先进行使用实例详解时,有必要先掌握tcpdump一些基本的使用理论知识,先来说说过滤器。
在服务器上的网络报文是异常的多,很多时候我们只关注和具体问题有关的数据报文,而这些有用的报文只占到很小的一部分,为了不让我们在报文的海洋里迷失自己,我们就非常有必要学习一下tcpdump提供的灵活而且功能强大的过滤器。

分类

过滤器也可以简单地分为三类:type,dir和proto。

类型描述
type主要用来区分过滤报文源类型,主要由host主机报文,net网段报文和port指定端口的报文组成
dir只过滤报文的源地址和目的地址,主要包括src源地址和dst目的地址
proto只过滤报文的协议类型,支持tcp,udp和icmp等,使用的时候可以省略proto关键字:tcpdump -i eth1 arp, tcpdump -i eth1 ip, tcpdump -i eth1 tcp, tcpdump -i eth1 udp, tcpdump -i eth1 icmp

在我们使用tcpdump命令时是离不开这些过滤器的。

条件组合

在茫茫网络中,想要找到那个你想要的网络包,还是有一定难度的。为了抓住那个我们想要的网络包,在我们抓包命令中,包含越多的限制条件,抓的无关包就会越少,所以在进行抓包时,我们可以使用“与”(and&&)、"或"(or||)和“非”(not!)来将多个条件组合起来。这对我们需要基于某些条件来分析网络包是非常有用的。

使用示例

监视指定网络接口的数据包

tcpdump -i eth1

截获210.27.48.3主机收到的和发出的所有数据包

tcpdump host 210.27.48.3

截获210.27.48.3主机和210.27.48.5或者210.27.48.6主机进行通信的所有数据包

tcpdump host 210.27.48.4 and (210.27.48.5 or 210.27.48.6)

截获192.168.1.0/24整个网络的数据包

tcpdump net 192.168.1.0/24

监视eth0网卡上源地址是210.27.48.3的所有网络包

tcpdump -i eth0 src host 210.27.48.3

监视eth0网卡上目的地址是210.27.48.3的所有网络包

tcpdump -i eth0 dst host 210.27.48.3

获取主机210.27.48.3上端口为23的应用发出和接收的所有TCP协议包

tcpdump tcp port 23 and host 210.27.48.3

获取本机123端口发出和接收的所有UDP协议包

tcpdump udp port 123

截获源主地址为10.126.1.222,目的地址是10.126.1.0/24整个网络

tcpdump src host 10.126.1.222 and dst net 10.126.1.0/24

抓取报文后按照指定时间间隔保存

tcpdump -i eth0 -s0 -G 60 -Z root -w %Y_%m%d_%H%M_%S.pcap

-G选项后面接时间,单位为秒;上述命令就是每隔60秒生存一个文件

抓取报文后按照指定报文大小保存

tcpdump -i eth0 -s0 -C 1 -Z root -w eth0Packet.pcap

-C选项后接文件大小,单位为MB;上述命令就是每抓包文件达到1MB时就使用一个新的文件保存新抓的报文

抓取一定数量固定端口的包,并以数字的方式显示主机地址

tcpdump -c 10 -nn -i ens32 tcp dst port 9080

最后修改:2020 年 10 月 11 日 08 : 59 PM
如果觉得我的文章对你有用,请随意赞赏