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