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 <host MAC>
只抓取特定目的
MAC
地址
ether dst <host MAC>
只抓取特定源
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 == <MAC Address>
eth.dst == <MAC Address>
eth.src == <MAC Address>
示例 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 Address>
ip.dst == <IP Address>
ip.src == <IP Address>
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/
。