linux下最全抓包命令使用方式学习和拓展

Posted 无名之辈之码谷娃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下最全抓包命令使用方式学习和拓展相关的知识,希望对你有一定的参考价值。

为什么要抓包?抓包有什么作用?

抓包的好处:

1,分析出当前服务器存在的漏洞,接口参数,防盗链,流量工具,ip伪造,参数篡改,钓鱼网站等。

抓包的作用:端到端联调,包括不限制语言的参数请求,只要走upd,http协议。万物皆可抓、

举个例子抓包的应用场景:网络传输,特殊协议,特殊场景,比如公安的视图库,国标,需要硬件交互的都必不可少(常见的:TCP,UDP,TLS,HTTP,QUIC,HTTP/2 Stream)。

我们来看看官网的介绍:(我还是那句话,不要上手就粘,万物皆可粘,这是没错,但是有这自己的理解更胜一筹

官网使用详解:

tcpdump(1) man page | TCPDUMP & LIBPCAP

Tcpdump打印出网络接口上与布尔表达式匹配的数据包内容的描述( 有关表达式语法,请参见 pcap-filter (7) );描述前面有一个时间戳,默认情况下打印为小时、分钟、秒和自午夜以来的几分之一秒。它也可以与 -w 标志一起运行,这会导致它将数据包数据保存到文件中以供以后分析,和/或与 -r 标志一起运行,这会导致它从保存的数据包文件中读取而不是读取数据包从网络接口。它也可以与 -V一起运行 标志,这使它读取保存的数据包文件列表。在所有情况下,只有匹配 表达式的数据包 才会被 tcpdump处理。

如果Tcpdump 没有使用 -c 标志运行,它将继续捕获数据包,直到它被 SIGINT 信号(例如,通过键入中断字符,通常是 control-C 生成)或 SIGTERM 信号(通常使用 kill(1)指挥);如果使用 -c 标志运行,它将捕获数据包,直到它被 SIGINT 或 SIGTERM 信号中断或已处理指定数量的数据包。

当 tcpdump 完成捕获数据包时,它将报告以下计数:

数据包“捕获”(这是 tcpdump 已接收和处理的数据包数量);

数据包“由过滤器接收”(其含义取决于您运行 tcpdump的操作系统,并且可能取决于配置操作系统的方式 - 如果在命令行上指定了过滤器,则在某些操作系统上它很重要数据包,不管它们是否被过滤器表达式匹配,即使它们被过滤器表达式匹配,也不管 tcpdump是否 已经读取并处理了它们,在其他操作系统上,它只计算过滤器表达式匹配的数据包,而不管tcpdump是否 已读取并处理它们,并且在其他操作系统上,它仅计算与过滤器表达式匹配并由 tcpdump处理的数据包);

数据包``被内核丢弃''(这是由于缺乏缓冲区空间而被丢弃的数据包数量 ,如果操作系统向应用程序报告该信息,则运行tcpdump的操作系统中的数据包捕获机制;如果不是,则报告为0)。

在支持 SIGINFO 信号的平台上,例如大多数 BSD(包括 macOS)和 Digital/Tru64 UNIX,它会在收到 SIGINFO 信号时报告这些计数(例如,通过键入您的“状态”字符生成,通常control-T,虽然在某些平台上,比如 macOS,“status”字符默认是没有设置的,所以你必须用 stty (1) 设置它才能使用它)并且会继续抓包。在不支持 SIGINFO 信号的平台上,同样可以通过使用 SIGUSR1 信号来实现。

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

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

选项

-一个

以 ASCII 格式打印每个数据包(减去其链路级标头)。方便捕获网页。

-b

以 ASDOT 表示法而不是 ASPLAIN 表示法打印 BGP 数据包中的 AS 编号。

-B缓冲区大小

--buffer-size= buffer_size

将操作系统捕获缓冲区大小设置为buffer_size,以 KiB(1024 字节)为单位。

-c计数

收到count包后退出。

- 数数

读取捕获文件而不是解析/打印数据包时,仅在标准输出上打印数据包计数。如果在命令行上指定了过滤器,则tcpdump仅计算与过滤器表达式匹配的数据包。

-C文件大小

在将原始数据包写入保存文件之前,请检查文件当前是否大于file_size,如果是,则关闭当前保存文件并打开一个新文件。第一个保存文件之后的保存文件将具有使用 -w 标志指定的名称,其后有一个数字,从 1 开始并继续向上。file_size的默认单位是百万字节(1,000,000 字节,而不是 1,048,576 字节)。

通过在值中添加 k/K、m/M 或 g/G 后缀,可以将单位分别更改为 1,024 (KiB)、1,048,576 (MiB) 或 1,073,741,824 (GiB)。

-d

将编译后的数据包匹配代码以人类可读的形式转储到标准输出并停止。

请注意,尽管代码编译总是特定于 DLT,但通常不可能(也没有必要)指定将哪个 DLT 用于转储,因为tcpdump使用 -r指定的输入 pcap 文件的 DLT 或使用-i指定的网络接口 ,或分别使用-y 和 -i指定的网络接口的特定 DLT 。在这些情况下,转储显示的代码与不带-d的情况下过滤输入文件或网络接口的代码完全相同 。

但是,当既 没有指定-r 也没有 指定-i时 ,指定 -d会 阻止tcpdump猜测合适的网络接口(请参阅 -i)。在这种情况下,DLT 默认为 EN10MB,可以使用-y手动设置为另一个有效值 。

-dd

将数据包匹配代码转储为 C 程序片段。

-ddd

将数据包匹配代码转储为十进制数(以计数开头)。

-D

--list-interfaces

打印系统上可用的网络接口列表以及 tcpdump 可以捕获数据包的网络接口列表。对于每个网络接口,都会打印一个编号和一个接口名称,后面可能是接口的文本描述。可以将接口名称或编号提供给 -i 标志以指定要在其上捕获的接口。

这在没有列出它们的命令的系统上很有用(例如,Windows 系统或缺少 ifconfig -a的 UNIX 系统);该数字在 Windows 2000 和更高版本的系统上很有用,其中接口名称是一个有点复杂的字符串。

如果tcpdump 是用 缺少 pcap_findalldevs (3PCAP) 功能 的旧版本的libpcap构建 的 , 则不支持 -D标志。

-e

在每个转储行上打印链接级标题。例如,这可用于打印以太网和 IEEE 802.11 等协议的 MAC 层地址。

-E

使用spi@ipaddr algo:secret来解密以addr为地址并包含安全参数索引值 spi的 IPsec ESP 数据包。这种组合可以用逗号或换行符分隔重复。

请注意,此时支持为 IPv4 ESP 数据包设置密钥。

算法可以是 des-cbc、 3des-cbc、 blowfish-cbc、 rc3-cbc、 cast128-cbc或 none。默认值为des-cbc仅当tcpdump在启用加密的情况下编译 时才存在解密数据包的能力。

secret是 ESP 密钥的 ASCII 文本。如果前面有 0x,则将读取一个十六进制值。

该选项假定 RFC 2406 ESP,而不是 RFC 1827 ESP。该选项仅用于调试目的,不鼓励将此选项与真正的“秘密”密钥一起使用。通过在命令行上显示 IPsec 密钥,您可以通过 ps (1) 和其他场合使其对其他人可见。

除了上述语法之外,语法文件名还可以用来让 tcpdump 读取提供的文件。该文件在收到第一个 ESP 数据包时打开,因此 tcpdump 可能已授予的任何特殊权限应该已经放弃.

-F

以数字方式而不是符号方式打印“外国”IPv4 地址(此选项旨在避免 Sun 的 NIS 服务器中的严重脑损伤 --- 通常它在翻译非本地互联网号码时会永远挂起)。

使用正在完成捕获的接口的 IPv4 地址和网络掩码对“外部”IPv4 地址进行测试。如果该地址或网络掩码不可用,要么是因为正在执行该捕获的接口没有地址或网络掩码,要么是因为它是 Linux 以及最新版本的 macOS 和 Solaris 中可用的“任何”伪接口,并且可以在多个接口上捕获,此选项将无法正常工作。

-F文件

使用文件作为过滤器表达式的输入。命令行上给出的附加表达式将被忽略。

-G旋转秒数

如果指定,则 每rotate_seconds秒轮换使用-w 选项指定的转储文件。保存文件将具有由 -w指定的名称,该名称应包括strftime (3) 定义的时间格式 。如果未指定时间格式,则每个新文件都将覆盖以前的文件。每当生成的文件名不唯一时,tcpdump 将覆盖预先存在的数据;因此,不建议提供比捕获周期更粗的时间规范。

如果与 -C 选项一起使用,文件名将采用 ` file <count>' 的形式。

-H

- 帮助

打印 tcpdump 和 libpcap 版本字符串,打印使用消息,然后退出。

- 版本

打印 tcpdump 和 libpcap 版本字符串并退出。

-H

尝试检测 802.11s 草稿网头。

-i接口

--interface=接口

监听,上报链路层类型列表,上报时间戳类型列表,或者上报 接口过滤器表达式编译结果。如果未指定 且未给出-d标志, tcpdump会在系统接口列表中搜索编号最小的配置好的接口(不包括环回),例如,它可能是“eth0”。

在具有 2.2 或更高版本内核的 Linux 系统以及最新版本的 macOS 和 Solaris 上,“any”的 接口 参数可用于从所有接口捕获数据包。请注意,“any”伪接口上的捕获不会在混杂模式下完成。

如果 支持-D 标志,则该标志打印的接口编号可以用作 接口 参数,如果系统上没有接口将该编号作为名称。

-我

--监控模式

将界面置于“监控模式”;这仅在 IEEE 802.11 Wi-Fi 接口上受支持,并且仅在某些操作系统上受支持。

请注意,在监控模式下,适配器可能会与与其关联的网络解除关联,因此您将无法使用该适配器使用任何无线网络。如果您在监视模式下捕获并且未使用另一个适配器连接到另一个网络,这可能会阻止访问网络服务器上的文件或解析主机名或网络地址。

此标志将影响 -L 标志的输出。如果 未指定-I ,则仅显示那些不在监控模式下可用的链路层类型;如果 指定了-I ,则仅显示在监视模式下可用的链路层类型。

--立即模式

以“立即模式”捕获。在这种模式下,数据包一到达就被传递到 tcpdump,而不是为了提高效率而进行缓冲。如果数据包被打印到终端而不是文件或管道,这是打印数据包而不是将数据包保存到“保存文件”时的默认设置。

-j tstamp_type

--time-stamp-type= tstamp_type

将捕获的时间戳类型设置为tstamp_type。用于时间戳类型的名称在 pcap-tstamp (7)中给出;并非所有列出的类型都对任何给定接口都有效。

-J

--list-time-stamp-types

列出接口支持的时间戳类型并退出。如果无法为接口设置时间戳类型,则不会列出时间戳类型。

--time-stamp-precision= tstamp_precision

捕获时,将捕获的时间戳精度设置为 tstamp_precision。请注意,高精度时间戳(纳秒)的可用性及其实际精度取决于平台和硬件。另请注意,在将纳秒精度的捕获写入保存文件时,时间戳以纳秒分辨率写入,文件以不同的幻数写入,以指示时间戳以秒和纳秒为单位;并非所有读取 pcap 保存文件的程序都能够读取这些捕获。

读取保存文件时,将时间戳转换为timestamp_precision指定的精度,并以该分辨率显示。如果指定的精度小于文件中时间戳的精度,则转换将失去精度。

timestamp_precision 支持的值是micro用于微秒分辨率和nano用于纳秒分辨率。默认为微秒分辨率。

- 微

--纳米

--time -stamp-precision=micro或 --time-stamp-precision=nano 的简写,相应地调整时间戳精度。从保存文件中读取数据包时,如果保存文件是以纳秒精度创建的,则使用 --micro 会截断时间戳。相反,当 使用--nano时,以微秒精度创建的保存文件将在时间戳中添加尾随零。

-K

--dont-verify-checksums

不要尝试验证 IP、TCP 或 UDP 校验和。这对于在硬件中执行部分或全部校验和计算的接口很有用;否则,所有传出的 TCP 校验和都将被标记为错误。

-l

使标准输出行缓冲。如果您想在捕获数据时查看数据,这很有用。例如,

tcpdump -l | 开球日期

或者

tcpdump -l > dat & 尾 -f dat

请注意,在 Windows 上,“行缓冲”表示“未缓冲”,因此如果 指定了-l ,WinDump 将单独写入每个字符 。

-U在其行为上与-l 类似 ,但它会导致输出被“包缓冲”,因此输出在每个包的末尾而不是每行的末尾被写入标准输出;这在包括 Windows 在内的所有平台上都有缓冲。

-L

--list-data-link-types

列出接口的已知数据链路类型,在指定的模式下,然后退出。已知数据链路类型的列表可能取决于指定的模式;例如,在某些平台上,Wi-Fi 接口在不处于监控模式时可能支持一组数据链路类型(例如,它可能仅支持虚假以太网标头,或者可能支持 802.11 标头但不支持带有无线电信息的 802.11 标头) 和另一组在监控模式下的数据链路类型(例如,它可能仅在监控模式下支持 802.11 标头或带有无线电信息的 802.11 标头)。

-m模块

从文件module 加载 SMI MIB 模块定义。可以多次使用此选项将多个 MIB 模块加载到tcpdump中。

-M秘密

使用秘密作为共享秘密,以使用 TCP-MD5 选项 (RFC 2385) 验证在 TCP 段中找到的摘要(如果存在)。

-n

不要将地址(即主机地址、端口号等)转换为名称。

-N

不要打印主机名的域名资格。例如,如果你给出这个标志,那么tcpdump将打印 ``nic'' 而不是 ``nic.ddn.mil''。

-#

- 数字

在行首打印可选的数据包编号。

-O

--无优化

不要运行数据包匹配代码优化器。仅当您怀疑优化器中存在错误时,这才有用。

-p

--no-promiscuous-mode

不要将界面置于混杂模式。请注意,由于某些其他原因,界面可能处于混杂模式;因此,“-p”不能用作“ether host local-hw-addr or ether broadcast”的缩写。

- 打印

打印解析的数据包输出,即使原始数据包正在保存到带有 -w 标志的文件中。

--print-sampling= nth

打印每第 n 个数据包。此选项启用--print标志。

未打印的数据包不被解析,这减少了处理时间。例如,将 nth设置 为100 ,将(从 1 开始计数)解析并打印第 100 个数据包、第 200 个数据包、第 300 个数据包等。

此选项还启用-S标志,因为不跟踪未打印数据包的相对 TCP 序列号。

-Q方向

--direction=方向

选择应捕获数据包的 发送/接收方向可能的值是“in”、“out”和“inout”。并非在所有平台上都可用。

-q

快速(安静?)输出。打印更少的协议信息,因此输出行更短。

-r文件

从文件中 读取数据包(使用 -w 选项或其他编写 pcap 或 pcapng 文件的工具创建)。如果文件是“-”, 则使用标准输入。

-S

--absolute-tcp-sequence-numbers

打印绝对而非相对的 TCP 序列号。

-s snaplen

--snapshot-length= snaplen

从每个数据包中捕获 snaplen 字节的数据而不是默认的 262144 字节。由于快照受限而截断的数据包在输出中用 ``[| proto ]'',其中proto 是发生截断的协议级别的名称。

请注意,拍摄较大的快照既增加了处理数据包所需的时间,又有效地减少了数据包缓冲量。这可能会导致数据包丢失。另请注意,拍摄较小的快照会丢弃来自传输层以上协议的数据,这会丢失可能很重要的信息。例如,NFS 和 AFS 请求和回复非常大,如果选择了太短的快照长度,则大部分细节将不可用。

如果您需要将快照大小减小到默认值以下,则应将snaplen限制为将捕获您感兴趣的协议信息的最小数字。将 snaplen设置为 0 会将其设置为默认值 262144,以便与最近的旧版本向后兼容tcpdump的版本 。

-T

强制由“表达式”选择的数据包被解释为指定的类型。目前已知的类型有 aodv (Ad-hoc On-demand Distance Vector protocol), carp (Common Address Redundancy Protocol), cnfp (Cisco NetFlow protocol), domain (Domain Name System), lmp (Link Management Protocol), pgm (Pragmatic General Multicast), pgm_zmtp1 (ZMTP/1.0 inside PGM/EPGM), ptp (Precision Time Protocol), quic (QUIC), radius (RADIUS), resp (REdis Serialization Protocol), rpc(Remote Procedure Call), rtcp (Real-Time Applications control protocol), rtp (Real-Time Applications protocol), snmp (Simple Network Management Protocol), someip (SOME/IP), tftp (Trivial File Transfer Protocol), vat ( Visual Audio Tool)、 vxlan(虚拟可扩展局域网)、 wb(分布式白板)和 zmtp1(ZeroMQ 消息传输协议 1.0)。

请注意,上面的pgm类型仅影响 UDP 解释,无论如何,本机 PGM 始终被识别为 IP 协议 113。UDP 封装的 PGM 通常称为“EPGM”或“PGM/UDP”。

请注意,上面的pgm_zmtp1类型会同时影响本机 PGM 和 UDP 的解释。在本地 PGM 解码期间,ODATA/RDATA 数据包的应用程序数据将被解码为带有 ZMTP/1.0 帧的 ZeroMQ 数据报。在 UDP 解码期间,除此之外,任何 UDP 数据包都将被视为封装的 PGM 数据包。

-t

不要在每个转储行上打印时间戳。

-tt

在每个转储行上打印时间戳,以自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数以及自该时间以来的几分之一秒。

-ttt

在每个转储行的当前行和上一行之间 打印一个增量(微秒或纳秒分辨率,具体取决于 --time-stamp-precision选项)。默认为微秒分辨率。

-tttt

在每个转储行上打印时间戳,如小时、分钟、秒和自午夜以来的秒的小数部分,前面是日期。

-tttt

在每个转储行的当前行和第一行之间 打印一个增量(微秒或纳秒分辨率,具体取决于 --time-stamp-precision选项)。默认为微秒分辨率。

-u

打印未解码的 NFS 句柄。

-U

--数据包缓冲

如果 没有指定-w 选项,或者如果指定了但同时指定了 --print 标志,则使打印的数据包输出 ``packet-buffered'';即,当每个数据包的内容描述被打印时,它将被写入标准输出,而不是在不写入终端时,仅在输出缓冲区填满时才写入。

如果指定了 -w 选项,则使保存的原始数据包输出 ``packet-buffered'';即,当每个数据包被保存时,它将被写入输出文件,而不是仅在输出缓冲区填满时才写入。

如果tcpdump 是用 缺少 pcap_dump_flush (3PCAP) 功能 的旧版本的libpcap构建 的 , 则不支持 -U标志。

-v

解析和打印时,产生(稍微多一点的)详细输出。例如,打印 IP 数据包中的生存时间、标识、总长度和选项。还启用额外的数据包完整性检查,例如验证 IP 和 ICMP 标头校验和。

当使用-w选项 写入文件, 同时不使用 -r 选项从文件读取时,每秒一次向 stderr 报告捕获的数据包数。在 Solaris、FreeBSD 和可能的其他操作系统中,此定期更新当前可能会导致捕获的数据包在从内核到 tcpdump 的途中丢失。

-vv

更详细的输出。例如,从 NFS 回复数据包中打印附加字段,并完全解码 SMB 数据包。

-vvv

更详细的输出。例如,telnet SB ... SE选项被完整打印。使用 -X Telnet 选项也以十六进制打印。

-V文件

从file 读取文件名列表。如果文件是“-”, 则使用标准输入。

-w文件

将原始数据包写入文件,而不是解析和打印出来。稍后可以使用 -r 选项打印它们。如果文件是“-”, 则使用标准输出。

如果写入文件或管道,此输出将被缓冲,因此从文件或管道读取的程序可能在收到数据包后的任意时间内看不到数据包。使用 -U 标志使数据包在收到后立即写入。

MIME 类型application/vnd.tcpdump.pcap已在 IANA 注册用于pcap文件。文件扩展名.pcap似乎与.cap和 .dmp 一起最常用。Tcpdump本身在读取捕获文件时不检查扩展名,并且在写入文件时不添加扩展名(它在文件头中使用幻数)。但是,如果存在扩展名,许多操作系统和应用程序将使用该扩展名,并且建议添加一个(例如 .pcap)。

有关文件格式的说明,请参见 pcap-savefile (5) 。

-W文件计数

与 -C 选项一起使用,这会将创建的文件数限制为指定的数量,并从头开始覆盖文件,从而创建一个“循环”缓冲区。此外,它会以足够多的前导 0 命名文件以支持最大文件数,从而使它们能够正确排序。

与 -G 选项一起使用,这将限制创建的旋转转储文件的数量,达到限制时以状态 0 退出。

如果与 -C 和 -G 一起使用,当前 将 忽略-W 选项,并且只会影响文件名。

-X

解析和打印时,除了打印每个数据包的标头外,还要以十六进制打印每个数据包的数据(减去其链路级标头)。 将打印整个数据包或 snaplen字节中较小的一个。请注意,这是整个链路层数据包,因此对于填充的链路层(例如以太网),当更高层数据包短于所需填充时,也会打印填充字节。 在当前实现中,如果数据包被截断, 此标志可能与-xx具有相同的效果 。

-xx

解析和打印时,除了打印每个数据包的头外,还打印每个数据包的数据, 包括 它的链路层头,以十六进制表示。

-X

解析和打印时,除了打印每个数据包的标头外,还以十六进制和 ASCII 格式打印每个数据包的数据(减去其链路级标头)。这对于分析新协议非常方便。 在当前实现中,如果数据包被截断, 此标志可能与-XX具有相同的效果 。

-XX

解析和打印时,除了打印每个数据包的 标头外,还以十六进制和 ASCII 格式 打印每个数据包的数据,包括其链路级标头。

-y数据链路类型

--linktype=数据链路类型

设置在捕获数据包时使用的数据链路类型(参见 -L)或只是编译和转储数据包匹配代码(参见 -d)到datalinktype

-z postrotate 命令

与 -C 或 -G 选项一起使用,这将使 tcpdump 运行“ postrotate-command file ”,其中 file 是每次旋转后关闭的保存文件。例如,指定 -z gzip 或 -z bzip2 将使用 gzip 或 bzip2 压缩每个保存文件。

请注意,tcpdump 将与捕获并行运行命令,使用最低优先级,这样就不会干扰捕获过程。

如果你想使用一个本身带有标志或不同参数的命令,你总是可以编写一个 shell 脚本,它将保存文件名作为唯一的参数,安排标志和参数并执行你想要的命令。

-Z用户

--relinquish-privileges=用户

如果 tcpdump 以 root 身份运行,在打开捕获设备或输入保存文件之后,但在打开任何保存文件进行输出之前,将用户 ID 更改为 user 并将组 ID 更改为 user 的主要 

此行为也可以在编译时默认启用。

表达

选择要转储的数据包。如果没有给出表达式 ,则网络上的所有数据包都将被转储。否则,只会转储表达式为“真”的数据包。

有关表达式语法,请参阅 pcap-filter (7)。

表达式参数可以作为单个 Shell 参数或多个 Shell 参数传递给 tcpdump ,以更方便者为准通常,如果表达式包含 Shell 元字符,例如用于转义协议名称的反斜杠,则将其作为单个带引号的参数传递比转义 Shell 元字符更容易。多个参数在解析之前用空格连接。

例子

打印到达或离开sundown的所有数据包:

tcpdump 主机日落

要打印helioshotace之间的流量:

tcpdump 主机 helios 和 \\( hot or ace \\)

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

tcpdump ip 主机 ace 而不是 helios

打印本地主机和伯克利主机之间的所有流量:

tcpdump net ucb-ether

要通过 Internet 网关snup 打印所有 ftp 流量:(请注意,引用表达式是为了防止 shell(错误)解释括号):

tcpdump '网关 snup 和(端口 ftp 或 ftp 数据)'

打印既不是来自本地主机也不是发往本地主机的流量(如果您网关到另一个网络,这些东西永远不应该进入您的本地网络)。

tcpdump ip 而不是 net localnet

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

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 而不是 src 和 dst net localnet '

打印设置了标志 RST 和 ACK 的 TCP 数据包。(即只选择flags字段中的RST和ACK标志,如果结果是“RST和ACK都设置”,则匹配)

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

打印进出端口 80 的所有 IPv4 HTTP 数据包,即仅打印包含数据的数据包,而不是,例如,SYN 和 FIN 数据包以及 ACK-only 数据包。(IPv6 留给读者作为练习。)

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

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

tcpdump '网关 snup 和 ip[2:2] > 576'

打印 不是 通过以太网广播或多播发送的 IP 广播或多播数据包:

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

打印所有不是回显请求/回复的 ICMP 数据包(即,不是 ping 数据包):

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

输出格式

tcpdump 的输出取决于协议。下面给出了大多数格式的简要说明和示例。

时间戳

默认情况下,所有输出行前面都有一个时间戳。时间戳是表单中的当前时钟时间

hh:mm:ss.frac
并且与内核的时钟一样准确。时间戳反映内核对数据包应用时间戳的时间。没有尝试考虑网络接口完成从网络接收数据包到内核对数据包应用时间戳之间的时间延迟;该时间延迟可能包括网络接口完成从网络接收数据包的时间与将中断传递给内核以使其读取数据包的时间之间的延迟,以及内核服务于“新数据包”中断和它对数据包应用时间戳的时间。

链接级别标头

如果给出了 '-e' 选项,则打印出链接级标题。在以太网上,会打印源地址和目标地址、协议和数据包长度。

在 FDDI 网络上,“-e”选项使tcpdump打印“帧控制”字段、源地址和目标地址以及数据包长度。(“帧控制”字段控制对数据包其余部分的解释。普通数据包(例如包含 IP 数据报的数据包)是“异步”数据包,优先级值在 0 到 7 之间;例如,“ async4 ”。这样的假设数据包包含 802.2 逻辑链路控制 (LLC) 数据包;如果它不是ISO 数据报或所谓的 SNAP 数据包,则打印 LLC 报头。

在令牌环网络上,“-e”选项使tcpdump打印“访问控制”和“帧控制”字段、源地址和目标地址以及数据包长度。与 FDDI 网络一样,假设数据包包含 LLC 数据包。无论是否指定了“-e”选项,都会为源路由数据包打印源路由信息。

在 802.11 网络上,“-e”选项会导致tcpdump打印“帧控制”字段、802.11 标头中的所有地址以及数据包长度。与 FDDI 网络一样,假设数据包包含 LLC 数据包。

(注意:以下描述假定您熟悉 RFC 1144 中描述的 SLIP 压缩算法。)

在 SLIP 链路上,打印出方向指示符(“I”表示入站,“O”表示出站)、数据包类型和压缩信息。首先打印数据包类型。这三种类型是iputcpctcp。没有为ip数据包打印更多的链接信息。对于 TCP 数据包,连接标识符打印在类型之后。如果数据包被压缩,则打印出其编码的标头。特殊情况打印为 *S+ n*SA+ n,其中n是序列号(或序列号和确认)已更改的量。如果不是特殊情况,则打印零个或多个更改。更改由 U(紧急指针)、W(窗口)、A(确认)、S(序列号)和 I(数据包 ID)指示,后跟 delta(+n 或 -n)或新值(=n)。最后,打印数据包中的数据量和压缩包头长度。

例如,以下行显示了一个出站压缩 TCP 数据包,带有一个隐式连接标识符;ack 变了 6,sequence number 变了 49,packet ID 变了 6;有 3 个字节的数据和 6 个字节的压缩头:

O ctcp * A+6 S+49 I+6 3 (6)

ARP/RARP 数据包

ARP/RARP 输出显示请求的类型及其参数。该格式旨在自我解释。这是从主机rtsg到主机csam的“rlogin”开始时的一个简短示例:


arp 谁有 csam 告诉 rtsg
arp 回复 csam is-at CSAM

第一行表示 rtsg 发送了一个 ARP 数据包,询问 Internet 主机 csam 的以太网地址。Csam 用它的以太网地址回复(在这个例子中,以太网地址大写,互联网地址小写)。

如果我们执行了tcpdump -n ,这看起来就不那么多余了:


arp 谁拥有 128.3.254.6 告诉 128.3.254.68
arp 回复 128.3.254.6 is-at 02:07:01:00:01:c4

如果我们执行了tcpdump -e,那么第一个数据包是广播的,第二个是点对点的这一事实将是可见的:


RTSG 广播 0806 64:arp who-has csam tell rtsg
CSAM RTSG 0806 64:arp 回复 csam is-at CSAM

对于第一个数据包,它表示以太网源地址是 RTSG,目标是以太网广播地址,类型字段包含十六进制 0806(类型 ETHER_ARP),总长度为 64 个字节。

IPv4 数据包

如果没有打印链路层报头,对于 IPv4 数据包, IP将在时间戳之后打印。

如果指定了 -v标志,来自 IPv4 标头的信息将显示在IP或链路层标头 之后的括号中。该信息的一般格式为:


tos tos , ttl ttl , id id , offset offset , flags [ flags ], proto proto , length长度, options ( options )

tos是服务字段的类型;如果 ECN 位不为零,则报告为ECT(1)ECT(0)CE。 ttl是生存时间;如果为零,则不报告。 id是 IP 标识字段。 offset是片段偏移量字段;无论这是否是分段数据报的一部分,都会打印出来。 flags是 MF 和 DF 标志;如果设置了MF,则报告+ ,如果设置了F,则报告DF。如果两者都没有设置,被报道。 proto是协议 ID 字段。 length是总长度字段。 选项是 IP 选项(如果有)。

接下来,对于 TCP 和 UDP 数据包,将打印源 IP 地址和目标 IP 地址以及 TCP 或 UDP 端口,每个 IP 地址与其对应的端口之间有一个点,将用 > 分隔源和目标。对于其他协议,将打印地址,并用 > 分隔源和目标。之后将打印更高级别的协议信息(如果有)。

对于分段的 IP 数据报࿰

linux使用tcpdump抓包工具抓取网络数据包,多示例演示

tcpdump是linux命令行下常用的的一个抓包工具,记录一下平时常用的方式,测试机器系统是ubuntu 12.04。

tcpdump的命令格式

tcpdump的参数众多,通过man tcpdump可以查看tcpdump的详细说明,这边只列一些笔者自己常用的参数:

tcpdump [-i 网卡] -nnAX ‘表达式‘

各参数说明如下:

  • -i:interface 监听的网卡。
  • -nn:表示以ip和port的方式显示来源主机和目的主机,而不是用主机名和服务。
  • -A:以ascii的方式显示数据包,抓取web数据时很有用。
  • -X:数据包将会以16进制和ascii的方式显示。
  • 表达式:表达式有很多种,常见的有:host 主机;port 端口;src host 发包主机;dst host 收包主机。多个条件可以用and、or组合,取反可以使用!,更多的使用可以查看man 7 pcap-filter。

下面进行一些命令测试,如果没有权限,可以先切换成root用户。

监听网卡eth0

$ tcpdump -i eth0

这个方式最简单了,但是用处不多,因为基本上只能看到数据包的信息刷屏,压根看不清,可以使用ctrl+c中断退出,如果真有需求,可以将输出内容重定向到一个文件,这样也更方便查看。

监听指定协议的数据

$ tcpdump -i eth0 -nn ‘icmp‘

这个是用来监听icmp协议的数据,就是ping命令使用的协议。类似的,如果要监听tcp或者是udp协议,只需要修改上例的icmp就可以了。ping下监听的机器,输出如下:

技术分享

linux使用tcpdump抓包示例

每一行的各个数据表示的含义:

抓到包的时间 IP 发包的主机和端口 > 接收的主机和端口 数据包内容

监听指定的主机

$ tcpdump -i eth0 -nn ‘host 192.168.1.231‘

这样的话,192.168.1.231这台主机接收到的包和发送的包都会被抓取。

$ tcpdump -i eth0 -nn ‘src host 192.168.1.231‘

这样只有192.168.1.231这台主机发送的包才会被抓取。

$ tcpdump -i eth0 -nn ‘dst host 192.168.1.231‘

这样只有192.168.1.231这台主机接收到的包才会被抓取。

监听指定端口

$ tcpdump -i eth0 -nnA ‘port 80‘

上例是用来监听主机的80端口收到和发送的所有数据包,结合-A参数,在web开发中,真是非常有用。

监听指定主机和端口

$ tcpdump -i eth0 -nnA ‘port 80 and src host 192.168.1.231‘

多个条件可以用and,or连接。上例表示监听192.168.1.231主机通过80端口发送的数据包。

监听除某个端口外的其它端口

$ tcpdump -i eth0 -nnA ‘!port 22‘

如果需要排除某个端口或者主机,可以使用“!”符号,上例表示监听非22端口的数据包。

小结:

tcpdump这个功能参数很多,表达式的选项也非常多,非常强大,不过常用的功能确实不多。详情可以通过man查看系统手册。

另外在抓取web包的时候,发送网页内容都是很奇怪的字符,发现是apache开启了gzip压缩的缘故,关闭掉gzip压缩就可以了。在ubuntu 12.04下,编辑vim /etc/apache2/mods-enabled/deflate.load文件,将加载模块deflate_module的语句注释掉,然后重启apache就OK了。

 

参考文章:http://www.01happy.com/linux-use-tcpdump-capture-network-packets/

以上是关于linux下最全抓包命令使用方式学习和拓展的主要内容,如果未能解决你的问题,请参考以下文章

最全的大数据入门学习路线

Linux 学习 - vim编辑器

Unity编辑器拓展最全实现

全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

网络学习 tcpdump 抓包工具

linux如何抓包