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条帧。