tcpdump

tcpdump 常用命令解释

img

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 抓包实践

打开三个窗口, 按顺序执行:

  1. tcpdump -iany -tttt -s0 '((tcp) and (port 8080))'
  2. nc -l 8080
  3. 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

参考:
tcpdump 抓包使用小结
[tcp] 快速掌握tcpdump抓包
Tcpdump Examples

posted @ 2021-07-31 14:29  张飘扬  阅读(537)  评论(0编辑  收藏  举报