Wireshark网络分析从入门到实践

思维导图

1.1 Wireshark是什么

  1. 网卡的默认模式是只接收发往本机的数据包,忽略其他。
  2. 在混杂模式下,网卡会接收并传递所有经过的数据包,无论它们的目的地如何。
  3. 这种模式对于使用Wireshark这样的网络分析工具来捕获和分析网络数据是非常重要的。

1.3 一次完整的Wireshark使用过程

  1. 启动Wireshark时,用户需要决定使用哪个网卡来捕获数据包,这是一个重要的初步决策。
  2. 许多计算机,尤其是笔记本电脑,通常装有多个网卡,包括无线和有线网卡。
  3. 如果安装了虚拟机软件,还会增加一些虚拟网卡,这些都是可供选择的捕获选项。

如果希望查看网卡的IP地址信息,就可以在工具栏上选择“捕获选项”,这样就可以打开如图1-3所示的Wireshark捕获窗口。

图1-3 Wireshark的工具栏 在这个窗口中每个网卡左侧都有一个三角形按钮,单击这个按钮就可以显示详细信息,这些信息中最有用的就是IP地址

  1. 在Wireshark的菜单栏上,依次单击“统计”→“对话”,然后在打开的“对话”窗口中选中“IPv4”选项卡。如图1-9所示,这个选项卡以一个表格的形式显示
  2. 这些“标题”不仅有提示作用,还可以实现排序的功能,例如我们想要知道哪个会话中产生最多的流量,就可以在“Bytes”标题上单击,这样这些会话就会按照流量从大到小的顺序重新排列。图1-10中就是按照流量进行排序后的对话列表。

图1-10 Wireshark中的对话列表

  1. 从图1-10中可以看出来,104.25.219.21与192.168.1.102之间对话产生的流量最多为21k。再看这一行的“Bytes A→B”列的值为13k,这说明大部分网络流量是从104.25.219.21发往192.168.1.102的
  2. Wireshark中提供了一种“名字解析”的功能,如果启用了这个功能的话,那么你以后看到的就不再是那些难以理解的IP地址,而是很容易理解的域名了。
  3. 可以在数据包捕获过程结束之后,再启用“名字解析”的功能。
  4. 在菜单栏上单击“视图”→“解析名称”→“解析网络地址”,然后Wireshark就会尝试将捕获到数据包中的IP地址转换为域名,你可以观察一下现在Wireshark的数据包列表面板,如图1-11所示。

图1-11 启用了“解析网络地址”之后的数据包细节面板

现在我们返回到“对话”窗口中,这时里面的IP地址没有任何的变化。Wireshark为了方便我们自行选择查看IP地址还是域名,在这个窗口的左下方有一个“解析名称”的复选框,只有当选中了这个复选框之后,里面的IP地址才会被解析为域名,如图1-12所示。

图1-12 启用了“解析网络地址”之后的会话列表

2.1 伯克利包过滤

伯克利包过滤中的限定符有下面3种

限定符

描述

默认值

示例

type

表示指代的对象,如IP地址、子网或端口等。

默认为host

host 192.168.1.1 表示主机名或IP地址,net 表示子网,port 表示端口

dir

表示数据包的传输方向,如源地址或目的地址。

默认为src or dst

src 表示源地址,dst 表示目的地址。例如,192.168.1.1 表示源或目的地址为192.168.1.1的数据包

proto

表示与数据包匹配的协议类型。

无默认值

常见的协议包括ether(以太网)、ip(互联网协议)、tcp(传输控制协议)、arp(地址解析协议)

图2-2 IP数据包头的格式

2.2 捕获过滤器

选择菜单栏上的“捕获”→“选项”按钮。

图2-3

(2)如图2-4所示,在“所选择接口的捕获过滤器”后面的文本框中填写字符串形式的过滤器。

图2-4 Wireshark中设置捕获过滤器 这个编写的过滤器如果不正确的话,文本框的颜色会变成粉红色,如果正确的话则为绿色。

图2-5给出了一个正确的过滤器。

图2-5 一个设置好的捕获过滤器

2.3 显示过滤器

在数据包列表处选中一个数据包,然后在数据包详细信息栏处查看这个数据包的详细内容,这里会以行的形式展示数据包的信息,当我们选中其中一行时(见图2-11),例如IP地址,那么在状态栏处就会显示出该数据包该行对应的过滤器表达式。

图2-11 在状态栏处显示的过滤器表达式

3.1 捕获接口的输出功能

我们以用时间分割为例,将每隔10秒捕获的数据保存为一个文件,使用的方法为勾选“自动创建新文件,经过…”,然后勾选下方的第2个复选框,在文本框中输入10,单位选择为“秒”(见图3-3)。

图3-3 “Wireshark·捕获接口”中“输出”选项 选择完毕之后,单击“开始”捕获数据包,这时Wireshark就会将每隔10秒捕获到的数据包单独的保存成文件。图3-4给出了保存文件的示例。

3.2 环状缓冲区

Wireshark中提供了类似的功能,但你选择了多文件输出的时候,如果不希望这个文件的个数一直在增加,可以选择使用环形缓冲器,这样Wireshark就不会不断地产生新的文件。具体的设置如图3-5所示。

图3-5 环形缓冲器的使用

3.5 保存显示过滤器

单击菜单栏上的“分析”→“显示过滤器”

图3-11 Wireshark中的显示过滤器

单击这个对话窗口左下方的“+”按钮,在左侧“新建显示过滤器”中输入过滤器的名称(例如baidu),在右侧输入“显示过滤器”的内容,我这里输入的是ip.addr==www.baidu.com(见图3-12),完成之后单击OK按钮。

图3-13 在Wireshark中的添加一个显示过滤器

7.2 观察远程访问HTTP的过程

步骤

描述

详细过程

1

判断服务器是否在同一局域网

操作系统将自己的IP地址和子网掩码用二进制表示并进行与运算,确定所在子网。例如,IP地址192.168.1.10和子网掩码255.255.255.0的与运算得到子网192.168.1.0。

2

寻找网关并转换IP地址为MAC地址

如果目标服务器不在同一局域网内,客户端需要找到网关(如192.168.1.1)。然后通过ARP协议将IP地址转换为MAC地址,以便局域网中的交换机能识别并转发数据包。

3

建立与服务器的TCP连接

使用TCP协议的三次握手建立客户端和服务器之间的连接。

4

应用程序构造HTTP请求

操作系统完成TCP连接后,应用程序负责构造HTTP请求数据包。这个阶段可能会有延迟,因为应用程序处理请求需要时间。

5

服务器响应及传输时间

客户端发送请求后,数据包传送到服务器并得到响应。这个过程包括数据传输时间和服务器应用程序的响应时间。

表7-1 与子网掩码IP地址对应十进制,二进制

7.3 时间显示设置

我们平时使用的时间格式有两种,一种是常用的某年某月某日,称为绝对格式。另一种就是形如秒表上的显示,这个示数表示的是经过了多久,例如2分21秒,称为相对格式。 默认情况下,Wireshark中提供了一个显示捕获数据包时刻的“Time”列(见图7-13)。这个列中显示的是相对值,捕获到第一个数据包的时间定义为零点,之后捕获到数据包的时间值都是距离这个零点的时间间隔,单位为微秒。

图7-13 Wireshark中的Time列

Wireshark为了能够更好地对数据包进行分析,还提供了多种时间的显示方式。如果要修改这些显示方式的话,可以在菜单栏上依次单击“视图”→“时间显示格式”,Wireshark中提供的包括如图7-14所示的选项。

图7-14 Wireshark中的“时间

只使用某一种时间格式的话不太容易看出数据包之间的关联,但是来回切换时间格式又过于烦琐。这时我们就可以选择在原有时间列的基础上再添加新的列,这个列用来显示当前包与前面包的时间间隔,具体的步骤如下。

  1. 首先单击菜单栏上的“编辑”→“首选项”,或者直接单击工具栏上的“首选项”按钮。
  2. 然后在图7-15所示的首选项窗口左侧选择“外观”→“列”。
  3. 这时首选项窗口的右侧就会显示出当前数据包列表中的全部列,点击左下方的“+”号就可以添加新的一列。
  4. 这时在首选项窗口的右侧就会添加新的一行,这一行分成两个标题和类型两个部分,我们单击标题处为新添加的列起一个名字,这里我们为其起名为tcp.time_delta。
  5. 在类型下面的Number下拉列表框处,选中我们需要的列内容。其中和时间有关的选项如图7-16所示。

图7-15 Wireshark中的首选项

图7-16 在Wireshark中添加新的一列

如图7-17所示,我们在类型里选择使用Custom类型,在字段处输入“tcp.time_delta”,最后在字段发生处添加一个“0”。

图7-17 添加列的内容

在数据包列表面板中已经多了一个名为“tcp.time_delta”的列,但是现在该列还不能正常工作。我们还需要完成如下的步骤。

  1. 在Wireshark首选项窗口中依次选择“Protocols”→“TCP”。
  2. 勾选“Calculate conversation timestamps”,默认这个选项是不被选中的(见图7-18)。选中之后Wireshark会为TCP会话中的数据包再加上一个新的时间戳,用来表示该数据包在当前会话的产生时间。

图7-18 勾选“Calculate

(3)单击“OK”按钮。这时再查看数据包列表面板就可以看到新的一列已经起作用了。

在默认情况下,Wireshark会以捕获第一个数据包的时间作为原点。但是我们也可以自行将某一个数据包定义为原点,具体的方法是在一个数据包上单击鼠标右键,在弹出的菜单上选中“设置/取消设置时间参考”,此时这个数据包的时间列就会显示为“REF”。如果我们使用了相对时间格式的话,它之后的所有数据包都会将这个数据包的捕获时间作为原点。

7.4 各位置延迟时间的计算

在整个上网过程中,一共可以分成4个阶段,但是由于其中的ARP阶段位于内网,而且速度非常快,因此通常不会引起网络延迟,这里只考虑后面的3个阶段,分别是网络传输延迟、客户端应用程序引起的延迟和服务器应用程序引起的延迟。需要注意的一点是,这种延迟分类的方法是基于Wireshark捕获数据包得出的。图7-19中显示了上网过程中捕获到的数据包。

图7-19 上网过程中产生的数据包

这5个数据包的含义如图7-20所示,其中①②③④⑤分别对应着图7-19中的第9、10、11、12、13这几个数据包。

图7-20 客户机与服务器的通信过程

当发生网络延迟时,我们首先需要考虑的就是传输线路导致的延迟。如图7-21所示,我们首先来查看捕获到的TCP 3次握手中的第2个数据包,它的tcp.time_delta值为0.062,这个值是由3个时间共同组成的:

图7-21 TCP 3次握手中的第2个数据包

从客户端到服务端的时间; 服务端操作系统接收TCP 3次握手的syn请求,并回应一个(syn,ack)回应; 从服务端到客户端的时间。 考虑操作系统在处理TCP 握手时的时间很短,这个值可以看作是由第一个和第 3 个时间组成的,也就是数据包在线路上传输所花费的时间。如果这个值较大的话,则说明线路传输时出现了延时,这个原因可能是由服务端和客户端之间的设备造成的。

16.1 Wireshark编程开发的基础

菜单栏上的“帮助”→“关于Wireshark”,打开“关于Wireshark”对话框。如图16-1所示,在这个对话框中显示了当前版本所支持的所有工具,如果在这个对话框中显示了“with Lua 5.x”的话,表示已经内嵌了Lua的解释环境。

图16-1 Wireshark中的Lua版本

TShark -v来查看。如图16-2所示,我们可以看到这个Tshark和Wireshark一样都支持Lua5.2.4。

图16-2 TShark -v来查看Lua版本

17.2 Tshark.exe的使用方法

Tshark中,可以使用如下的命令查看每个网卡的编号: tshark -D

使用第4块网卡来捕获数据,为了加快捕获的速度,这里使用-s参数来表示只捕获数据包的前512个字节数据: tshark -s 512 -i 4

和Wireshark一样,Tshark还支持捕获过滤器和显示过滤器的使用,这两种过滤器的语法也和Wireshark中规定的一样,例如下面就使用了目标端口为80的过滤器: tshark -s 512 -i 4 -f 'tcp dst port 80' 捕获到的数据包如图17-3所示。

图17-3 tshark捕获到的数据包

Tshark中还提供了强大的统计功能,这个功能通过参数-z来实现,这个参数后面需要使用Tshark所指定的值,可以使用如下命令: tshark -z -h Tshark所有可以使用的值如图17-4所示。

图17-4 tshark的统计功能

使用“io,phs”作为-z参数的值,这里面我们添加了-q来指定不显示捕获的数据包信息: tshark -i 4 -f“port 80” -q -z io,phs 执行该命令的结果如图17-5所示。

图17-5 tshark的统计结果

如果你希望深入地了解Tshark的功能,可以访问https://www.wireshark.org/docs/man-pages/tshark.html来学习。

17.3 Dumpcap的用法

Dumpcap也是Wireshark中自带的一个命令行工具,这种工具的优势就在于对资源的消耗较小。你可以使用dumpcap.exe -h来查看它的帮助文件。

图17-6 Dumpcap的帮助文件

17.4 Editcap的使用方法

使用Wireshark在捕获数据包时得到的文件可能会很大,Editcap就可以将这种大文件分割成较小的文件。另外,Editcap也可以通过开始时间和停止时间来获取捕获数据包文件的子集,删除捕获数据包文件中重复数据等。 同样我们了解这个工具最好的办法还是查看它的帮助文件,使用Editcap -h可以看到(见图17-7)。

图17-7 Editcap的帮助文件

参数

描述

使用示例

功能

-r

保留原始文件

editcap -r Traces.pcapng packetrange.pcapng 1-2000

保留输入文件Traces.pcapng,并将其中的前2000个数据包保存到packetrange.pcapng

-c

按数量拆分文件

editcap -c 2000 Traces.pcapng SplitTrace.pcapng

将文件Traces.pcapng按每2000个数据包拆分成多个文件,保存为SplitTrace.pcapng

-d

去除重复数据包(比较当前数据包和前5个)

editcap -d Traces.pcapng nodupes.pcapng

检测并去除文件Traces.pcapng中的重复数据包,保存为nodupes.pcapng

-D

去除重复数据包(指定范围)

editcap -D 10000 Traces.pcapng nodupes.pcapng

可以指定范围(0~100000)来检测并去除Traces.pcapng中的重复数据包,保存为nodupes.pcapng

17.5 Mergecap的使用方法

Mergecap的功能比较单一,它主要的功能就是将多个文件合并成一个文件,最基本的语法为: mergecap –w infile1.pcapng infile2.pcapng … 也就是mergecap后面跟多个文件名,其中的第一个是其他文件合并生成的。

17.6 capinfos的使用方法

参数

描述

输出单位

-t

输出包文件的类型

-

-E

输出包文件的封装类型

-

-c

输出包的个数

-

-s

输出包文件的大小

byte

-d

输出所有包的总字节长度

byte

-u

输出包文件中包的时间周期

second

-a

输出包文件中包的起始时间

-

-e

输出包文件中包的结束时间

-

-y

输出包文件中包的平均速率

byte/s

-i

输出包文件中包的平均速率

bit/s

-z

输出包文件中包的平均字节长度

byte

-x

输出包文件中包的平均速率

packet/s

图17-8 使用Capinfos查看数据包的信息