tcpdump命令使用详解
一:命令介绍:
tcpdump,用简单的语言概括就是dump the traffic on a network,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具,windows平台有sniffer等工具,tcpdump可以将网络中传输的数据包的“包头”全部捕获过来进程分析,其支持网络层、特定的传输协议、数据发送和接收的主机、网卡和端口的过滤,并提供and、or、not等语句进行逻辑组合捕获数据包或去掉不用的信息。
1:命令选项和捕获主机对到主机的数据包:
1.1:命令选项:
-a #将网络地址和广播地址转变成名字
-A #以ASCII格式打印出所有分组,并将链路层的头最小化
-b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
-c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump
-d #将匹配信息包的代码以人们能够理解的汇编格式输出
-dd #将匹配信息包的代码以c语言程序段的格式输出
-ddd #将匹配信息包的代码以十进制的形式输出
-D #打印系统中所有可以监控的网络接口
-e #在输出行打印出数据链路层的头部信息
-f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
-F #从指定的文件中读取表达式,忽略其他的表达式
-i #指定监听网络接口
-l #使标准输出变为缓冲形式,可以数据导出到文件
-L #列出网络接口已知的数据链路
-n #不把网络地址转换为名字
-N 不输出主机名中的域名部分,例如www.baidu.com只输出www
-nn #不进行端口名称的转换
-P #不将网络接口设置为混杂模式
-q #快速输出,即只输出较少的协议信息
-r #从指定的文件中读取数据,一般是-w保存的文件
-w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
-s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
-S #将tcp的序列号以绝对值形式输出,而不是相对值
-T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
-t #在输出的每一行不打印时间戳
-tt #在每一行中输出非格式化的时间戳
-ttt #输出本行和前面以后之间的时间差
-tttt #在每一行中输出data处理的默认格式的时间戳
-u #输出未解码的NFS句柄
-v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv#输出相信的保报文信息
1.1.1:#tcpdump的表达式:
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获,在表达式中一般如下几种类型的关键字:
a):关于数据类型的关键字:
包括host、port、net,例如host 192.168.1.1表示这是一台主机,net 192.168.0.0表示这是一个网络地址,port 22指明端口号是22,如果没有指明类型,则默认的类型是host。
b):数据传输方向的关键字:
包括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,即默认监听本机和目标主机的所有数据。
c):协议关键字:
包括ip、arp、rarp、tcp、udp等,
d):其他关键字:
运算类型的:or、and、not、!
辅助功能型的:gateway、less、broadcast、greater
1.2:# tcpdump 默认捕获方式
#默认监听在第一块网卡上,监听所有经过此网卡通过的数据包
1.3:# tcpdump -i eth0 监听指定网卡eth0的所有传输数据包:
1.4:#tcpdump -i eth0 host 192.168.56.1 #捕获主机192.168.56.1经过本机网卡eth0的所有数据包(也可以是主机名,但要求可以解析出来IP地址)
1.5:#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的所有通信数据包
1.6:#tcpdump ip host node9 and not www.baidu.com #捕获主机node9与其他主机之间(不包括www.baidu.com)通信的ip数据包
1.7:#tcpdump ip host node9 and ! www.baidu.com #捕获node9与其他所有主机的通信数据包(不包括www.baidu.com)
1.8:#tcpdump -i eth0 src node10 #捕获源主机node10发送的所有的经过eth0网卡的所有数据包
1.9:##tcpdump -i eth0 dst host www.baidu.com #捕获所有发送到主机www.baidu.com的数据包
1.9.1:监听主机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和!都是相同的取反的意思
1.9.2:捕获arp的协议数据包:
#tcpdump arp #监控指定主机的通信数据包与1.9.1方式相同
2:捕获指定主机和端口的数据包:
2.1:#tcpdump tcp port 22 and host 192.168.56.210 #捕获主机192.168.56.210接收和发出的tcp协议的ssh的数据包:
2.2:# tcpdump udp port 53 #监听本机udp的53端口的数据包,udp是dns协议的端口,这也是一个dns域名解析的完整过程
总结:tcpdump的语法类似于mysql查询语句,可以指定各种查询的条件进行组合,还可以进行与或非的条件判断进行更精确的数据搜集,语法如下:
#tcpdump [协议类型] [源或目标] [主机名称或IP] [or/and/not/!条件组合] [源或目标] [主机名或IP] [or/and/not/!条件组合] [端口] [端口号] …… [or/and/not/!条件组合] [条件]
#tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host ! www.baidu.com
转自:https://www.cnblogs.com/howhy/p/6396664.html
tcpdump 抓包工具详细图文教程
一、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 过滤规则和参数总结
转自:https://blog.csdn.net/weixin_46560589/article/details/130986789
上一篇文章: tcpdump 抓包工具详细图文教程(上)_Stars.Sky的博客-CSDN博客
https://blog.csdn.net/weixin_46560589/article/details/130985706