Skip to content

Latest commit

 

History

History
138 lines (86 loc) · 8.73 KB

linux-抓包命令tcpdump.md

File metadata and controls

138 lines (86 loc) · 8.73 KB

Linux tcpdump 详解

描述

tcpdump 打印出网络接口上与布尔表达式匹配的数据包内容的描述,该描述前有一个时间戳,默认情况下,打印为小时,分钟,秒。

它还可以使用 -w 运行,该标志使它将数据包数据保存到一个文件以供以后分析,或使用 -r 标志运行,该标志使它从保存的数据包文件中读取数据包,而不是从网络接口读取数据包。

它还可以使用 -V 运行,这使它读取已保存的数据包文件的列表。在任何情况下,tcpdump 只处理与表达式匹配的数据包。

tcpdump 如果不使用 -c 运行,将持续捕获数据包,直到它被 SIGINT 信号中断(例如,通过输入中断符,通常为 control-c),或 SIGTERM 信号(通常为 kill(1) 命令);

如果使用 -c 运行,它将捕获数据包至它被 SIGINT 或 SIGTERM 信号中断,或者处理了指定数量的数据包。

当 tcpdump 完成了抓包,它将展示如下计数:

  • 已捕获数据包数量(这是 tcpdump 已接受和已处理的数据包数)
  • 已由筛选器接受的数据包数量(其含义取决于运行 tcpdump 的操作系统,也可能取决于操作系统的配置方式——如果在命令行上指定了筛选器)
  • 被内核丢掉的数据包数量(如果操作系统向应用程序报告该信息,则这是运行 tcpdump 的操作系统中的数据包捕获机制由于缺少缓冲区空间而丢弃的数据包数量,如果没有,则报告 0)

在支持 SIGINFO 信号的平台上,如大多数 BSD(包括 macOS)和 Digital/Tru64 UNIX,当它接受到 SIGINFO 信号时,它将报告这些计数(例如,通过输入"status",通常是 control-T, 但在某些平台,如 macOS,默认情况下不设置"status"字符,因此必须将其设置为 stty(1)才能使用,并将继续捕获数据包)。

在不支持 SIGINFO 信号的平台上,也可以使用 SIGUSR1 信号来实现。

使用 SIGUSR2 信号和 -w 标志将强制将数据包缓冲区刷新到输出文件中。

从网络接口读取数据包可能需要你具有特殊权限,有关详细信息,请参阅 pcap 手册页。读取保存的数据包文件不需要特殊权限。

参数

参数 可选参数 用途
-A - 以 ASCII 编码打印每个数据包(减去 link header)。方便捕捉网页。
-B buffer_size --buffer_size=buffer_size 将操作系统捕获缓冲区大小设置为缓冲区大小,单位为 KiB(1024字节)。
-c count - 接收指定数量的数据包后退出。
- --count 仅在 stderr 上打印读取捕获文件时的数据包计数,而不是解析/打印数据包。如果在命令行上指定了筛选器,tcpdump只统计与筛选器表达式匹配的数据包。
-C file_size - 在将原始数据包写入保存文件之前,检查文件当前是否大于 file_size,如果大于,将关闭当前保存文件并打开一个新文件。第一个保存文件后面的文件将使用 -w 指定的文件名,从 1 开始一直向上累加。fize_size 的单位是数百万字节(1000000 字节,而不是 1048576 字节)。
-d - 将匹配信息包的代码以人们能够理解的汇编格式给出。
-dd - 将匹配信息包的代码以C语言程序段的格式给出。
-ddd - 将匹配信息包的代码以十进制的形式给出。
-F file - 使用文件作为筛选器表达式的输入,在命令行上给出的附加表达式将被忽略。
-h --help 打印 tcpdump 版本字符串,打印用法,然后退出
- --version 打印 tcpdump 版本字符串并退出。
-i --interface=interface 监听,报告链接层类型的列表,报告时间戳类型的列表或报告在接口上编译筛选器表达式的结果。如果未指定并且没有给出 -d 标志,tcpdump 将在系统接口列表中搜索编号最低的,已配置的接口(不包括环回),例如,它可能是"eth0"。
-l - 使标准输出到缓冲中。当你想捕获数据的时候查看数据,这个功能就非常有用。例如,tcpdump -l > dat & tail -f dat
-n - 不要将地址(即主机地址、端口号等)转换为名称。
-q - 快速输出。打印更少的协议信息,以便输出行数更短。
-r file - 从文件中读取数据包(该文件是使用 -w 选项创建的,或由其他输出到 pcap 或 pcapng 文件的工具创建的)。如果文件为"-",则使用标准输入。
-t - 不要在每个 dump 行上打印时间戳。
-tt - 在每个 dump 行上打印时间戳
-ttt - 在每个 dump 行上打印时间增量。默认单位为微秒。
-tttt - 在每个 dump 行上打印一个时间戳,以小时、分钟、秒和微秒为单位,前面是日期。
-ttttt - 在每个 dump 行和第一行之间打印增量。默认单位为微秒。
-v - 在解析和打印时,生成(稍微多一些)详细的输出。例如,打印 IP 包中的生存时间、标识、总长度和选项。还支持额外的数据包完整性检查,例如验证IP和ICMP报头校验和。
-vv - 更详细的输出。例如,从 NFS 应答数据包打印附加字段,并对 SMB 数据包进行完全解码。
-vvv - 更详细的输出。例如,telnet SB ... SE 选项全部打印。
-V file - 从 file 读取文件名列表。如果文件为"-",则使用标准输入。
-w file - 将原始数据包写入文件,而不是解析并打印出来。以后可以使用 -r 选项打印他们。如果文件为"-",则使用标准输出。文件扩展名 .pcap 通常与 .cap 和 .dmp 一起使用。tcpdump 在读取捕获文件时不检查扩展名,在写入文件时也不添加扩展名。
-W filecount - 与 -C 选项结合使用,将限制创建的文件数为 filecount,并从一开始就覆盖文件,从而创建一个旋转缓冲区。此外,它将使用足够的前置0来命名文件,以支持最大数量的文件,从而允许他们正确排序。
-x - 在解析和打印时,除了打印每个数据包的 header 外,还以十六进制打印每个数据包的数据(减去 link 级别的 header)。
-xx - 在解析和打印时,除了打印每个数据包的 header 外,还以十六进制打印每个数据包的数据,包括其 link 级别的 header。
-xxx - 在解析和打印时,除了打印每个数据包的 header 外,还以十六进制和 ASCII 格式打印每个数据包的数据(减去 link 级别的 header)。这对于分析新协议非常方便。
-XX - 在解析和打印时,除了打印每个数据包的 header 外,还以十六进制和 ASCII 格式打印每个数据包的数据,包括其 link 级别的 header。。

例子

tcpdump host sundown

打印所有到达或离开 sundown 的数据包,(sundown 是一个地址)。


tcpdump host helios and ( hot or ace )

打印 helios 和 hot 或者 ace 之间的流量。


tcpdump ip host ace and not helios

打印 ace 和任何主机(除 helios 之外)之间的所有 IP 数据包。


tcpdump net ucb-ether

打印本地主机和 ucb-ether 主机之间的所有通信量


tcpdump 'gateway snup and (port ftp or ftp-data)'

打印通过 internet 网关 snup 的所有 ftp 流量(打引号是为了防止 shell 错误地解释括号)。


tcpdump ip and not net localnet

打印即不来自本地主机,也不面向本地主机的流量(如果你是另一个网络的网关,那么这些内容永远不会进入你的本地网络)。


tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

打印每个涉及非本地主机的 TCP 会话的开始和结束数据包(SYN 和 FIN 数据包)。


tcpdump 'tcp[tcpflags] & (tcp-rst|tcp-ack) == (tcp-rst|tcp-ack)'

打印设置了 RST 和 ACK 标志的 TCP 数据包。(也就是仅在标志字段中选择 RST 和 ACK 标志,如果结果为"RST 和 ACK 同时设置",则匹配)。


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

打印进出端口 80 的所有 IPv4 HTTP 数据包,也就是仅打印包含数据的数据包,而不是例如 SYN 和 FIN 数据包以及仅 ACK 数据包。


tcpdump 'gateway snup and ip[2:2] > 576'

打印通过网关 snup 发送的长度超过 576 字节的 IP 数据包。


tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

打印未通过 Ethernet 广播或多播发送的 IP 广播或多播数据包。


tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

打印所有不是 echo 请求/回复的 ICMP 数据包(也就是,不是 ping 数据包)。