tcpdump 常用命令解释
tcpdump -ieth1 -tttt -s0 -X -vvvv -c2 '((tcp) and ((port 8080) and ((src 10.64.108.37) or (dst 10.64.108.37))))'
-i
: 指定网卡抓包
-X
: 以 16 进制格式输出数据包的内容, 不加该参数, 会只输出 iptcp/udp 头部信息. 加上该选项会将整个数据包输出
-S
: 将tcp的序列号以绝对值形式输出, 默认相对值
-v
: 会输出稍微详细一点的信息包括校验和 ttl 之类的;
-vvv
: 会尝试解析应用层协议,输出详细信息。二者组合就能完整的详细信息
-vvvv
: 该参数其实是 - v 与 - vvv 的组合
-tttt
: 每一行都打印带有日期的时间戳
-s
: 抓取数据包时默认抓取长度为 68 字节, 加上 - s 0 后可以抓到完整的数据包
-c
: 抓取数据包数量
-n
: 禁用域名解析, 让 tcpdump 直接输出 IP 地址
-nn:
: 禁止转换协议和端口号
-A
: 以 ASCII 值显示抓到的包, 比如和 MySQL 的交互时, 可以通过此命令查看包的文本内容
-w
: 输出信息保存到指定文件
tcpdump 命令演示
-
列出可以抓包的网络接口
tcpdump -D
-
从所有网卡中捕获数据包
tcpdump -i any
-
将捕获的包写入文件, 这里是以二进制的形式写入的
tcpdump -i eth1 -w packets_file
-
读取之前产生的 tcpdump 二进制文件, 这里也可以使用各种规则来做过滤
tcpdump -r packets_file
-
获取更多的包信息, 并且以可读的形式显示时间戳
tcpdump -ttttnnvvS
-
查看整个网络的数据包
tcpdump net 192.168.1.0/24
-
根据 IP 地址查看报文, 不管是作为源地址还是目的地址
tcpdump host 192.168.1.100
-
要指定 IP 地址是源地址或是目的地址
tcpdump src 192.168.1.100 tcpdump dst 192.168.1.100
-
查看某个协议或端口号的数据包
tcpdump ssh
-
捕获某个端口或一个范围的数据包
tcpdump port 22 tcpdump portrange 22-125
tcpdump 抓包实践
打开三个窗口, 按顺序执行:
tcpdump -iany -tttt -s0 '((tcp) and (port 8080))'
nc -l 8080
nc 127.0.0.1 8080
得到抓包结果(tcp 三次握手):
2021-07-31 11:10:07.734092 IP VM_232_2_centos.46904 > VM_232_2_centos.webcache: Flags [S], seq 1675810149, win 43690, options [mss 65495,sackOK,TS val 3218517881 ecr 0,nop,wscale 7], length 0
2021-07-31 11:10:07.734102 IP VM_232_2_centos.webcache > VM_232_2_centos.46904: Flags [S.], seq 2585831719, ack 1675810150, win 43690, options [mss 65495,sackOK,TS val 3218517881 ecr 3218517881,nop,wscale 7], length 0
2021-07-31 11:10:07.734108 IP VM_232_2_centos.46904 > VM_232_2_centos.webcache: Flags [.], ack 1, win 342, options [nop,nop,TS val 3218517881 ecr 3218517881], length 0
在源 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同步标识,以及确认S的ACK
[P.]: 推送数据, 和 ACK
[R.]: RST, 连接重置
[F.]: FIN 结束连接
[DF]: Don't Fragment(不要碎裂),当DF=0时,表示允许分片,一般-v
时才有这个标识
[FP.]: 标记FIN、PUSH、ACK组合,这样做是为了提升网络效率,减少数据来回确认等
然后是该数据包的 tcp 序列号. 对于抓取的第一个数据包, 该字段值是一个绝对数字, 后续包使用相对数值, 以便更容易查询跟踪
2021-07-31 11:29:03.891028 IP VM_232_2_centos.46918 > VM_232_2_centos.webcache: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 3218801921 ecr 3218799216], length 5: HTTP
2021-07-31 11:29:03.891065 IP VM_232_2_centos.webcache > VM_232_2_centos.46918: Flags [.], ack 6, win 342, options [nop,nop,TS val 3218801921 ecr 3218801921], length 0
使用 -S
则使用将 tcp 的序列号以绝对值形式输出(默认相对值)
2021-07-31 11:29:03.891028 IP VM_232_2_centos.46918 > VM_232_2_centos.webcache: Flags [P.], seq 3962824894:3962824899, ack 2154234308, win 342, options [nop,nop,TS val 3218801921 ecr 3218799216], length 5: HTTP
2021-07-31 11:29:03.891065 IP VM_232_2_centos.webcache > VM_232_2_centos.46918: Flags [.], ack 3962824899, win 342, options [nop,nop,TS val 3218801921 ecr 3218801921], length 0
接下来是 ack 值. 在数据接收方, 该字段代表数据流上的下一个预期字节数据.
接下来字段是接收窗口大小 win 309,它表示接收缓冲区中可用的字节数,后跟 TCP 选项如 MSS(最大段大小)或者窗口比例值。更详尽的 TCP 协议内容请参考 Transmission Control Protocol(TCP) Parameters。
最后, length 代表数据包有效载荷字节长度. 这个长度和 seq 序列号中字节数值长度是不一样的
四次挥手:
2021-07-31 12:03:38.792861 IP 127.0.0.1.46957 > 127.0.0.1.8080: Flags [F.], seq 13, ack 1, win 342, options [nop,nop,TS val 3219320646 ecr 3219314581], length 0
2021-07-31 12:03:38.792900 IP 127.0.0.1.8080 > 127.0.0.1.46957: Flags [F.], seq 1, ack 14, win 342, options [nop,nop,TS val 3219320646 ecr 3219320646], length 0
2021-07-31 12:03:38.792912 IP 127.0.0.1.46957 > 127.0.0.1.8080: Flags [.], ack 2, win 342, options [nop,nop,TS val 3219320646 ecr 3219320646], length 0