tcpdump
tcpdump 是 Linux 系统中基于 libpcap 库实现的抓包工具,根据使用者的定义对网络上的数据包进行截获,tcpdump 可以将网络中传送的数据包中的"头"完全截获下来提供分析,支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助去掉无用的信息。通过 tcpdump 可以分析很多网络行为,比如丢包重传、详细报文、tcp 分组等,总之通过 tcpdunp 可以为各种网络问题进行排查,可以在服务器上将捕获的数据包信息以 pcap 文件保存下来,通过 wireshark 打开,更直观地分析。本文主要介绍 tcpdump 的常见使用方法,关于其原理与实现可以参考 Tcpdump 原理与实现。
命令格式
tcpdump 命令格式如下:
|
|
在表达式中一般有如下几种类型的关键字:
type
|
|
direction
|
|
protocol
|
|
逻辑运算
|
|
可以使用 and 或者 && 来将两个或多个条件组合起来:
|
|
可以使用 or 或者 || 检查是否匹配命令所列条件中的其中一条:
|
|
可以用 not 或者 ! 表达不匹配某项条件时:
|
|
|
|
参数实例
|
|
- tcp: 协议类型,用来过滤数据报的协议类型。
- -i bond0 : 只抓取经过接口 bond0 的包
- -tttt : 使用格式 2019-02-02 10:37:37.120297, 便于分析。
- -s 0: 抓取数据包时默认抓取长度为 68 字节。加上 - s 0 后可以抓到完整的数据包
- -c 100: 只抓取 100 个数据包
- dst port ! 22: 不抓取目标端口是 22 的数据包
- src net 10.10.1.0/24: 数据包的源网络地址为 10.10.1.0/24
- -w 20190131.pcap: 保存成 pcap 文件中, 方便使用 wireshark 分析抓包结果
使用 tcpdump 抓包,需要管理员权限,因此下面的示例中绝大多数命令都是以 sudo 开头。
首先,先用 tcpdump -D 命令列出可以抓包的网络接口:
|
|
抓取报文格式
tcpdump 能够抓取并解码多种协议类型的数据报文,如 TCP、UDP、ICMP 等等。虽然这里我们不可能介绍所有的数据报文类型,但可以分析下 TCP 类型的数据报文,来帮助你入门。更多有关 tcpdump 的详细介绍可以参考其 帮助手册。tcpdump 抓取的 TCP 报文看起来如下:
|
|
具体的字段根据不同的报文类型会有不同,但上面这个例子是一般的格式形式。
- 第一个字段 08:41:13.729687 是该数据报文被抓取的系统本地时间戳。
- IP 是网络层协议类型,这里是 IPv4,如果是 IPv6 协议,该字段值是 IP6。
- 192.168.64.28.22 是源 ip 地址和端口号,紧跟其后的是目的 ip 地址和其端口号,这里是 192.168.64.1.41916。
- 在源 IP 和目的 IP 之后,可以看到是 TCP 报文标记段 Flags [P.]。该字段通常取值如下:
| 值 | 标志类型 | 描述 |
|---|---|---|
| S | SYN | Connection Start 发起连接标志 |
| F | FIN | Connection Finish 关闭连接标志 |
| P | PUSH | Data push 传送数据标志 |
| R | RST | Connection reset 异常关闭连接 |
| . | ACK | Acknowledgment 表示确认包 |
该字段也可以是这些值的组合,例如 [S.] 代表 SYN-ACK 数据包。
- 接下来是该数据包中数据的序列号。对于抓取的第一个数据包,该字段值是一个绝对数字,后续包使用相对数值,以便更容易查询跟踪。例如此处 seq 196:568 代表该数据包包含该数据流的第 196 到 568 字节。
- 接下来是 ack 值:ack 1。该数据包是数据发送方,ack 值为 1。在数据接收方,该字段代表数据流上的下一个预期字节数据,例如,该数据流中下一个数据包的 ack 值应该是 568。
- 接下来字段是接收窗口大小 win 309,它表示接收缓冲区中可用的字节数,后跟 TCP 选项如 MSS(最大段大小)或者窗口比例值。更详尽的 TCP 协议内容请参考 Transmission Control Protocol(TCP) Parameters。
- 最后,length 372 代表数据包有效载荷字节长度。这个长度和 seq 序列号中字节数值长度是不一样的。
检查数据包内容
在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。
tcpdump 提供了两个选项可以查看数据包内容,-X 以十六进制打印出数据报文内容,-A 打印数据报文的 ASCII 值。
例如,HTTP 请求报文内容如下:
|
|
这对定位一些普通 HTTP 调用 API 接口的问题很有用。当然如果是加密报文,这个输出也就没多大用了。
保存抓包数据
tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以夜里让它在那里抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。
使用 -w 选项来保存数据包而不是在屏幕上显示出抓取的数据包:
|
|
该命令将抓取的数据包保存到文件 webserver.pcap。后缀名 pcap 表示文件是抓取的数据包格式。正如示例中所示,保存数据包到文件中时屏幕上就没有任何有关数据报文的输出,其中 -c10 表示抓取到 10 个数据包后就停止抓包。如果想有一些反馈来提示确实抓取到了数据包,可以使用 -v 选项。
tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 -r 选项参数来阅读该文件中的报文内容:
|
|
这里不需要管理员权限 sudo 了,因为此刻并不是在网络接口处抓包。
你还可以使用我们讨论过的任何过滤规则来过滤文件中的内容,就像使用实时数据一样。 例如,通过执行以下命令从源 IP 地址 54.204.39.132 检查文件中的数据包:
|
|
-
No backlinks found.