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】: 指定协议,包括
ip、arp、rarp、icmp等。 - 【-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。 - 组合逻辑运行符: 可选有
and、or、not和 括号 等。
括号:
()等特殊符号需要加转义符 或者用单引号 ,如下示例:
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. 抓取某一范围端口数据包
抓取 1000 至 1200 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.pcap0、ats.pcap1和ats.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条帧。
