乐趣区

tcp-快速掌握tcpdump抓包

一说到抓包,好像有点高深莫测,其实在工作中,大部分是应用发生异常时需要抓包,以此来分析原因,Linux 下一般用 tcpdump 命令抓包,而使用 tcpdump 其实常用的参数也就那么几个

抓包主要是看数据传输是否都走了正确的 TCP 协议,比如因为网络或者攻击导致某些包 (SYN TIME_WAIT) 等特别多,这个时候抓包就很容看出来

因此抓包不必记太多参数,只要能过滤到我们想要的包即可

tcpdump 命令常用参数

-i 指定网络接口,例如 eth0、lo、pp0 等等的界面看一段直接用 tcpdump 命令抓包的文档
-S 将 tcp 的序列号以绝对值形式输出,默认相对值
-nn 不进行端口名称的转换,默认转换,比如 22 端口会显示 ssh
-w 存储抓到的包,一般.cap 格式
-v 输出更详细的报文信息,可以多个 v 一起使用,如 -vvvv

or|and|nor 与或非,以下参数如多个使用,则需要用到
host 指定过滤的 ip,比如 10.0.0.1,那么只抓与该 ip 相关的包
port 指定过滤的端口
src host 指定过滤的源 ip
dst host 指定过滤的目的 ip
src port 指定过滤的源端口
dst port 指定过滤的目的端口

tcpdump 抓包实例

tcpdump -S -nn port 443 and host 10.88.77.15
tcpdump -S -nn port 443 and host 10.88.77.15 -w /tmp/dump.wap

如抓取过滤有 host 为 10.25.137.230 和端口 443
tcpdump -S -nn host 10.25.137.230 and port 443

15:39:07.427683 IP 10.25.137.230.20260 > 10.29.64.142.443: Flags [P.], seq 1026816011:1026816267, ack 1193238686, win 115, length 256

以此行为例

  • 15:39:07.427683 网络包发生的时间

IP 10.25.137.230.20260 > 10.29.64.142.443:

  • IP 标识
  • 源 ip 或者源主机名和端口 20260;
  • > 流向符,数据包从左边发往右边
  • 目的 ip 或者目的主机名和端口 443

Flags [P.] Flags 的标记,此处为[P.],代表 PST 和 ACK(. 代表 ACK 确认)

seq 1026816011:1026816267, ack 1193238686, win 115, length 256

  • seq 为序列号
  • ack 为确认码
  • win 为滑动窗口大小
  • length 为承载的数据 (payload) 长度 length,如果没有数据则为 0

tcpdump 抓包的 FLags 标记

tcpdump 的 Flags 代表了这个数据包的用途,这些标记是 TCP 首部的内容

[S]:SYN 同步标识
[.]:. 表示 ACK 确认标识
[S.]:SYN 同步标识,以及确认[S] 的 ACK
[P.]:PSH,push 推送,数据传输
[R.]:RST, 连接重置
[F.]:FIN 结束连接
[DF]:Don’t Fragment(不要碎裂),当 DF= 0 时,表示允许分片,一般-v 时才有这个标识
[FP.]:标记 FIN、PUSH、ACK 组合,这样做是为了提升网络效率,减少数据来回确认等

退出移动版