Linux命令:tcpdump详解
前言:
tcpdump 是一款灵活、功能强大的抓包工具,能有效地帮助排查网络故障问题。
1 安装
1.1 查看是否安装
2.2 使用工具安装
sudo yum install -y tcpdump
2 用法详解
2.1 获取网卡的列表
tcpdump -D
2.2 参数:-i
2.2.1 抓取en0的数据
tcpdump -i en0
2.2.2 抓取所有网卡的数据
tcpdump -i any
2.3 参数-c
限制抓包数量,例如只抓取5个包
tcpdump -i en0 -c 5
2.4 参数-n和-nn
2.4.1 参数-n用于显示ip
2.4.2 参数-n用于显示ip和端口
2.5 筛选协议,如tcp,icmp
tcpdump -i en0 -c 5 -n icmp
2.6 筛选host
tcpdump -i any -c 5 -nn host 127.0.0.1
2.7 筛选port
tcpdump -i any -c 5 -nn port 3306
2.8 筛选源ip
tcpdump -i any -c 5 -nn src 127.0.0.1
2.9 筛选目的ip
tcpdump -i any -c 5 -nn dst 127.0.0.1
2.10 多条件筛选(or或者and)
tcpdump -i any -c 5 -nn dst 127.0.0.1 and port 3306
tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
该例子中我们只抓取了来自源 IP 为 192.168.122.98 或者 54.204.39.132 的 HTTP (端口号80)的数据包。使用该方法就很容易抓取到数据流中交互双方的数据包了。
2.10 参数-w和-r
保存抓包数据
tcpdump -i any -c10 -nn -w webserver.pcap port 80
tcpdump -r webserver.pcap
3 报文详解
tcpdump 抓取的 TCP 报文看起来如下:
08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.],
seq
196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372
具体的字段根据不同的报文类型会有不同,但上面这个例子是一般的格式形式。
第一个字段 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-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 ***中字节数值长度是不一样的。