目录
一、tcpdump 常用参数的使用
1.1 tcpdump -i # 指定监听网络接口
1.2 tcpdump -w # 将捕获到的信息保存到文件中,且不分析和打印在屏幕
1.3 tcpdump -r # 从文件中读取数据
1.4 tcpdump -n # 不把 ip 转化成域名
1.5 tcpdump -t # 在每行的输出中不显示时间
1.6 tcpdump -v # 产生详细的输出
1.7 tcpdump -c # 指定收取数据包的次数
1.8 tcpdump -C # 与 -w FILE 选项配合使用
1.9 tcpdump -Q # 选择是入方向还是出方向的数据包
1.10 tcpdump -q # 简洁地打印输出
1.11 tcpdump -s # 指定每个包捕获的长度
1.12 tcpdump -A # 以 ASCII 格式打印出所有的分组并且读取此文件
1.13 tcpdump -e # 在输出行打印出数据链路层的头部信息
1.14 tcpdump -F # 指定使用哪个文件的过滤表达式抓包
1.15 tcpdump -l # 对标准输出进行行缓冲
二、tcpdump 过滤规则组合——逻辑运算
三、tcpdump 过滤规则——高级过滤
四、tcpdump 过滤规则和参数总结
一、tcpdump 常用参数的使用
tcpdump -h # 查看所有参数
[root@mysql01 ~]# tcpdump -h
tcpdump version 4.99.4
libpcap version 1.10.4 (with TPACKET_V3)
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-AbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [--count]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ --immediate-mode ] [ -j tstamptype ]
[ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ]
[ -r file ] [ -s snaplen ] [ -T type ] [ --version ]
[ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]
[ --time-stamp-precision precision ] [ --micro ] [ --nano ]
[ -z postrotate-command ] [ -Z user ] [ expression ]
1.1 tcpdump -i # 指定监听网络接口
tcpdump -i ens32
默认监听在第一块网卡上(使用 ifconfig 查看网课信息),监听所有经过此网卡通过的数据包;但是我们可能关心的数据并不是 ens32 的接口,这时就需要指定端囗进行数据包的捕获。
在 tcpdump 后面加一个 -i 的参数,后面跟具体需要捕获的接口名称,就可以抓取经过这个具体接口的所有数据包。tcpdump -i any 监听所有的网卡接口、用来查看是否有网络流量。
1.2 tcpdump -w # 将捕获到的信息保存到文件中,且不分析和打印在屏幕
tcpdump -i ens32 -w test.pcap
报文打印在 shell 里会太多且不方便查看,我们可以保存成文件;然后通过 xftp 导出到本地,可以详细查看。
扩展:导出的文件可以设置为 cap 或者 pcap 的格式,可以直接用 wireshark 工具打开;可以用 wireshark 工具分析报文具体信息!
1.3 tcpdump -r # 从文件中读取数据
读取后,我们照样可以使用上述的过滤器语法进行过滤分析。
tcpdump -r test.pcap
1.4 tcpdump -n # 不把 ip 转化成域名
直接显示 ip,避免执行 DNS lookups 解析的过程,速度会快很多:
tcpdump -nn:不把协议和端口转化成名字,速度也会快很多:
tcpdump -N:不打印出 host 的域名部分,将会打印 'nic' 而不是 'nic.ddn.mil'
1.5 tcpdump -t # 在每行的输出中不显示时间
tcpdump -tt:在每行的输出中会输出时间戳
tcpdump -ttt:输出每两行打印的时间间隔(以毫秒为单位)
tcpdump -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
1.6 tcpdump -v # 产生详细的输出
比如包的 TTL、id 标识、数据包长度,以及 IP 包的一些选项。同时它还会打开 一些附加的包完整性检测,比如对 IP 或 ICMP 包头部的校验和。
tcpdump -vv:产生比 -v 更详细的输出。比如 NFS 回应包中的附加域将会被打印,SMB 数据包也会被完全解码。
tcpdump -vvv:产生比 -vv 更详细的输出。比如 telent 时所使用的 SB、SE 选项将会被打印,如果telnet 同时使用的是图形界面,其相应的图形选项将会以 16 进制的方式打印出来。
1.7 tcpdump -c # 指定收取数据包的次数
即在收到指定数量的数据包后退出 tcpdump,停止抓包。
tcpdump -c 5 -w tt.pcap
解释:抓满 5 个报文之后,就停止 tcpdump 抓包。
1.8 tcpdump -C # 与 -w FILE 选项配合使用
该选项使得 tcpdump 在把原始数据包直接保存到文件中之前,检查此文件大小是否超过 file-size。如果超过了,将关闭此文件,另创一个文件继续保存原始数据包。新创建的文件名与 -w 选项指定的文件名一致,但文件名后多了一个数字,该数字会从 1 开始随着新创建文件的增多而增加。file-size 的单位是百万字节(这里指1,000,000个字节,并非1,048,576个字节)
tcpdump -C 1 -W 4 -w rr
指定一个单位后(1MB)就换文件,最多写 4 个文件,名字是 rr0、rr1、rr2、rr3:
1.9 tcpdump -Q # 选择是入方向还是出方向的数据包
可选项有:in、out、inout,也可以使用 --direction=[options]
- tcpdump -Q in
- tcpdump -Q out
- tcpdump -Q inout
1.10 tcpdump -q # 简洁地打印输出
即打印很少的协议相关信息,从而输出行都比较简短。
- tcpdump -D:显示所有可用网络接口的列表
- tcpdump -L:列出网络接口的已知数据链路。
1.11 tcpdump -s # 指定每个包捕获的长度
单位是 byte,而不是默认的 262144 bytes;如果超过了设定的大小限制,包就会被截断 ,而在打印行出现 [lproto] 这种标识,这个 proto 就是被截断的报文的协议名字。但是抓取 len 越长,包的处理时间越长,并且会减少 tcpdump 可缓存的数据包的数量,从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好(tcpdump -s 0 使用默认长度 262144)。
注意:不通的 tcpdump 版本,这个默认抓取的报文长度不一样。
1.12 tcpdump -A # 以 ASCII 格式打印出所有的分组并且读取此文件
这样可以使读取更加简单,方便使用 grep 等工具解析输出内容
tcpdump -A -r tt.pcap
tcpdump -A | grep baidu
tcpdump -X 表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。注意:-X 和 -A 两个参数不能一起使用。
tcpdump -X -r tt.pcap
1.13 tcpdump -e # 在输出行打印出数据链路层的头部信息
默认情况下 tcpdump 不会显示数据链路层信息,使用 -e 选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息。
tcpdump -e -r tt.pcap
1.14 tcpdump -F # 指定使用哪个文件的过滤表达式抓包
此时命令行上的输入过滤规则将被忽略,只以文件里的规则为准。
# 配置规则文件
[root@mysql01 ~]# vim filter_rule
tcp port 80
[root@mysql01 ~]# tcpdump -F filter_rule -c10
这种情况适用于将表达式放置在文件中长期维护。
1.15 tcpdump -l # 对标准输出进行行缓冲
在需要同时观察抓包打印以及保存抓包记录的时候很有用。比如,可通过以下命令组合来达到此抓包时保存到文件的同时查看包的内容。
tcpdump -l | tee tt.pcap
这命令是使用 tee 来把 tcpdump 的输出同时放到文件 tt.pcap 和标准输出中。
tee 功能说明:读取标准输入的数据,并将其内容输出成文件。
tcpdump -l > tt.pcap & tail -f tt.pcap
这个命令是通过重定向操作 '>' 写入到文件里。
二、tcpdump 过滤规则组合——逻辑运算
逻辑运算符:add、or、not
- and:所有的条件都需要满足,也可以表示为 &&
- or:只要有一个条件满足就可以,也可以表示为 ||
- not:取反,也可以使用 !
- and 优先级大于 or
and 例子:抓一个来自 100.100.30.26 主机、80 端口的包:tcpdump src 100.100.30.26 and port 80
or 例子:抓取 UDP 53 端口或者 TCP 53 端口的包(DNS协议的报文):tcpdump tcp port 53 or udp port 53
not 例子:抓取不是 22 端口的报文:tcpdump not tcp port 22
多个过滤器进行组合:需要用到括号,而括号在 shell 中是特殊符号,因此你需要使用引号将其包含:tcpdump "src 10.0.2.4 and (dst port 3389 or 22)"
练习案例:监听主机 192.168.56.1 和 192.168.56.210 之间 ip 协议的80端口的且排除www.baidu.com 通信的所有数据包:
tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host! www.baidu.com
tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host not www.baidu.com
即 not 和 !都是相同的取反的意思。
三、tcpdump 过滤规则——高级过滤
基于包大小进行过滤:查看指定大小的数据包
案例:抓取包大小小于 32 bytes 的数据包
tcpdump less 32
案例:抓取包大小大于 300 bytes 的数据包
tcpdump greater 300
四、tcpdump 过滤规则和参数总结
上一篇文章: tcpdump 抓包工具详细图文教程(上)_Stars.Sky的博客-CSDN博客