Loading

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

 

posted @ 2019-06-23 16:13  wuenwuen  阅读(1711)  评论(0编辑  收藏  举报