抓包工具的作用
网络协议抓包工具主要用于对网络协议的数据包进行捕获,捕获后亦可通过其对数据包的结构及其封装内容进行分析查看,以便了解数据包在网络传输时的状态,进而为学习数据包结构和故障排除积累素材。
作用
- 对网络协议的数据包进行捕获
- 对抓获的网络协议数据包进行分析
位置
对于服务器之间的通信数据包抓包,可选择在网络接口卡上操作;如果需要捕获局域网数据包,需要网络设备的配合,例如使用集线器或使用交换机(需要完成端口镜像配置)。
抓包工具的分类
命令行抓包工具
tcpdump
- 在接口位置
- 对数据报文进行筛选
- 表达方式灵活
and、or、not - 终端中可以直接使用
- 对于初学者不利于数据报文分析
- 只能抓取流经本机的数据报文
图形界面抓包工具
wireshark
- 在接口位置
- 对数据报文进行筛选
- 对捕获数据包结构分层清析,易于对数据包进行分析
- 必须有图型界面配合使用
tcpdump命令行抓包工具应用
[root@localhost ~]# tcpdump
#不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包
格式说明
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ][ -s snaplen ] [ -w file ] [ expression ]
选项说明
# 抓包选项-c:指定要抓取的包数量。注意,是最终要获取这么多个包。例如,指定"-c 10"将获取10个包,但可能已经
处理了100个包,只不过只有10个包是满足条件的包。
-i interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配
置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),一旦找到第一个符合条件
的接口,搜寻马上结束。可以使用'any'关键字表示所有网络接口。
-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-N:不打印出host的域名部分。例如tcpdump将会打印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、"out"和"inout",默认为"inout"。
-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较
大时,长度设置不够可能会产生包截断,若出现包截断,输出行中会出现"[|proto]"的标志(proto实际会显
示为协议名)。但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量,从而会导
致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好。
# 输出选项-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。
-q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
-v:当分析和打印的时候,产生详细的输出。
-vv:产生比-v更详细的输出。
-vvv:产生比-vv更详细的输出
# 其它功能选项-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于"-i"后。
-F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。
-w:将抓包数据输出到文件中而不是标准输出。可以同时配合"-G time"选项使得输出文件每time秒就自动
切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印。
-r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。
tcpdump常用选项
# 列出接口
[root@localhost ~]# tcpdump -D# 基于接口抓包
[root@localhost ~]# tcpdump -i int -c num -nn -XX -vvv
tcpdump表达式
表达式用于筛选输出哪些类型的数据包,如果没有给定表达式,所有的数据包都将输出,否则只输出表达式为true的包。在表达式中出现的shell元字符建议使用单引号包围。
tcpdump应用示例
### 1.启动[root@localhost ~]# tcpdump### 2.抓取指定接口数据包[root@localhost ~]# tcpdump -i ens33
#如果不指定网卡,默认tcpdump只会监视第一个网络接口,如ens33。### 3.抓取离开或进入主机的数据包#两台主机
#设置主机名及主机名解析
#tcpdump -i ens33 host 第二台主机的主机名
#tcpdump -i ens33 -nn host 第二台主机的主机名
#打开另外一个终端去ping 第二台主机
[root@localhost ~]# tcpdump -i ens33 host 主机名 [此命令不可行]### 4.抓取当前主机与指定主机之间的通信数据包[root@localhost ~]# tcpdump -i ens33 -nn host 当前主机名 and \(主机A or 主机B\)
[root@localhost ~]# tcpdump -i ens33 -nn host node1 and \(node2 or node3\)### 5.抓取当前主机(A)与其它主机通信IP数据包,但不包含B主机[root@localhost ~]# tcpdump -i ens33 ip host 当前主机名 and not 主机B
[root@localhost ~]# tcpdump -i ens33 -nn ip host node1 and not node2### 6.抓取当前主机发送的所有数据包[root@localhost ~]# tcpdump -i ens33 -nn src host 当前主机名
[root@localhost ~]# tcpdump -i ens33 -nn src host node1
### 7. 抓取当前主机接收的所有数据包[root@localhost ~]# tcpdump -i ens33 -nn dst host 当前主机名### 8.抓取当前主机与指定主机之间指定协议、指定端口的数据包[root@localhost ~]# tcpdump -i ens33 -nn tcp port 22 and host 主机名
[root@localhost ~]# tcpdump -i ens33 -nn tcp port 22 and host node2### 9.抓取本地主机指定协议、指定端口的数据包[root@localhost ~]# tcpdump -i ens33 -nn udp port 123### 10. 抓取指定当前主机与某一网段(例如:192.168)通信的数据
包,仅抓取10个[root@localhost ~]# tcpdump -i ens33 -nn -c 10 net 192.168### 11. 抓取ping包[root@localhost ~]# tcpdump -i ens33 -c 10 -nn icmp
#icmp是网络层协议
#不能直接抓取应用层协议
### 12. 抓取来自于某一主机的ping包[root@localhost ~]# tcpdump -i ens33 -c 10 -nn icmp and src 某一主机名或IP### 13.抓取到本机某一端口的数据包[root@localhost ~]# tcpdump -i ens33 -nn -c 10 tcp dst port 22### 14. 解析被抓取数据包[root@localhost ~]# tcpdump -i ens33 -c 2 -q -XX -vvv -nn tcp dst port 22### 15.抓取数据包保存至指定名称文件[root@localhost ~]# tcpdump -i ens33 -nn -w file.cap
[root@localhost ~]# tcpdump -i ens33 -w file.cap host 192.168.1.1 and tcp port
80
#-w 参数指定将监听到的数据包写入文件中保存,file.cap就是该文件### 16.解析指定名称文件中数据包[root@localhost ~]# tcpdump -r file.cap
#-r 从后面接的文件将数据包数据读出来
#或可以直接在wireshark中打开
WireShark抓包并对数据包进行分析
WireShark安装
[root@localhost ~]# yum -y install wireshark*