tcpdump快速入门及实践手册

tcpdump快速入门及实践手册

1. 快速入门

1. 基本用法

基本用法: tcpdump 选项 参数 过滤器 参数

shell 复制代码
[root@kysrv1 pwe]# tcpdump -h
tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1f  31 Mar 2020
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
		[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
		[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
		[ -Q in|out|inout ]
		[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
		[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
		[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
		[ -Z user ] [ expression ]
[root@kysrv1 pwe]# 

2. 参数及选项

  • 【-A】:以ASCII打印报文的数据内容,与参数-X冲突。
  • 【-b】: 指定协议,包括 iparprarpicmp等。
  • 【-c】:数字,指定抓包数量。
  • 【-C】:数字,保存文件的大小(单位为MB) ,常配合-W使用,代表抓取的包构成多少个pcap文件,每个文件大小多少。
  • 【-D】:列出所有可用网络接口。
  • 【-e】:显示通信双方MAC地址。
  • 【-i】 :指定监听网卡名称,-i any 表示监听所有网卡。
  • 【-n】: 不解析主机名,直接用IP地址显示;默认用hostname显示,不带该参数会导致回显比较慢,因为要处理域名翻译。
  • 【-nn】: 不解析主机名和端口,直接用Port显示; 默认显示Port对应的服务名。
  • 【-P】:指定抓取的包是进入 还是流出 的,可选参数有in、out、inout ,默认 inout
  • 【-p】: 关闭接口的混杂模式。
  • 【-q】: 快速打印输出,只输出少量的协议相关信息。
  • 【-r】:从抓包文件读取内容。
  • 【-s】: 数字,设置要抓取的包长,默认96字节;如果-s 0,会截取全部内容。
  • 【-S】:以绝对值 形式输出TCP序列号,缺省时以相对值形式输出。
  • 【-t】:不打印时间戳。
  • 【-tt】:显示时间戳。
  • 【-ttt】:显示请求与响应的时间间隔而非绝对时间。
  • 【-vv】:输出详细信息。
  • 【-w】:输出到指定pcap文件;缺省时默认保存在系统的默认路径下;当指定输出文件时,就不会输出到屏幕了。
  • 【-W】:数字,抓取多少个pcap文件,配合-C使用。
  • 【-x】:用16进制显示从ip层及以上开始的帧内容。
  • 【-X】:用16进制和ascii显示ip层及以上的报文头。
  • 【-xx】:同-x,但是从数据链路层(即以太网头部)开始打印。
  • 【-XX】:同-X,但是从数据链路层(即以太网头部)开始打印。
  • 【-Z】:用户名,以该用户权限来执行抓包。
  • 【-G】:从缓存写入到文件的时间间隔(默认是 2 秒);如果想要 tcpdump 立即将数据写入文件,可以使用 -G 参数。

3. 过滤器及参数

过滤器分类

  • 协议(Proto): 可选有 ip, arp, rarp, tcp, udp, icmp, ether 等,默认是所有协议的包。
  • 方向(Dir): 可选有 src, dst, src or dst, src and dst,默认为 src or dst
  • 类型(Type): 可选有 host, net, port, portrange(端口范围,比如 21-42),默认为 host。
  • 组合逻辑运行符: 可选有 andornot括号 等。

括号:

()等特殊符号需要加转义符 或者用单引号 ,如下示例:

shell 复制代码
tcpdump host 192.168.58.1 and \(192.168.58.151 or 192.168.58.131\)
tcpdump host 192.168.58.1 and '(192.168.58.151 or 192.168.58.131)'

上述表达式的含义为:抓取主机192.168.58.1 与(主机192.168.58.151 或 主机 192.168.58.131)之间的通信包。

2. 常用命令

1. 监听指定网卡

shell 复制代码
tcpdump -i ens33

2. 监听全部网卡

shell 复制代码
tcpdump -i any

3. 保存Wireshark识别文件格式

shell 复制代码
tcpdump -i ens33 -w output.pcap

4. 查看已有数据包

shell 复制代码
tcpdump -r output.pcap

5. 指定抓取数据包的个数

shell 复制代码
tcpdump -i ens33 -c 200

上述语句的含义是只抓取200个数据包,然后tcpdump就结束抓取报文。

6. 时间格式命名保存报文文件名称

shell 复制代码
tcpdump -i ens33 port 8080 -w /tmpgram//$(date +%Y%m%d_%H%M).pcap

7. 显示通信双方IP地址和端口

shell 复制代码
tcpdump -i ens33 -nn

8. 显示通信双方MAC地址

shell 复制代码
tcpdump -i ens33 -e

9. 显示通信双方MAC地址+IP地址.端口

shell 复制代码
tcpdump -i ens33 -nne

10. 显示通信双方相对时间

shell 复制代码
tcpdump -i ens33 -ttt

11. 抓取指定主机所有收发数据包

shell 复制代码
tcpdump host 10.16.21.61

12. 抓取主机指定网卡所有数据包

比如:抓取主机192.168.58.145 上,经过指定网卡ens33的所有数据包

shell 复制代码
tcpdump -i ens33 host 192.168.58.145

13. 抓取指定端口数据包

抓取指定端口收发报文

shell 复制代码
tcpdump -i ens33 port 512

抓取目标端口为512的数据包

shell 复制代码
tcpdump dst port 512

抓取源端口为512的数据包

shell 复制代码
tcpdump src port 512

14. 抓取某一范围端口数据包

抓取 10001200 UDP 端口数据

shell 复制代码
tcpdump udp and portrange 1000-1200

15. 抓取指定网段数据包

指定收发网段

shell 复制代码
tcpdump net 192.168.10

指定源网段

shell 复制代码
tcpdump src net 192.168.20

指定目标网段

shell 复制代码
tcpdump dst net 192.168.20

16. 抓取指定协议类型数据包

shell 复制代码
tcpdump -i ens33 ip
tcpdump -i ens33 tcp
tcpdump -i ens33 udp

3. 组合逻辑表达式命令

组合表达式

shell 复制代码
tcpdump -i ens33 -xx -c 5 '((udp) and (port 1281) and ((dst host 192.168.58.145) and (src host 192.168.58.1)))'

表达式含义: 抓取网络接口ens33上主机192.168.58.1向主机192.168.58.145发送的 UDP端口为1281 的数据包。

4. 案例讲解

1. 指定端口UDP抓包

表达式如下

shell 复制代码
tcpdump -i ens33 -e -xx -XX -vv -c 5 udp and dst port 1281

参数说明

  • -i 指定网络接口名称,ens33 为主机接口名称;
  • -e 显示通信双方MAC地址;
  • -xx -XX 用十六进制显示以太网数据帧;
  • -vv 输出详细信息;
  • -c 指定抓包数量,本示例中抓取5个数据包就结束抓包;
  • udp: 抓取UDP 数据包;
  • dst port: 抓取目标端口为1281的数据包。

测试数据

抓取效果

2. UDP以太网帧分析

以太网帧

shell 复制代码
0x0000:  000c 2972 87e0 0050 56c0 0008 0800 4500  ..)r...PV.....E.
0x0010:  0053 b360 0000 8011 9156 c0a8 3a01 c0a8  .S.`.....V..:...
0x0020:  3a91 c351 0501 003f 0715 90eb 0303 0004  :..Q...?........
0x0030:  a700 b461 a001 0126 0001 0000 1f00 0120  ...a...&........
0x0040:  1010 1700 0000 0003 00a7 000e 0003 0001  ................
0x0050:  0300 0400 ff16 00ff 1700 ff99 760a f0ff  ............v...
0x0060:  dd 

以太网帧分析

14 个字节以太网帧首部 + 20 个字节IP帧首部 + 8个字节UDP帧首部。

shell 复制代码
#14字节以太网首部
000c 2972 87e0 0050 56c0 0008 0800 
#20字节IP首部
4500 0053 b360 0000 8011 9156 c0a8 3a01 c0a8 3a91 
#8字节UDP首部
c351 0501 003f 0715 
#用户数据
90eb 0303 0004 a700 b461 a001 0126 0001 0000 1f00 0120 1010 1700 0000 0003 00a7 000e 0003 0001 0300 0400 ff16 00ff 1700 ff99 760a f0ff dd 

3. TCP三次握手

测试工具

在Linux主机上,使用**nc** 工具监听10086端口。

shell 复制代码
nc -l 10086

测试数据

使用ComMax工具发送TCP连接请求。

抓包表达式

shell 复制代码
tcpdump -i ens33 -nn tcp and port 10086

参数说明

  • -i 指定网络接口名称,ens33 为主机接口名称;
  • -nn 不解析主机名和端口,直接用Port显示; 默认显示Port对应的服务名;
  • tcp: 抓取TCP 数据包;
  • port: 抓取收发端口为10086的数据包。

三次握手

shell 复制代码
10:17:43.577371 IP 192.168.58.1.59225 > 192.168.58.145.10086: Flags [S], seq 4126457226, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
10:17:43.577404 IP 192.168.58.145.10086 > 192.168.58.1.59225: Flags [S.], seq 2886975696, ack 4126457227, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
10:17:43.579825 IP 192.168.58.1.59225 > 192.168.58.145.10086: Flags [.], ack 1, win 513, length 0

Flags 含义:

  • S : 表示Start 开始握手;
  • S. : 表示Start+Ack 握手并确认;
  • . : 表示Ack 握手确认;
  • P. : 表示Push+Ack 数据发送和确认;
  • F. : 表示Finish+Ack 挥手并确认;

数据传输及挥手

4. TCP以太网帧分析

TCP测试数据

抓包表达式

shell 复制代码
tcpdump -i ens33 -xx -nn tcp and port 10086

以太网帧

shell 复制代码
10:34:54.669979 IP 192.168.58.1.55673 > 192.168.58.145.10086: Flags [P.], seq 1:13, ack 1, win 513, length 12
	0x0000:  000c 2972 87e0 0050 56c0 0008 0800 4500
	0x0010:  0034 b3b3 4000 8006 512d c0a8 3a01 c0a8
	0x0020:  3a91 d979 2766 b6e0 0611 9ced 82b6 5018
	0x0030:  0201 d852 0000 0100 0000 0006 0103 0001
	0x0040:  000a

以太网帧分析

14 个字节以太网帧首部 + 20 个字节IP帧首部 + 20个字节TCP帧首部。

shell 复制代码
#14字节以太网首部
000c 2972 87e0 0050 56c0 0008 0800
#20字节IP首部
4500 0034 b3b3 4000 8006 512d c0a8 3a01 c0a8 3a91
#20字节TCP首部
d979 2766 b6e0 0611 9ced 82b6 5018 0201 d852 0000
#用户数据
0100 0000 0006 0103 0001 000a

5. 抓包并保存到文件

抓包并保存到文件,同时控制文件大小和文件个数。

表达式

shell 复制代码
tcpdump -i ens33 -s 0 -xx -nn udp port 1281 -w /var/gram/ats.pcap -C 2 -W 3 -Z root 

参数说明

  • -i 指定网络接口名称,ens33 为主机接口名称;
  • -s 0 抓取全部报文内容;
  • -xx 用十六进制显示以太网数据帧;
  • -nn 不解析主机名和端口;
  • udp port 1281: 捕获UDP类型,端口为1281的数据。
  • -w 报文保存路径,指定为 /var/gram/ats.pcap
  • -C 2: 保存文件的大小(单位为MB)为2MB ;
  • -W 3: 抓取3个pcap文件,依次命名为 ats.pcap0ats.pcap1ats.pcap2
  • -Z:root用户权限执行保存报文。

测试数据

表达式验证

先验证表达式是否正确,然后再保存报文。

shell 复制代码
tcpdump -i ens33 -s 0 -xx -nn udp port 1281 -Z root

执行保存报文

shell 复制代码
tcpdump -i ens33 -s 0 -xx -nn udp port 1281 -w /var/gram/ats.pcap -C 2 -W 3 -Z root

开始保存报文,创建第一个文件 ats.pcap0

当第一个文件的大小到达2MB 时,开始创建第二个文件 ats.pcap1

当三个文件都存满的时候,tcpdump将以覆盖的方式存储。

循环覆盖中

6. 读取存盘文件

如果用tcpdump读取已经保存的文件,则用tcpdump -r file.pcap 命令。

表达式如下:

shell 复制代码
tcpdump -r ats.pcap0 -xx -nn -c 3
  • -c 3 表示只读取3条帧。
相关推荐
BAGAE13 小时前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase
手握风云-13 小时前
ProtoBuf:从序列化原理到高性能架构底座(一)
java·网络·架构
caimouse13 小时前
Reactos 第 9 章 设备驱动 — 9.6 中断处理
网络·windows
herinspace13 小时前
管家婆辉煌软件如何新增往来单位档案分类
服务器·数据库·电脑·管家婆软件
RoboWizard14 小时前
一块硬盘上架前要闯多少关?
java·服务器·数据库
吴阿福|一人公司14 小时前
深度解析 Python 类变量修改的命名空间隔离
java·服务器·数据结构
qq36219670514 小时前
第三方安卓应用商店安全评测 2026:Appteka、Aptoide、APKPure 等 7 家横评
android·网络·人工智能·安全·chatgpt·智能手机
AI科技星14 小时前
数术工坊・八卷全书【本源创世终极版・万世定稿】
开发语言·网络·量子计算·拓扑学
土星云SaturnCloud15 小时前
从云端到边缘:电子装配线AI视频分析在土星云SE110S-WA32上的落地实践
服务器·人工智能·ai·边缘计算
AI科技星15 小时前
数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
c语言·开发语言·网络·量子计算·agi