https://blog.csdn.net/lza20001103/article/details/143363702
概述
tcpdump,用简单的语言概括就是dump the traffic on a network,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具,windows平台有sniffer等工具,tcpdump可以将网络中传输的数据包的“包头”全部捕获过来进程分析,其支持网络层、特定的传输协议、数据发送和接收的主机、网卡和端口的过滤,并提供and、or、not等语句进行逻辑组合捕获数据包或去掉不用的信息。
1-a #将网络地址和广播地址转变成名字
2-A #以ASCII格式打印出所有分组,并将链路层的头最小化
3-b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
4-c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump
5-d #将匹配信息包的代码以人们能够理解的汇编格式输出
6-dd #将匹配信息包的代码以c语言程序段的格式输出
7-ddd #将匹配信息包的代码以十进制的形式输出
8-D #打印系统中所有可以监控的网络接口
9-e #在输出行打印出数据链路层的头部信息
10-f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
11-F #从指定的文件中读取表达式,忽略其他的表达式
12-i #指定监听网络接口
13-l #使标准输出变为缓冲形式,可以数据导出到文件
14-L #列出网络接口已知的数据链路
15-n #不把网络地址转换为名字
16-N 不输出主机名中的域名部分,例如www.baidu.com只输出www
17-nn #不进行端口名称的转换
18-P #不将网络接口设置为混杂模式
19-q #快速输出,即只输出较少的协议信息
20-r #从指定的文件中读取数据,一般是-w保存的文件
21-w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
22-s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
23-S #将tcp的序列号以绝对值形式输出,而不是相对值
24-T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
25-t #在输出的每一行不打印时间戳
26-tt #在每一行中输出非格式化的时间戳
27-ttt #输出本行和前面以后之间的时间差
28-tttt #在每一行中输出data处理的默认格式的时间戳
29-u #输出未解码的NFS句柄
30-v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
31-vv#输出相信的保报文信息
关键字
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获,在表达式中一般如下几种类型的关键字:
-
数据类型
1包括host、port、net,例如host 192.168.1.1表示这是一台主机,net 192.168.0.0表示这是一个网络地址,port 22指明端口号是22,如果没有指明类型,则默认的类型是host。
-
数据传输方向
1包括src、dst、dst or src、dst and src,这些关键字指明了传输的方向,比如src 192.168.1.1说明数据包源地址是192.168.1.1,dst net 192.168.0.0指明目的网络地址是192.168.0.0,默认是监控主机对主机的src和dst,即默认监听本机和目标主机的所有数据。
-
协议
1包括ip、arp、rarp、tcp、udp等,
-
其他
not和!都是相同的取反的意思
1运算类型的:or、and、not、! 2 3辅助功能型的:gateway、less、broadcast、greater 4 5and:所有的条件都需要满足,也可以表示为 && 6or:只要有一个条件满足就可以,也可以表示为 || 7not:取反,也可以使用 ! 8and 优先级大于 or
选项
-
-h
查看所有参数
-
-i
指定监听网络接口
默认监听在第一块网卡上(使用 ifconfig 查看网卡信息),监听所有经过此网卡通过的数据包;但是我们可能关心的数据并不是 ens32 的接口,这时就需要指定端囗进行数据包的捕获。
在 tcpdump 后面加一个 -i 的参数,后面跟具体需要捕获的接口名称,就可以抓取经过这个具体接口的所有数据包。
tcpdump -i any
监听所有的网卡接口、用来查看是否有网络流量。1tcpdump -i ens32
-
-w
将捕获到的信息保存到文件中,且不分析和打印在屏幕.
报文打印在 shell 里会太多且不方便查看,我们可以保存成文件;然后通过 xftp 导出到本地,可以详细查看。
扩展:导出的文件可以设置为 cap 或者 pcap 的格式,可以直接用 wireshark 工具打开;可以用 wireshark 工具分析报文具体信息!
-
-n
不把 ip 转化成域名
直接显示 ip,避免执行 DNS lookups 解析的过程,速度会快很多。
-
-nn
不把协议和端口转化成名字,速度也会快很多。
-
-N
不打印出 host 的域名部分,将会打印 ‘nic’ 而不是 ‘nic.ddn.mil’
-
-t
在每行的输出中不显示时间
-
-tt
在每行的输出中会输出时间戳
-
-ttt
输出每两行打印的时间间隔(以毫秒为单位)
-
-tttt
在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
-
-v
比如包的 TTL、id 标识、数据包长度,以及 IP 包的一些选项。同时它还会打开 一些附加的包完整性检测,比如对 IP 或 ICMP 包头部的校验和。
-
-vv
产生比 -v 更详细的输出。比如 NFS 回应包中的附加域将会被打印,SMB 数据包也会被完全解码。
-
-vvv
产生比 -vv 更详细的输出。比如 telent 时所使用的 SB、SE 选项将会被打印,如果telnet 同时使用的是图形界面,其相应的图形选项将会以 16 进制的方式打印出来。
-
-c
即在收到指定数量的数据包后退出 tcpdump,停止抓包。
1tcpdump -c 5 -w tt.pcap
即在收到指定数量的数据包后退出 tcpdump,停止抓包。
-
-C
与 -w FILE 选项配合使用
该选项使得 tcpdump 在把原始数据包直接保存到文件中之前,检查此文件大小是否超过 file-size。如果超过了,将关闭此文件,另创一个文件继续保存原始数据包。新创建的文件名与 -w 选项指定的文件名一致,但文件名后多了一个数字,该数字会从 1 开始随着新创建文件的增多而增加。file-size 的单位是百万字节(这里指1,000,000个字节,并非1,048,576个字节)
1tcpdump -C 1 -W 4 -w rr
指定一个单位后(1MB)就换文件,最多写 4 个文件,名字是 rr0、rr1、rr2、rr3
-
-Q
选择是入方向还是出方向的数据包,可选项有:in、out、inout,也可以使用 –direction=[options]
1tcpdump -Q in 2tcpdump -Q out 3tcpdump -Q inout
-
-q
简洁地打印输出,即打印很少的协议相关信息,从而输出行都比较简短。
-
-D
显示所有可用网络接口的列表(网卡)
-
-L
列出网络接口的已知数据链路。
-
-s
指定每个包捕获的长度
单位是 byte,而不是默认的 262144 bytes;如果超过了设定的大小限制,包就会被截断 ,而在打印行出现 [lproto] 这种标识,这个 proto 就是被截断的报文的协议名字。但是抓取 len 越长,包的处理时间越长,并且会减少 tcpdump 可缓存的数据包的数量,从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好(tcpdump -s 0 使用默认长度 262144)。
1tcpdump -s 50
-
-A
以 ASCII 格式打印出所有的分组并且读取此文件
这样可以使读取更加简单,方便使用 grep 等工具解析输出内容
1tcpdump -A -r tt.pcap 2tcpdump -A | grep baidu
-
-X
表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。注意:-X 和 -A 两个参数不能一起使用。
1tcpdump -X -r tt.pcap
-
-F
指定使用哪个文件的过滤表达式抓包,此时命令行上的输入过滤规则将被忽略,只以文件里的规则为准。
1#配置规则文件 2[root@mysql01 ~]# vim filter_rule 3tcp port 80 4[root@mysql01 ~]# tcpdump -F filter_rule -c10
-
-l
对标准输出进行行缓冲
在需要同时观察抓包打印以及保存抓包记录的时候很有用。比如,可通过以下命令组合来达到此抓包时保存到文件的同时查看包的内容。
1tcpdump -l | tee tt.pcap
这命令是使用 tee 来把 tcpdump 的输出同时放到文件 tt.pcap 和标准输出中。
1tcpdump -l > tt.pcap & tail -f tt.pcap
这个命令是通过重定向操作 ‘>’ 写入到文件里。
示例
-
tcpdump
默认捕获方式,默认监听在第一块网卡上,监听所有经过此网卡通过的数据包
-
tcpdump -i eth0
监听指定网卡eth0的所有传输数据包
-
tcpdump -i eth0 host 192.168.56.1
捕获主机192.168.56.1经过本机网卡eth0的所有数据包(也可以是主机名,但要求可以解析出来IP地址)
-
tcpdump host 192.168.56.209 and \( 192.168.56.210 or 192.168.56.211 \)
捕获主机 192.168.56.209 和主机192.168.56.210或192.168.56.211的所有通信数据包
-
tcpdump ip host node9 and not www.baidu.com
捕获主机node9与其他主机之间(不包括www.baidu.com)通信的ip数据包
-
tcpdump ip host node9 and ! www.baidu.com
捕获node9与其他所有主机的通信数据包(不包括www.baidu.com)
-
tcpdump -i eth0 src node10
捕获源主机node10发送的所有的经过eth0网卡的所有数据包
-
tcpdump -i eth0 dst host www.baidu.com
捕获所有发送到主机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
监听主机192.168.56.1和192.168.56.210之间ip协议的80端口的且排除www.baidu.com通信的所有数据包
-
tcpdump arp
监控指定主机的通信数据包
-
tcpdump tcp port 22 and host 192.168.56.210
捕获主机192.168.56.210接收和发出的tcp协议的ssh的数据包
-
tcpdump udp port 53
监听本机udp的53端口的数据包,udp是dns协议的端口,这也是一个dns域名解析的完整过程
-
tcpdump src 100.100.30.26 and port 80
抓一个来自 100.100.30.26 主机、80 端口的包
-
tcpdump tcp port 53 or udp port 53
抓取 UDP 53 端口或者 TCP 53 端口的包(DNS协议的报文)
-
tcpdump not tcp port 22
抓取不是 22 端口的报文
-
tcpdump “src 10.0.2.4 and (dst port 3389 or 22)”
多个过滤器进行组合:需要用到括号,而括号在 shell 中是特殊符号,因此你需要使用引号将其包含
-
tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host! www.baidu.com
监听主机 192.168.56.1 和 192.168.56.210 之间 ip 协议的80端口的且排除www.baidu.com 通信的所有数据包
-
tcpdump less 32
抓取包大小小于 32 bytes 的数据包
-
tcpdump greater 300
抓取包大小大于 300 bytes 的数据包