tcpdump抓包命令
目录:
-
命令格式
-
选项
-
expression表达式
- 示例
【命令格式】
man手册显示如下
1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ] 2 [ -c count ] 3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ] 4 [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] 5 [ --number ] [ -Q|-P in|out|inout ] 6 [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ] 7 [ -W filecount ] 8 [ -E spi@ipaddr algo:secret,... ] 9 [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] 10 [ --time-stamp-precision=tstamp_precision ] 11 [ --immediate-mode ] [ --version ] 12 [ expression ]
【选项】
-A 以ASCII码打印报文(不包括链路层的头),方便分析网页-c 抓取多少数据包后退出-C 用于判断-w选项写入将报文写入的文件大小是否超过此值,如果超过就新建文件(文件名后缀1、2、3递增)-d 将匹配信息包的编译代码以人类易读的方式输出至stdout-dd 将匹配信息包的代码作为C语言程序段格式给出-ddd 将匹配信息包的代码以十进制格式给出-D 列出当前可用于抓包的网卡名称和对应编号。网卡名称和对应编号可用于-i选项-e 打印链路层的头部信息,如MAC地址-f 以数字形式打印外部ip地址-F 从文件中读取过滤表达式,忽略命令行上的其它表达式-G 每隔多少秒重新存储数据包至文件(-w选项指定的文件,需带时间),用法如tcpdump -i ens35 -G 3 -w packets_%H%M%S.pcap-i 抓取指定网卡的数据流。若不指定,则使用最小编号(-D)的网卡;any参数抓取所有网卡的数据流-K 不尝试计算IP、TCP、UDP校验和-l 使标准输出变为缓冲形式(小写L);tcpdump -l | tee dat或者tcpdump -l > dat & tail -f dat,实现边写入文件边标准输出-L 列出数据连接类型-n 显示ip而不是主机名-nn 显示端口号,而不是端口名-N 不列出全域名-# 打印数据包的行号-p 非混杂模式,不能与host或broadcast一起使用-q 快速输出,显示较少信息-Q|-P 选择抓取某个方向的数据包,参数可以是in、out、inout(默认)-r 从文件中读取数据包-S 使用绝对值,而非相对值,打印tcp序列号-s 抓到每一个数据包的截取字节数,默认68字节。参数0表示不截断,抓取完整数据包。-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议)-t 不打印时间戳-tt 打印时间戳秒数,自1970/0/0 00:00:00开始-ttt 打印当前行和上一行的时间差-tttt 打印标准时间戳格式,如2019-06-21 14:10:49.314665-ttttt 打印当前行和第一行的时间差-v 打印比较详细的信息-vv 打印更加详细的信息-vvv 打印非常详细的信息-w 将数据包写入文件中,同时能使用-r选项恢复打印-X 输出包的头部信息,以16进制和ASCII两种方式同时输出-XX 详细输出包的头部信息,以16进制和ASCII两种方式同时输出expression 过滤表达式,筛选输出的数据包
【expression表达式】
tcpdump表达式由一个或多个"单元"组成,每个单元一般包含ID的修饰符和一个ID(数字或名称)
基本格式为:proto dir type
三种修饰符:
proto:协议类型
常用的协议有tcp/udp/arp/ip/ether/icmp等。
若未给定协议类型,则匹配所有可能的类型。例如"tcp port 21","udp portrange 7000-7009";
dir:指定ID的方向
可以给定的值包括src/dst/src or dst/src and dst,默认为src or dst。
例如,"src foo"表示源主机为foo的数据包,"dst net 128.3"表示目标网络为128.3的数据包,"src or dst port 22"表示源或目的端口为22的数据包;
type:指定ID的类型
可以给定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默认的type为host;
除了修饰符和ID组成表达式单元,还有关键字表达式单元(gateway,broadcast,less,greater)和算术表达式
表达式单元之间可以使用操作符" and / && / or / || / not / ! "进行连接,如"host foo and not port ftp and not port ftp-data"
同样的修饰符可省略,"tcp dst port ftp or ftp-data or domain"与"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意义相同
使用括号"()"可以改变表达式的优先级,但需要注意的是括号会被shell解释,所以应该使用反斜线"\"转义为"\(\)",在需要的时候,还需要包围在引号中。
常用端口和名字的对应关系可在linux系统中的/etc/services文件中找到
【示例】
查询端口ens32的数据包
# tcpdump -i ens32 -w ens32.pcap
查询所有端口数据包,并写入文件
# tcpdump -i any -w any.pcap
边显示边写入文件
# tcpdump -i ens32 -l |tee ens32.pcap
抓取与132服务器交互的数据包
# tcpdump -i ens35 -q -n -nn net 192.168.237.132
抓取来自132的数据包(默认会抓取src or dst)
# tcpdump -i ens35 -q -n -nn src host 192.168.237.132 # tcpdump -i ens35 -q -n -nn src net 192.168.237.132
抓取与132服务器交互的数据包,但排除22端口
# tcpdump -i ens35 -q -n -nn net 192.168.237.132 and not port 22
抓取端口80上与132服务器交互的数据包
# tcpdump -i ens35 -q -n -nn -tttt net 192.168.237.132 and tcp port 80
抓取端口范围10-80上来自132的数据包,同时排除22端口
# tcpdump -i ens35 -q -n -nn src net 192.168.237.132 and tcp portrange 10-80 and not port 22
Tips:proto协议不能修饰host和net,只能修饰port或portrange