如何理解tcpdump的抓包日志
tcpdump 是一个强大的抓包工具,它可以用于抓取指定网络端口上的数据,这在某些场景下会非常有用。tcpdump 的命令参数相当复杂,打开它的 man page,你会发现有好多页内容,真让人头大。此外它的日志输出格式也比较独特,如果不了解规则的话将很难读懂。
通常情况下,一个命令的常用参数不会太多,man page 大而全的做法反而使得上手困难(太长,难以阅读)。因此,我建议你尝试一下 tldr,它与 man page 相反(TL;DR——Too Long, Didn’t Read),只提供命令最常见的用法,以简洁友好的方式展现出来,非常适合快速了解一个命令。
常用的命令参数
如下是 tcpdump 命令在 tldr 中的展示
1 | Dump traffic on a network. |
搞懂上面这些命令,基本就能满足大多数场景,如果有更复杂的需求,还是要结合 man page 探索下更高级的用法。
man page中提供的一个示例
为了讲解日志格式,man page 里提供了一个抓包日志示例:这是使用 rlogin 从主机 rtsg 登录到主机 csam 的部分日志。
1 | IP rtsg.1023 > csam.login: Flags [S], seq 768512:768512, win 4096, opts [mss 1024] |
- 第一行。主机 rtsg 通过 1023 端口向主机 csam 的 login 端口发送了一个数据包,Flag 中的 S 表示设置了 SYN 标志,说明这是一个 SYN 包。这个包的 seq 是 768512,序号的格式是
first:last
,其中已发送的数据中不包含 last 所指向的字节,对于本例来说,发送的数据为空。 - 第二行。主机 csam 向主机 rtsg 回复了一个 ACK,对应于 Flag 中的
.
,同时还设置了 SYN 标识,可以看出这是 3 次握手中的第二个数据包。同样,它也不包含任何数据,因此 seq 值为947648:947648
。ACK 的值为768513 = 768512 + 1
,表示期望的数据包序号。win 4096
表示窗口大小,也就是本地可以缓存的数据大小。 - 第六行。rtsg 向 csam 发送了长度为 19 的数据包,序号为 2 - 20,并且设置了 PUSH 标志。
- 第七行。csam 回复 rtsg 收到了数据,
ack 21
表示已经收到了序号为 20 的数据,期望序号为 21。win 4077
表示此时它的窗口大小为 4077,可以看出已收到的 19 个字节的数据就在缓冲区中。 - 第八行和第九行。csam 分别向 rtsg 发送了一个字节的紧急数据(均设置了 urg 标志)
tcp数据格式
如果不带任选字段(Options),tcp header 的长度为 20 个字节,它的格式如下图所示:
1 | 0 15 31 |
0-1 字节:16位的源端口号
2-3字节:16位的目的端口号
4-7字节:32位序号
8-11字节:32位确认序号
12-13字节:4位首部长度、保留位、标志位 CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
14-15字节:16位窗口大小
16-17字节:16位校验和
18-19字节:16位紧急指针
根据标志位过滤
只保留设置了 syn 标志或 fin 标志的数据包
1 | tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' |
更多请参考 man page
man page提供的示例
1 | To print all packets arriving at or departing from sundown: |