linux下如何使用 tcpdump 进行抓包详细教程

2023-11-11

非功能测试总览

前面的非功能测试总览种提出的,tcp网络访问dump,进行的额外补充:

 - 1.tcpdum核心参数详解
 - 2.理解tcpdump的输出
 - 3.常规过滤规则
 - 4.可选参数解析
 - 5.过滤规则组合
 - 6.特殊过滤规则
 - 7.如何抓取更为准确的包
 - 8.抓包样例

样例:

或者:

tcpdump -i eth0 -w test.cap,将该网卡的tcp打包为一个文件:

下载 wireshark 观看此文件:可以看到发的交易的数据包;

 

目前tcpdump:
1,某个请求超时,服务方或者客户端认为本身没问题的,则根据tcpdump判断交易时间

2.某个请求方,出现参数丢失、或者精度丢失等问题,请求方认为么问题或者,服务方处理不对导致的,也可以根据dump判断入参是否有问题;

3.也有其他使用的场景,暂未用到,自己体会;

本文章主要用于tcpdump命令详解,wireshark 的使用详解,可参考:

常规过滤方式

分析请求样例​​​​​​​


一:tcpdump核心参数详解

大家都知道,网络上的流量、数据包,非常的多,因此要想抓到我们所需要的数据包,就需要我们定义一个精准的过滤器,把这些目标数据包,从巨大的数据包网络中抓取出来。所以学习抓包工具,其实就是学习如何定义过滤器的过程。

而在 tcpdump 的世界里,过滤器的实现,都是通过一个又一个的参数组合起来,一个参数不够精准,那就再加一个,直到我们能过滤掉无用的数据包,只留下我们感兴趣的数据包。

tcpdump 的参数非常的多,初学者在没有掌握 tcpdump 时,会对这个命令的众多参数产生很多的疑惑。

就比如下面这个命令,

1.我们要通过 host 参数指定 host ip 进行过滤
tcpdump host 192.168.10.100

主程序 + 参数名+ 参数值 
这样的组合才是我们正常认知里面命令行该有的样子。

2.可 tcpdump 却不走寻常路,
我们居然还可以在 host 前再加一个限定词,来缩小过滤的范围?
$ tcpdump src host 192.168.10.100

从字面上理解,确实很容易理解,
但是这不符合编写命令行程序的正常逻辑,导致我们会有所疑虑:

2.1除了 src ,dst,可还有其它可以用的限定词?
2.2src,host 应该如何理解它们,叫参数名?不合适,
因为 src 明显不合适。

如果你在网上看到有关 tcpdump 的博客、教程,无一不是给你一个参数组合,告诉你这是实现了怎样的一个过滤器?这样的教学方式,很容易让你依赖别人的文章来使用 tcpdump,而不能将 tcpdump 这样神器消化,达到灵活应用,灵活搭配过滤器的效果。

上面加了 src 本身就颠覆了我们的认知,你可知道在 src 之前还可以加更多的条件,比如 tcp, udp, icmp 等词,在你之前的基础上再过滤一层。
 

tcpdump tcp src host 192.168.10.100

这种参数的不确定性,让大多数人对 tcpdump 的学习始终无法得其精髓。

因此,在学习 tcpdump 之前,我觉得有必要要先让你知道:tcpdump 的参数是如何组成的?这非常重要。

为此,我画了一张图,方便你直观的理解 tcpdump 的各种参数:

1.option 可选参数:将在后边一一解释。
2.proto 类过滤器:根据协议进行过滤,可识别的关键词有: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
3.ype 类过滤器:可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数。
4.direction 类过滤器:根据数据流向进行过滤,可识别的关键字有:src, dst,同时你可以使用逻辑运算符进行组合,比如 src or dst
proto、type、direction 这三类过滤器的内容比较简单,也最常用,因此我将其放在最前面,也就是 第三节:常规过滤规则一起介绍。

而 option 可选的参数非常多,有的甚至也不经常用到,因此我将其放到后面一点,也就是 第四节:可选参数解析

当你看完前面六节,你对 tcpdump 的认识会上了一个台阶,至少能够满足你 80% 的使用需求。

你一定会问了,还有 20% 呢?

其实 tcpdump 还有一些过滤关键词,它不符合以上四种过滤规则,可能需要你单独记忆。关于这部分我会在 第六节:特殊过滤规则 里进行介绍。

2. 理解 tcpdump 的输出

2.1 输出内容结构

21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48

从上面的输出来看,可以总结出:

第一列:时分秒毫秒 21:26:49.013621
第二列:网络协议 IP
第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
第四列:箭头 >, 表示数据流向
第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
第六列:冒号
第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面

2.2 Flags 标识符

使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种:

  • [S] : SYN(开始连接)
  • [P] : PSH(推送数据)
  • [F] : FIN (结束连接)
  • [R] : RST(重置连接)
  • [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)

3. 常规过滤规则

3.1 基于IP地址过滤:host

使用 host 就可以指定 host ip 进行过滤

 tcpdump host 192.168.10.100

数据包的 ip 可以再细分为源ip和目标ip两种

# 根据源ip进行过滤
$ tcpdump -i eth2 src 192.168.10.100

# 根据目标ip进行过滤
$ tcpdump -i eth2 dst 192.168.10.200

3.2 基于网段进行过滤:net

若你的ip范围是一个网段,可以直接这样指定

$ tcpdump net 192.168.10.0/24

网段同样可以再细分为源网段和目标网段

# 根据源网段进行过滤
$ tcpdump src net 192.168

# 根据目标网段进行过滤
$ tcpdump dst net 192.168

3.3 基于端口进行过滤:port

使用 port 就可以指定特定端口进行过滤

$ tcpdump port 8088

端口同样可以再细分为源端口,目标端口

# 根据源端口进行过滤
$ tcpdump src port 8088

# 根据目标端口进行过滤
$ tcpdump dst port 8088

如果你想要同时指定两个端口你可以这样写

$ tcpdump port 80 or port 8088

但也可以简写成这样

$ tcpdump port 80 or 8088

如果你的想抓取的不再是一两个端口,而是一个范围,一个一个指定就非常麻烦了,此时你可以这样指定一个端口段。

$ tcpdump portrange 8000-8080
$ tcpdump src portrange 8000-8080
$ tcpdump dst portrange 8000-8080

对于一些常见协议的默认端口,我们还可以直接使用协议名,而不用具体的端口号

比如 http == 80,https == 443 等

$ tcpdump tcp port http

3.4 基于协议进行过滤:proto

常见的网络协议有:tcp, udp, icmp, http, ip,ipv6 等

若你只想查看 icmp 的包,可以直接这样写

$ tcpdump icmp

protocol 可选值:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui

3.5 基本IP协议的版本进行过滤

当你想查看 tcp 的包,你也许会这样子写

$ tcpdump tcp

这样子写也没问题,就是不够精准,为什么这么说呢?

ip 根据版本的不同,可以再细分为 IPv4 和 IPv6 两种,如果你只指定了 tcp,这两种其实都会包含在内。

那有什么办法,能够将 IPv4 和 IPv6 区分开来呢?

很简单,如果是 IPv4 的 tcp 包 ,就这样写(友情提示:数字 6 表示的是 tcp 在ip报文中的编号。)
 

$ tcpdump 'ip proto tcp'

# or

$ tcpdump ip proto 6

# or

$ tcpdump 'ip protochain tcp'

# or 

$ tcpdump ip protochain 6

而如果是 IPv6 的 tcp 包 ,就这样写

$ tcpdump 'ip6 proto tcp'

# or

$ tcpdump ip6 proto 6

# or

$ tcpdump 'ip6 protochain tcp'

# or 

$ tcpdump ip6 protochain 6

关于上面这几个命令示例,有两点需要注意:

1.跟在 proto 和 protochain 后面的如果是 tcp, udp, icmp ,那么过滤器需要用引号包含,这是因为 tcp,udp, icmp 是 tcpdump 的关键字。
2.跟在ip 和 ip6 关键字后面的 proto 和 protochain 是两个新面孔,看起来用法类似,它们是否等价,又有什么区别呢?

关于第二点,网络上没有找到很具体的答案,我只能通过 man tcpdump 的提示, 给出自己的个人猜测,但不保证正确。

proto 后面跟的 <protocol> 的关键词是固定的,只能是 ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui 这里面的其中一个。

而 protochain 后面跟的 protocol 要求就没有那么严格,它可以是任意词,只要 tcpdump 的 IP 报文头部里的 protocol 字段为 <protocol> 就能匹配上。

理论上来讲,下面两种写法效果是一样的

$ tcpdump 'ip && tcp'
$ tcpdump 'ip proto tcp'

同样的,这两种写法也是一样的

$ tcpdump 'ip6 && tcp'
$ tcpdump 'ip6 proto tcp'

4. 可选参数解析

4.1 设置不解析域名提升速度

  • -n:不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多
  • -nn:不把协议和端口号转化成名字,速度也会快很多。
  • -N:不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印’nic’ 而不是 ‘nic.ddn.mil’.

4.2 过滤结果输出到文件

使用 tcpdump 工具抓到包后,往往需要再借助其他的工具进行分析,比如常见的 wireshark 。

而要使用wireshark ,我们得将 tcpdump 抓到的包数据生成到文件中,最后再使用 wireshark 打开它即可。

使用 -w 参数后接一个以 .pcap 后缀命令的文件名,就可以将 tcpdump 抓到的数据保存到文件中。
 

$ tcpdump icmp -w icmp.pcap

4.3 从文件中读取包数据

使用 -w 是写入数据到文件,而使用 -r 是从文件中读取数据。

读取后,我们照样可以使用上述的过滤器语法进行过滤分析。

$ tcpdump icmp -r all.pcap

4.4 控制详细内容的输出

  • -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
  • -vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。(摘自网络,目前我还未使用过)
  • -vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来(摘自网络,目前我还未使用过)

4.5 控制时间的显示

  • -t:在每行的输出中不输出时间
  • -tt:在每行的输出中会输出时间戳
  • -ttt:输出每两行打印的时间间隔(以毫秒为单位)
  • -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)

4.6 显示数据包的头部

-x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)
-xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部)
-X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
-XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便

4.7 过滤指定网卡的数据包

  • -i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any

4.8过滤特定流向的数据包

  • -Q: 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法


4.9 其他常用的一些参数

  • -A:以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据
  • -l : 基于行的输出,便于你保存查看,或者交给其它工具分析
  • -q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短.
  • -c : 捕获 count 个包 tcpdump 就退出
  • -s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
  • -S : 使用绝对序列号,而不是相对序列号
  • -C:file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)
  • -F:使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.

4.10 对输出内容进行控制的参数

  • -D : 显示所有可用网络接口的列表
  • -e : 每行的打印输出中将包括数据包的数据链路层头部信息
  • -E : 揭秘IPSEC数据
  • -L :列出指定网络接口所支持的数据链路层的类型后退出
  • -Z:后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限。
  • -d:打印出易读的包匹配码
  • -dd:以C语言的形式打印出包匹配码.
  • -ddd:以十进制数的形式打印出包匹配码

5. 过滤规则组合


有编程基础的同学,对于下面三个逻辑运算符应该不陌生了吧

and:所有的条件都需要满足,也可以表示为 &&
or:只要有一个条件满足就可以,也可以表示为 ||
not:取反,也可以使用 !


举个例子,我想需要抓一个来自10.5.2.3,发往任意主机的3389端口的包

$ tcpdump src 10.5.2.3 and dst port 3389


当你在使用多个过滤器进行组合时,有可能需要用到括号,而括号在 shell 中是特殊符号,因为你需要使用引号将其包含。例子如下:

$ tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'


而在单个过滤器里,常常会判断一条件是否成立,这时候,就要使用下面两个符号

=:判断二者相等
==:判断二者相等
!=:判断二者不相等
当你使用这两个符号时,tcpdump 还提供了一些关键字的接口来方便我们进行判断,比如if:表示网卡接口名、
  • proc:表示进程名
  • pid:表示进程 id
  • svc:表示 service class
  • dir:表示方向,in 和 out
  • eproc:表示 effective process name
  • epid:表示 effective process ID

比如我现在要过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包,可以这样子写

$ tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"


6. 特殊过滤规则


6.1 根据 tcpflags 进行过滤


通过上一篇文章,我们知道了 tcp 的首部有一个标志位。

tcpdump 支持我们根据数据包的标志位进行过滤

proto [ expr:size ]

  • proto:可以是熟知的协议之一(如ip,arp,tcp,udp,icmp,ipv6)
  • expr:可以是数值,也可以是一个表达式,表示与指定的协议头开始处的字节偏移量。
  • size:是可选的,表示从字节偏移量开始取的字节数量。

接下来,我将举几个例子,让人明白它的写法,不过在那之前,有几个点需要你明白,这在后面的例子中会用到:

**1、**tcpflags 可以理解为是一个别名常量,相当于 13,它代表着与指定的协议头开头相关的字节偏移量,也就是标志位,所以 tcp[tcpflags] 等价于 tcp[13] ,对应下图中的报文位置。

**2、**tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg 这些同样可以理解为别名常量,分别代表 1,2,4,8,16,32,64。这些数字是如何计算出来的呢?

以 tcp-syn 为例,你可以参照下面这张图,计算出来的值 是就是 2

由于数字不好记忆,所以一般使用这样的“别名常量”表示。

因此当下面这个表达式成立时,就代表这个包是一个 syn 包。

tcp[tcpflags] == tcp-syn


要抓取特定数据包,方法有很多种。

下面以最常见的 syn包为例,演示一下如何用 tcpdump 抓取到 syn 包,而其他的类型的包也是同样的道理。

据我总结,主要有三种写法:

1、第一种写法:使用数字表示偏移量

$ tcpdump -i eth0 "tcp[13] & 2 != 0" 

2、第二种写法:使用别名常量表示偏移量

$ tcpdump -i eth0 "tcp[tcpflags] & tcp-syn != 0" 

3、第三种写法:使用混合写法

$ tcpdump -i eth0 "tcp[tcpflags] & 2 != 0" 

# or

$ tcpdump -i eth0 "tcp[13] & tcp-syn != 0" 

如果我想同时捕获多种类型的包呢,比如 syn + ack 包

1、第一种写法

$ tcpdump -i eth0 'tcp[13] == 2 or tcp[13] == 16'

2、第二种写法

$ tcpdump -i eth0 'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'

3、第三种写法

$ tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0" 

4、第四种写法:注意这里是 单个等号,而不是像上面一样两个等号,18(syn+ack) = 2(syn) + 16(ack)

$ tcpdump -i eth0 'tcp[13] = 18'

# or

$ tcpdump -i eth0 'tcp[tcpflags] = 18'

tcp 中有 类似 tcp-syn 的别名常量,其他协议也是有的,比如 icmp 协议,可以使用的别名常量有

icmp-echoreply, icmp-unreach, icmp-sourcequench, 
icmp-redirect, icmp-echo, icmp-routeradvert,
icmp-routersolicit, icmp-timx-ceed, icmp-paramprob, 
icmp-tstamp, icmp-tstampreply,icmp-ireq, 
icmp-ireqreply, icmp-maskreq, icmp-maskreply



6.2 基于包大小进行过滤


若你想查看指定大小的数据包,也是可以的

$ tcpdump less 32 
$ tcpdump greater 64 
$ tcpdump <= 128



6.3 根据 mac 地址进行过滤


例子如下,其中 ehost 是记录在 /etc/ethers 里的 name

$ tcpdump ether host [ehost]
$ tcpdump ether dst    [ehost]
$ tcpdump ether src    [ehost]



6.4 过滤通过指定网关的数据包

$ tcpdump gateway [host]


6.5 过滤广播/多播数据包

$ tcpdump ether broadcast
$ tcpdump ether multicast

$ tcpdump ip broadcast
$ tcpdump ip multicast

$ tcpdump ip6 multicast




7. 如何抓取到更精准的包?


先给你抛出一个问题:如果我只想抓取 HTTP 的 POST 请求该如何写呢?

如果只学习了上面的内容,恐怕你还是无法写法满足这个抓取需求的过滤器。

在学习之前,我先给出答案,然后再剖析一下,这个过滤器是如何生效的,居然能让我们对包内的内容进行判断。

$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4]'


命令里的可选参数,在前面的内容里已经详细讲过了。这里不再细讲。

本节的重点是引号里的内容,看起来很复杂的样子。

将它逐一分解,我们只要先理解了下面几种用法,就能明白

  • tcp[n]:表示 tcp 报文里 第 n 个字节
  • tcp[n:c]:表示 tcp 报文里从第n个字节开始取 c 个字节,tcp[12:1] 表示从报文的第12个字节(因为有第0个字节,所以这里的12其实表示的是13)开始算起取一个字节,也就是 8 个bit。查看 tcp 的报文首部结构,可以得知这 8 个bit 其实就是下图中的红框圈起来的位置,而在这里我们只要前面 4个bit,也就是实际数据在整个报文首部中的偏移量。
  • &:是位运算里的 and 操作符,比如 0011 & 0010 = 0010
  • >>:是位运算里的右移操作,比如 0111 >> 2 = 0001
  • 0xf0:是 10 进制的 240 的 16 进制表示,但对于位操作来说,10进制和16进制都将毫无意义,我们需要的是二进制,将其转换成二进制后是:11110000,这个数有什么特点呢?前面个 4bit 全部是 1,后面4个bit全部是0,往后看你就知道这个特点有什么用了。

分解完后,再慢慢合并起来看

  • 1、tcp[12:1] & 0xf0 其实并不直观,但是我们将它换一种写法,就好看多了,假设 tcp 报文中的 第12 个字节是这样组成的 10110000,那么这个表达式就可以变成 10110110 && 11110000 = 10110000,得到了 10110000 后,再进入下一步。
  • 2、tcp[12:1] & 0xf0) >> 2 :如果你不理解 tcp 报文首部里的数据偏移,请先点击这个前往我的上一篇文章,搞懂数据偏移的意义,否则我保证你这里会绝对会听懵了。

tcp[12:1] & 0xf0) >> 2 这个表达式实际是 (tcp[12:1] & 0xf0) >> 4 ) << 2 的简写形式。所以要搞懂 tcp[12:1] & 0xf0) >> 2 只要理解了(tcp[12:1] & 0xf0) >> 4 ) << 2 就行了 。

从上一步我们算出了 tcp[12:1] & 0xf0 的值其实是一个字节,也就是 8 个bit,但是你再回去看下上面的 tcp 报文首部结构图,表示数据偏移量的只有 4个bit,也就是说 上面得到的值 10110000,前面 4 位(1011)才是正确的偏移量,那么为了得到 1011,只需要将 10110000 右移4位即可,也就是 tcp[12:1] & 0xf0) >> 4,至此我们是不是已经得出了实际数据的正确位置呢,很遗憾还没有,前一篇文章里我们讲到 Data Offset 的单位是 4个字节,因为要将 1011 乘以 4才可以,除以4在位运算中相当于左移2位,也就是 <<2,与前面的 >>4 结合起来一起算的话,最终的运算可以简化为 >>2。

至此,我们终于得出了实际数据开始的位置是 tcp[12:1] & 0xf0) >> 2 (单位是字节)。

找到了数据的起点后,可别忘了我们的目的是从数据中打到 HTTP 请求的方法,是 GET 呢 还是 POST ,或者是其他的?

有了上面的经验,我们自然懂得使用 tcp[((tcp[12:1] & 0xf0) >> 2):4] 从数据开始的位置再取出四个字节,然后将结果与 GET (注意 GET最后还有个空格)的 16进制写法(也就是 0x47455420)进行比对。

0x47   -->   71    -->  G
0x45   -->   69    -->  E
0x54   -->   84    -->  T
0x20   -->   32    -->  空格


如果相等,则该表达式为True,tcpdump 认为这就是我们所需要抓的数据包,将其输出到我们的终端屏幕上。

8. 抓包实战应用例子


8.1 提取 HTTP 的 User-Agent
从 HTTP 请求头中提取 HTTP 的 User-Agent:

$ tcpdump -nn -A -s1500 -l | grep "User-Agent:"


通过 egrep 可以同时提取User-Agent 和主机名(或其他头文件):

$ tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'


8.2 抓取 HTTP GET 和 POST 请求

抓取 HTTP GET 请求包:

$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

# or

$ tcpdump -vvAls0 | grep 'GET'


可以抓取 HTTP POST 请求包:

$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'

# or 

$ tcpdump -vvAls0 | grep 'POST'


注意:该方法不能保证抓取到 HTTP POST 有效数据流量,因为一个 POST 请求会被分割为多个 TCP 数据包。

8.3 找出发包数最多的 IP


找出一段时间内发包最多的 IP,或者从一堆报文中找出发包最多的 IP,可以使用下面的命令:

$ tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20
  • cut -f 1,2,3,4 -d ‘.’ : 以 . 为分隔符,打印出每行的前四列。即 IP 地址。
  • sort | uniq -c : 排序并计数
  • sort -nr : 按照数值大小逆向排序

8.4 抓取 DNS 请求和响应


DNS 的默认端口是 53,因此可以通过端口进行过滤

$ tcpdump -i any -s0 port 53


8.5 切割 pcap 文件


当抓取大量数据并写入文件时,可以自动切割为多个大小相同的文件。例如,下面的命令表示每 3600 秒创建一个新文件 capture-(hour).pcap,每个文件大小不超过 200*1000000 字节:

$ tcpdump  -w /tmp/capture-%H.pcap -G 3600 -C 200


这些文件的命名为 capture-{1-24}.pcap,24 小时之后,之前的文件就会被覆盖。

8.6 提取 HTTP POST 请求中的密码


从 HTTP POST 请求中提取密码和主机名:

$ tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"


8.7 提取 HTTP 请求的 URL


提取 HTTP 请求的主机名和路径:

$ tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"


8.8 抓取 HTTP 有效数据包


抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK):

$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

8.9 结合 Wireshark 进行分析


通常 Wireshark(或 tshark)比 tcpdump 更容易分析应用层协议。一般的做法是在远程服务器上先使用 tcpdump 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析。

还有一种更高效的方法,可以通过 ssh 连接将抓取到的数据实时发送给 Wireshark 进行分析。以 MacOS 系统为例,可以通过 brew cask install wireshark 来安装,然后通过下面的命令来分析:

$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - not port 22' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -



例如,如果想分析 DNS 协议,可以使用下面的命令:

$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - port 53' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -



抓取到的数据:

  • -c 选项用来限制抓取数据的大小。如果不限制大小,就只能通过 ctrl-c 来停止抓取,这样一来不仅关闭了 tcpdump,也关闭了 wireshark。

到这里,我已经将我所知道的 tcpdump 的用法全部说了一遍,如果你有认真地看完本文,相信会有不小的收获,掌握一个上手的抓包工具,对于以后我们学习网络、分析网络协议、以及定位网络问题,会很有帮助,而 tcpdump 是我推荐的一个抓包工具。

9. 参考文章

  1. FreeBSD Manual Pages About tcpdump
  2. Linux tcpdump命令详解
  3. 一份快速实用的 tcpdump 命令参考手册
  4. 超详细的网络抓包神器 tcpdump 使用指南
  5. [译]tcpdump 示例教程
  6. [英]tcpdump 示例教程


原文链接:https://blog.csdn.net/weixin_36338224/article/details/107035214

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下如何使用 tcpdump 进行抓包详细教程 的相关文章

  • tcpdump指定IP和端口抓包

    如下指定抓www baidu com 并且80端口的包 保存到test cap 可以在Windows下面用wireshark打开 tcpdump 39 port 80 and host www baidu com 39 w test cap
  • tcpdump抓包分析TCP三次握手过程

    转 xff1a http hi baidu com xxjjyy2008 blog item e6566bf837d91903d9f9fdd0 html 一 tcpdump使用 1 首先看下MAN手册 TCPDUMP 8 NAME tcpd
  • linux 下 tcpdump详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • linux 下 tcpdump 详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • tcpdump 抓包命令及使用

    1 抓取所有接收 发送UDP消息 不确定需求时 最好any端口 tcpdump i any udp s 0 w any pcap 2 当抓包数量太大时建议分段 C 100MB 会产生大约100MB的分段且连续的包 tcpdump i any
  • Tcpdump命令详解

    目录 一 tcpdump作用 二 tcpdump命令选项和捕获主机到主机的数据包 2 1 命令选项 2 2 tcpdump表达式 关于数据类型的关键字 数据传输方向的关键字 协议关键字 其他关键字 2 3 tcpdump捕获方式 编辑 一
  • tcp第三次握手ack均是1?

    本人做了tcp连接测试 但是结果和网络中其他人的说法有点不一致 测试使用了命令 tcpdump s1用网卡ens33抓取端口好为80的网络数据包 tcpdump nn i ens33 port 80 s2访问百度 建立3次连接请求数据 cu
  • linux安装tcpdump

    1 官网下载tcpdump和libpcap压缩包 登录 https www tcpdump org index html latest releases 2 安装相关依赖库 1 yum y install gcc c 2 yum y ins
  • Nginx nginx.conf配置文件详解

    目录 1 配置文件划分 第一部分 全局块 第二部分 events块 第三部分 http 2 详细配置 events use epoll http 负载方式 server 额外扩展配置 额外注意 1 配置文件划分 worker process
  • HTTPS】HTTPS过程详解,tcpdump抓包 全过程分析

    RFC中的HTTPS交互过程如下 抓包分析 Client Hello 客户端支持的TLS最高版本号 客户端生成的随机数 客户端支持的加密套件 主机名server name cipher suite怎么理解 名字为 ECDH ECDSA AE
  • tcpdump抓包对性能的影响

    一直以来 提到这个话题 大家更多的关注的是tcpdump抓包本身的性能 比如能不能应付几十万的pps 能否在万兆网络上自运自如 我们现在知道 这些问题的答案都是否定的 即 不能 因此你应该去关注netmap高性能抓包方案以及DPDK这样的东
  • Linux 中的 Tcpdump 命令

    tcpdump是一个命令行实用程序 可用于捕获和检查进出系统的网络流量 它是网络管理员最常用的工具 用于解决网络问题和安全测试 尽管它的名字 与tcpdump 您还可以捕获非 TCP 流量 例如 UDP ARP 或 ICMP 捕获的数据包可
  • 子流程变量[重复]

    这个问题在这里已经有答案了 1 import subprocess 2 raw raw input Filename lower 3 ip raw input Host lower 4 cmd subprocess call tcpdump
  • 客户端向服务器发送延迟的 FIN ACK(约 500 毫秒)

    我有一个 node js 客户端 10 177 62 7 请求来自服务器 10 177 0 1 的 http Rest 服务的一些数据 客户端只需使用node js http request 方法 agent false 客户端位于 Ubu
  • 使用Java解析从wireshark文件中获取的pcap

    我正在努力使用 JAVA 转换从wireshark 获取的 PCAP 文件 而不使用本机或现成的库 我直接将字节转换为字符串只是为了检查其中有意义的部分 然后我尝试将其从十六进制转换为字符串 这没有意义 有java库jNetPcap htt
  • 如何让 tcpdump 写入文件并标准输出适当的数据? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我希望有tcpdump将原始数据包数据写入文件中 并在捕获数据包时将数据包分析显示到标准输出中 通过分析 我的意思是它通常显示的行 w
  • Python 在子进程中使用 tcpdump:如何正确关闭子进程?

    我有一个Python脚本来捕获网络流量tcpdump in a subprocess p subprocess Popen tcpdump I i en1 w cap pcap stdout subprocess PIPE time sle
  • 使用wireshark或其他工具绘制RTT直方图

    我有一个小型办公室网络 但我遇到了巨大的互联网链接延迟 我们有一个简单的网络拓扑 一台配置为运行 ubuntu 服务器 10 10 的路由器的计算机 2 个网卡 一个连接互联网 另一个连接办公室网络 和一个连接 20 台计算机的交换机 我在
  • wireshark 和 tcpdump -r:奇怪的 tcp 窗口大小

    我正在使用 tcpdump 捕获 http 流量 并且对 TCP 慢启动以及窗口大小如何增加感兴趣 sudo tcpdump i eth1 w wget tcpdump tcp and port 80 当我使用 Wireshark 查看转储
  • TCPDump-Buffer 上的 ReadLine 有时会阻塞,直到杀死 tcpdump

    我在 Android 应用程序中使用 TCPDump 时遇到问题 它应该逐行读取 tcpdump 的输出并在我的应用程序中处理它 问题是 有时代码工作正常 它会立即读取捕获的数据包 但有时 ReadLine 会阻塞 直到我从 Linux 控

随机推荐

  • QA 如何打造自身的核心竞争力?

    转载自微服务质量保障 20 讲嘉木老师 怎样理解 核心竞争力 在讲解竞争力之前先看下什么是能力 能力是指一个人完成一个目标或者任务所体现出来的素质 如技能 知识 经验以及行为等 解释中暗含了 能力是一个绝对值 正数 的意思 显得比较学术 而
  • 360度全景标定方法_一种360度全视角鸟瞰全景行车辅助标定方法与流程

    技术领域本发明涉及辅助驾驶领域 具体地说是一种360度全视角鸟瞰全景行车辅助标定方法 背景技术 随着图像和计算机视觉技术的快速发展 越来越多的技术被应用到汽车电子领域 传统的基于图像倒车影像系统在车尾安装摄像头 只能覆盖车尾周围有限的区域
  • 【Vue3源码】第四章 实现isReadonly和isReactive

    Vue3源码 第四章 实现isReadonly和isReactive 前言 上一章节我们实现readonly API 并且优化之前写的reactive API 这一章我们实现isReadonly和isReactive两个API 1 实现is
  • Vue中对于指令的介绍

    Vue指令 文章目录 Vue指令 1 介绍 2 指令介绍 2 1 v html 2 2 v show和v if 3 2 v else 和 v else if 3 3 v on 3 4 v bind 3 5 v for 3 6 v for 中
  • (十二)Mybatis鉴别器discriminator和延迟加载的用法

    这篇文章主要讲述Mybatis鉴别器discriminator和延迟加载的用法 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 目录 什么是鉴别器 代码示例 总结 什么是鉴别器 mybatis可以使用d
  • 微信小程序 - 修改 button 边框和背景色

    为什么80 的码农都做不了架构师 gt gt gt 微信小程序开发中使用 button 设置禁用时候 按钮会有默认的背景色和边框 下面分享下修改按钮边框和背景色 wxml代码
  • 简述SQL Server内存不断增加的原因,以及如何解决该问题。

    在启用sqlserver服务后 发现进程sqlservr exe的内存使用量从开始的100多MB持续增加 很快就高达1G以上 造成机器运行缓慢 卡机 严重影响使用 sql server 在查询大数据量的数据时 总会占用大量的内存 并且居高不
  • centos7和centos6区别:

    1 内核 centos7的内核用的是3 10 centos6的内核用的是2 6 2 文件系统 centos6 X EXT4 EXT4的单个文件系统容量达到1EB 单个文件大小则达到16TB centos7 X XFS XFS默认支持8EB见
  • c++继承中的内存布局(转)

    今天在网上看到了一篇写得非常好的文章 是有关c 类继承内存布局的 看了之后获益良多 现在转在我自己的博客里面 作为以后复习之用 谈VC 对象模型 美 简 格雷 程化 译 译者前言 一个C 程序员 想要进一步提升技术水平的话 应该多了解一些语
  • ceph分布式存储-常见OSD故障处理.md

    2 常见 OSD 故障处理 进行 OSD 排障前 先检查一下 monitors 和网络 如果 ceph health 或 ceph s 返回的是健康状态 这意味着 monitors 形成了法定人数 如果 monitor 还没达到法定人数 或
  • C++——STL容器

    首先 适配器的概念 适配器的意思就是将某些已经存在的东西进行限制或者组合变成一个新的东西 这个新的东西体现一些新的特性 但底层都是由一些已经存在的东西实现的 STL中的容器 vector 矢量 并非数学意义上的 STL最简单的序列类型 也是
  • Redis 安装系统服务报错 HandleServiceCommands: system error caught. error c ode=1073, message = CreateS

    系统已经存在该服务 需要先卸载才能重新安装 点击查看详细操作链接
  • ARC149题解

    ARC149 没有 F 题 A A A 题意 给定 n m 找到一个数字长 n 位 每位数字都相同且是 m 的倍数 题解 直接模拟 代码 B B B 题意 给定序列 A B 每次可以同时交换
  • JDK动态代理UndeclaredThrowableException异常

    UndeclaredThrowableException异常背景 最近项目上出现了 JDK动态代理UndeclaredThrowableException异常 此异常之前没有接触过 那么该异常将会导致什么呢 UndeclaredThrowa
  • 深圳讯商丨wms仓储管理系统在国内的应用方向有哪些

    wms仓储管理系统往常运用的很多 而且运用wms仓储管理系统便当 关于wms仓储管理系统在国内的应用方向有哪些呢 1 配送中心应用的wms仓储管理系统 如连锁超市的配送中心 汽车企业零配件配送中心等 这样的应用比较典型 如某医药集团物流中心
  • ffmpeg文档34-音频滤镜

    34 音频滤镜 当你配置编译FFmpeg时 先采用 disable filters可以禁止所有的滤镜 然后显式配置想要支持的滤镜 下面是当前可用的音频滤镜 adelay 延迟一个或者多个音频通道 它接受如下选项 delays 参数是以 分隔
  • Markdown基本语法

    Markdown是一种纯文本格式的标记语言 通过简单的标记语法 它可以使普通文本内容具有一定的格式 优点 1 因为是纯文本 所以只要支持Markdown的地方都能获得一样的编辑效果 可以让作者摆脱排版的困扰 专心写作 2 操作简单 比如 W
  • WebUI自动化测试之Selenium学习笔记(二)浏览器控制

    文章目录 Selenium库中webdriver模块的使用 1 浏览器控制 用例 2 鼠标控制 用例 3 键盘控制 4 获取属性信息 用例 4 窗口切换 用例 5 警告框处理 用例 6 下拉框选择操作 用例 7 文件上传 8 cookie操
  • 并行算法解决list

    并行算法序列和字符串 Scan prefix sums List ranking Sorting Merging Medians Searching String matching Other string operations 并行算法的
  • linux下如何使用 tcpdump 进行抓包详细教程

    非功能测试总览 前面的非功能测试总览种提出的 tcp网络访问dump 进行的额外补充 1 tcpdum核心参数详解 2 理解tcpdump的输出 3 常规过滤规则 4 可选参数解析 5 过滤规则组合 6 特殊过滤规则 7 如何抓取更为准确的