1 引言
本文从实战的角度介绍了 Wireshark 的使用技巧,其主要目的有三:
1 )分析网络协议,掌握网络知识与技能;
2 )定位网络故障,解决网络问题;
3 )为行业从业人员进一步提升专业技能创造基础条件。
2 概述
Wireshark 是一款开源免费的网络协议分析工具,基于 GPL 发布,在业界有非
常广泛的应用,有各种操作系统平台( Windows , Linux , MacOS ,各种 Unix
等)的二进制包和源码下载。可以直接下载各个操作系统对应的预编译包,也可
以下载源码自己编译。
下载地址: https://www.wireshark.org/#download
撰写本文时,最新的版本是 3.2.0 ,本文主要以此版本为背景展开讨论。
图 07-01 WireShark 版本及配置运行环境
3 认识主界面
由上到下依次是标题栏、菜单栏、工具栏、显示过滤文本框、打开区、最近捕
获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户
指南等。重点看一下显示过滤、捕获过滤和本机网卡三部分内容。
1 )显示过滤,在这里输入过滤表达式,对已经抓到的包进行过滤,如果不输
入表达式,所有抓取的包都会显示在这里;
2 )捕获过滤,这里输入过滤表达式,可以只抓取特定的包,如果没有表达式,
所有监听到的包都抓到下来;
3 )当前电脑上的网卡及其流量状态。
我们可以通过选中要捕获数据的网卡,填写过滤规则,按快捷键“ Ctrl + E” ,
开始捕获。如果不需要填写捕获过滤规则,直接双击要捕获数据的网卡就可以了。
图 07-02 认识 Wireshark3.2.0 主界面
4 抓包方式
在生产中最常见的分析是 C/S 和 B/S 架构的数据交互,所以在服务器或个人电
脑上抓包是最常见的场景。
因为交换机分隔冲突域,路由器分隔广播域,监听者想要监听到服务器和客户
端的正常通信,就必须与正常通信的双方在同一个冲突域。所以,作为监听设备,
如果与通信的服务器或客户不在同一个冲突域,就无法接收到相关数据。
可以通过以下方式来实现:
1 )增加一台集线器( Hub ),实现三方共享冲突域,但由于 Hub 的性能普通
存在问题,这种过去常用的方法现在基本不用; 2 )增加一台 TAP ( Test Access Point ,分路器),也可达到同样的目的,转发
发性能相对较好,而且价格也不太高;
3 )端口镜像,灵活,功能强大,可以 1:1 、 1:N 、 N:1 监控,甚至可以做虚接
口流量的监听,比如说绑定组接口。不需要额外增加设备及费用,只需要在交换
机上简单配置即可。这种方式在生产中使用较多。
5 抓包实验
以华为普通交换机为例进行说明。
1 )观察端口:监听者连接的端口,用于接收被监听的流量;
2 )镜像端口:被监听的端口,把本端口的流量镜像到观察端口。
5.1 实验拓扑
实验使用华为公司实验模拟器 eNSP 搭建,本文所使用的版本是
V100R002C000B510 。 PC1 和 PC2 分别模拟出现通信故障的服务器和客户端,
PC3 模拟装有 Wireshark 的监听者。如图 07-03 所示。
图 07-03 抓包实验拓扑
5.2 配置观察端口
执行全局配置命令
[Switch] observe-port 1 interface gig 0/0/3
查看全局配置会显示如下内容:
#
observe-port 1 interface GigabitEthernet0/0/3
#
5.3 配置镜像端口
执行全局配置命令
[Switch] interface gig 0/0/1
[Switch-GigabitEthernet0/0/1] port-mirroring to observe-port 1 both
接口 gig0/0/1 的配置如下:
#
interface GigabitEthernet0/0/1
port-mirroring to observe-port 1 inbound
port-mirroring to observe-port 1 outbound
#
经过以上配置,就可以把端口 gig 0/0/1 的进出流量镜像到 gig 0/0/3 了。
5.4 捕获接口上的数据
5.4.1
生产中的捕获
经过如上一番设置,在接口 gig 0/0/3 所连接的捕获电脑上,就可以接收到服务
器与客户端通信的流量了。这时只需要在监听电脑上打开已经安装好的
Wireshark ,选中要监听的网络接口,填上过滤规则,再次双击这个接口或按快捷
键 “ Ctrl + E” ,就开始捕获了。如果停止捕获,可按按快捷键 “ Ctrl + E” 。如下 图 07-04 所示。
图 07-04 填入过滤规则,开始捕获数据
但是生产中的环境往往要比这复杂得多,我们有时需要监听的是服务器上的流
量,有时需要监听的是客户端的流量。不管是需要监听哪个设备的流量,只要把
这台设备连接的交换机的端口设置为镜像端口就可以了。
5.4.2
实验学习
如果是为了学习而搭建的实验环境,想要捕获某条线路上的数据,只需要在这
条线路的圆点上单击鼠标左键,在弹出的快捷菜单中选择 “ Start Data Capture”
命令就会打开 Wireshark ,并在这个线路上开始捕获数据。如下图 07-05 所示。
图 07-05 在华为 eNsp 模拟器上开启抓包
6 捕获过滤
不是所有的数据都要捕获,尤其是面临一些大流量的接口应用,比如绑定口,
一般的监听电脑承受不了这么大的流量接收与处理。
6.1 打开监捕获滤选项对话框
依次点击 “ Capture -> Capture Filters...” ,打开捕获过滤对话框。如图 07-06
所示
图 07-06 打开捕获过滤的对话框
6.2 捕获过滤示例
通过实验,发现并不能够将这里的规则直接应用,但是可以将这里的规则表达 式复制后填入到主界面捕获过滤对话框中。如下图 07-07 所示。
图 07-07 捕获过滤对话框,其实只是一个示例
6.3 捕获过滤表达式
可以单独使用一个过滤表达式,也可以综合使用多个表达式,中间用逻辑运算
符进行相连,比如:或的关系用“ ||” ,且的关系用“ &&” 。
6.3.1
数据链路层捕获过滤表达式
最常用的数据链路层过滤表达式示例如下:
ether dst 只抓取特定目的 MAC 地址
ether dst 只抓取特定源 MAC 地址
ether broadcast 只抓取广播流量
not ether broadcast 不抓取广播流量
vlan 2 只抓取特定 VLAN 的流量
6.3.2
网络层捕获过滤表达式
生产中,我们使用网络过滤表达式最多,常见示例如下:
1 )只抓取某主机的通信流量,以下四种皆可:
host 10.0.0.1
ip host 10.0.0.1
host www.ietf.org
ip host www.ietf.org
2 )只抓取源地址是某地址的流量 ,以下两种皆可:
src host 10.0.0.1
src host www.ietf.org
3 )只抓取目的地址是某地址的流量,以下两种皆可:
dst host 10.0.0.1
dst host ietf.org
6.3.3
传输层捕获过滤表达式
port 80/http 只抓取端口号为 80 ( HTTP )的流量
dst port 80 只抓取目的端口号为 80 的流量
src port 80 只抓取源端口号为 80 的流量
dst portrange 2000-5000 只抓取目的端口号从 2000-5000 的流量
6.3.4
组合使用捕获过滤表达式
使用以下三种逻辑运算符,可以组合成更高级的过滤表达式。
表 07-01 捕获过滤表达式逻辑运算符
示例:
vlan 2 and/&& not/! vlan 3 只抓取 vlan 2 上非 vlan 3 的流量
ip host www.ietf.org && ip host www.ieee.org 只抓取与 www.ietf.org 主机和
www.ieee.org 主机通信的流量
7 显示过滤
显示过滤是在抓到的数据包的基础上进行按需筛选查看。显示过滤与抓包过滤
的表达式和作用都是不一样的。
显示过滤的表达式填写在主显示界面的 “ Apply a display filter...” 显示过滤文
本框。如下图 07-08 所示:
图 07-08 使用显示过滤,只显示与特定主机通信的包
7.1 只显示特定协议
只显示某通信协议的数据内容,在显示过滤文本框中填入协议的名字即可,比
如:“ospf”,“ip”,“tcp”,“udp”,“arp”等。
如图 07-09 所示,通过使用 “arp” 关键字过滤,只显示 ARP 报文。
图 07-09 通过使用显示过滤关键字,只显示 ARP 报文
7.2 只显示协议及包含的内容
通过使用 “http contains username” 关键字,只显示 HTTP 协议及内容中包
含 “username” 的报文。如下图 07-10 所示。
图 07-10 只显示 HTTP 协议数据特定内容
7.3 显示过滤运算符
使用显示过滤表达式前,首先需要了解一下显示过滤运算符。
通过使用显示过滤运算符,可以形成显示过滤表达式,可以实现更多过滤显示
效果。
表 07-02 显示过滤运算符
7.4 显示过滤表达式
比如,只显示特定主机的通信数据,在显示过滤文本框中,填入 “ip.addr ==
192.168.6.30” ,只显示抓取的数据包中,与 192.168.6.30 通信的数据包。如图
07-11 所示。
图 07-11 只显示与特定主机通信的包
7.5 常用显示过滤表达式
1) 数据链路层显示过滤表达式
eth.addr == eth.dst ==
eth.src ==
示例 1:只显示 MAC 地址后 3 位是 c2:a4:a2 包
eth.addr[3:] == c2:a4:a2
示例 2:只显示 MAC 地址前 3 位是 00:00:83 包
eht.src[0:3] == 00:00:83
2) 网络层显示过滤表达式
ip.addr ==
ip.dst ==
ip.src ==
3) 传输层显示过滤表达式
tcp.port == 80
tcp.dstport == 80
tcp.srcport == 80
示例 1:只显示某一个 TCP 流:
tcp.stream eq 5
tcp.stream == 5
示例 2:只显示特定标识:
tcp.flags.syn
如果不是太记得关键字,可以点击主界面的显示过滤文本框后面的
“Expression...” ,以获取更多的过滤选项。如图 07-12 所示。
图 07-12 更多的显示过滤选项
如果单独使用一个表达式不能满足要求,还可以组合使用多个表达式。
表 07-03 显示过滤表达式逻辑运算符
7.6 表达式子序列
Wireshark 允许选择一个序列的子序列。在标签后你可以加上一对[]号,在里
面包含用逗号分离的列表范围。
1) eth.src[0:3] == 00:00:83
上例使用 n:m 格式指定一个范围。在这种情况下,n 是起始位置偏移(0 表示没
有偏移,即是第一位,同理 1 表示向右偏移一位,便是第二位),m 是从指定起始
位置的区域长度。
上例表示源 MAC 地址的前三段是 00:00:83 的数据包。
2) eth.src[1-2] == 00:83
上例使用 n-m 格式一个范围。在本例中 n 表示起始位置偏移,m 表示终止位置偏
移。
上例表示源地址从第二到第三段是 00:83 的数据包。
3) eth.src[:4]=00:00:83:00
上例使用:m 格式,表示从起始位置到偏移偏移位置 m,等价于 0:m。
上例表示源 MAC 地址最后四段是 00:00:83:00 的数据包
4) eth.src[4:] == 20:20
上例使用 n:格式,表示从最后位置偏移 n 个序列。
上例表示最后四位是 20:20 的数据包。
5) eth.src[2] == 83
上例使用 n 形式指定一个单独的位置。在此例中中序列中的单元已经在偏移
量 n 中指定。它等价于 n:1。
上例表示源 MAC 地址最后两位是 83 的数据。
6) eth.src[0:3,102,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83 Wireshark 允许用户将多个逗号隔开的列表组合在一起表示复合区域,如上例
所示。不过生产中我们很少有用。
8 自动化
8.1 文件自动保存
文件保存为 “D:\books\auto.save.pcap” ,每个文件的大小为 10MegaByte 。
如下图 07-13 所示。
图 07-13 设置文件自动保存
8.2 自动停止捕获
设置自动捕获停止条件为:当满足以下三个条件之一,停止捕获。
1)抓了 10000 个包;
2)保存了 10 个文件;
3)数据大小达到 10megabytes。
如下图 07-14 所示。
图 07-14 自动停止捕获
9 统计分析
做统计分析之前,先清除过滤表达式。
1)基于协议分级结构显示统计信息, “Statistics->Protocol Hierarchy” 。
如下图 07-15 所示。
图 07-15 基于协议分级结构显示统计信息
2)基于协议显示两点之间的通信流量,数据链路层流量,IPv4 流量,IPv6 流
量,TCP 流量,UDP 流量等。如下图 07-16 所示。
图 07-16 基于协议显示两点之间的最大流量 10
各种导出
根据需要,可以将特定的包另存为一个新的文件。比如,将已经显示过滤的内
容再保存为另外一个文件。依次点击打开菜单, “File->Export Specified
Packets...” ,打开导出特定包对话框。如图 07-17 所示。
图 07-17 将经过显示过滤的包导出为另外一个文件。
还可以将显示过滤过的包保存为其它格式。比如,“.txt”,但是新文件的内
容就没有那么丰富了。如图下 07-18 所示。
图 07-18 将已经显示过滤的包导出为另外一个“.txt”文件
11
应用示例
11.1
ARP 攻击
怀疑某个网络或某个接口受到了 ARP 攻击,不管是 arp miss 还是 arp
spoofing,都可以使用下面的办法定位到具体的攻击源。
对的故障的接口做端口镜像,镜像到观察接口,观察接口接监听的电脑。
一切就绪,设置过滤规则:
只监听 ARP 包,抓 10000 个就好了。
首先打开捕获选项对话框,依次打开菜单 “Capture->Options...” ,打开如
图 07-19 捕获选项对话框。
工业生产中多数情况下使用的是有线网络,我们的示例用 Wi-Fi。只捕获 ARP 包。
图 07-19 设置捕获的接口和捕获过滤规则
设置文件自动保存,每个文件大小不超过 10Megabytes。如图 07-20 所示。
图 07-20 设置文件自动保存,每个文件大小不超过 10Megabytes
设置捕获自动结束条件,抓够 10000 个包停止捕获。如图 07-21 所示。
图 07-21 设置捕获自动结束条件。
点击 “Start” 开始捕获,并回到主界面。
在主界面中,依次点击 “Statistics->Conversations” ,显示会话通信量统
计,很容易看出网络中的主机对带宽的占用情况。如图 07-22 所示。
图 07-22 显示会话通信量统计
通过过使用显示过滤表达式 “ eth.addr[3:] == 64:a3:5d ” 滤,只显示特定主 机会话的通信包。如图 07-23 所示。
图 07-23 通过使用显示过滤表达式,显示特定 MAC 地址的数据包
如果这里有 ARP 攻击,就很容易看出来了:短时间内对多台主机发送发送了很
多 ARP Reply,每秒几十上百。很显然,我们的这个案例中并没有。其实我也很
想弄一个有攻击的、真实的环境来写文档的,可是环境模拟风险太高了,超出了
我的承受能力!
题外话:这里只介绍了一种检查 ARP 攻击的方法,并不是唯一的方法,甚至都
不是最好的方法,目的只是为了通过这样一个案例来学习使用 WireShark 工具分
析网络问题。
11.2
RTP 流分析
1)打开抓取的视频流文件。 RTP 使用 UDP 传输,在新的版本上可以直接显示为 RTP,如果是别人用老版本的软件抓取的包,显示就是 UDP。如果是 UDP 的包,需要先将 UDP 解码为 RTP。老
版本抓取的 UDP 数据视频流如图 07-24 所示。
图 07-24 打开抓取的视频流包
2)解码成 RTP。
选中视频流中的一个包,依次点击菜单 “Analyze->Decode As...” ,打开
“Decode As” 对话框。
点击右下角的 “+” 号图标,添加一路要解码的流,把 UDP 53962 解码成 RTP。
即把 Curren 项选择为 “RTP” 。
点击 “OK” 回到主界面。如下图 07-25 所示。
图 07-25 解码成 RTP 对话框
3)选择流进行分析。
依次点击 “Telephony->RTP->RTP Streams” ,打开 RTP 流分析对话框。
“Payload” 项为显示 RTP 的类型。如下图 07-26 所示。
图 07-26 显示所有的 RTP 流
4)分析。
选中这一路流,点击上图中的 “Analyze” 按钮,开始分析,并显示分析结果。
分析结果显示如图 07-27 所示。
这一路流这一次抓取丢了 113 个包,丢包率是 0.70%,包乱序错误有 1 个,视
频时长为 27.93 秒。
图 07-27 RTP 流分析报告
在上图中,点击 “save” 按钮,还可以将 RTP 流的载荷保存成 “.raw” 或
“.au” 格式的视频文件,然后通过播放器打开。如下图 07-28 和图 07-29 所示。
图 07-28 保存视频流到文件
图 07-29 选择要保存的文件类型为“.raw”
11.3
RTP 相关补充知识
RTP ( Real-time Transport Protocol 实时传送协议 ,也可以写成 RTTP)是一
个网络传输协议,它是由 IETF 的多媒体传输工作小组 1996 年在 RFC 1889 中公布
的, https://datatracker.ietf.org/doc/rfc1889/ 。是一个端到端传输协议,但不提供任
何服务质量的保证,服务质量由 RTCP 来提供。
相关的协议有:
SIP ( Session Initiation Protocol 会话初始协议 ),用于多方多媒体通信,
是一个基于文本的应用层控制协议,独立于底层传输协议 TCP/UDP/SCTP,用于建
立、修改和终止 IP 网上的双方或多方多媒体会话。在 RFC 2543 中定义,
https://datatracker.ietf.org/doc/rfc2543/ 。
RTCP ( RTP Control Protocol 实时传输协议控制协议 ) ,是与 RTP 伴生的一个
协议,它的基本功能和包结构在 RFC 3550 中定义。其主要功能是:服务质量的监
视与反馈、媒体间的同步,以及多播组中成员的标识。RTCP 分组周期性地在网上
传送,它带有发送端和接收端对服务质量的统计信息报告。在 RFC3550 中定义,
https://datatracker.ietf.org/doc/rfc3550/ 。
RTSP ( Real Time Streaming Protocol 实时流传输协议 ),是 TCP/IP 协议体
系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传
送多媒体数据。能够时支持多个实时流,进而支持视频会议。在 RFC 2326 中定义,
https://datatracker.ietf.org/doc/rfc2326/ 。
RSVP ( Resource Reservation Protocol 资源预留协议 ),是一个通过网络进
行资源预留的协议,是为实现综合业务网而设计的,在 RFC 2205 中定义,
https://datatracker.ietf.org/doc/rfc2205/ 。