
Wireshark是可在Linux,Windows和macOS上使用的世界一流的数据包分析器。它的过滤器灵活,复杂,但有时违反直觉。我们将说明您需要注意的“陷阱”。
真正的抓包分析
Wireshark是开源世界的瑰宝之一。这是世界一流的软件工具,专业人士和业余爱好者都可以使用它来调查和诊断网络问题。软件开发人员使用它来查明和确定通信例程中的错误。安全研究人员使用它来捕获和清除网络上的恶意活动。
典型的工作流程是在Capture模式下运行Wireshark,因此它通过计算机上的网络接口之一记录网络流量。网络数据包在捕获时会实时显示。但是,正是在捕获后分析中揭示了网络中正在发生的事情的详细细节。
捕获的数据包称为跟踪。捕获完成后,可以逐包逐步跟踪。您可以检查最详细的任何数据包,绘制设备之间的网络“对话”,并使用过滤器从分析中包括(或排除)数据包。
Wireshark的过滤功能无与伦比,具有极大的灵活性和解决能力。它们的语法有一些细微之处,可以轻松编写过滤器并获得不符合您期望的结果。
如果您不了解过滤器在Wireshark中是如何工作的,那么您将永远不会动摇并限制软件的功能。
安装Wireshark
安装Wireshark时,系统会询问您使用非root帐户的任何人是否应能够捕获网络跟踪。对这个不回答可能是一个有吸引力的想法。您可能不希望每个人都能看到网络上正在发生的事情。但是,安装Wireshark使其仅具有root特权的用户可以使用它,意味着其所有组件都将以提升的权限运行。
Wireshark包含200万行以上的复杂代码,它以最低级别与计算机交互。最佳安全性实践建议,应以提升的特权运行尽可能少的代码,尤其是当其以如此低的级别运行时。
使用常规用户帐户运行Wireshark更加安全。我们仍然可以限制谁有能力运行Wireshark。这需要一些额外的设置步骤,但这是最安全的方法。Wireshark的数据捕获元素仍将以提升的特权运行,但其余的Wireshark
运行将作为正常过程进行。
要在Ubuntu上开始安装,请输入:
sudo apt-get install wireshark

在Fedora上,输入:
sudo dnf install wireshark

在Manjaro上,使用以下命令:
sudo pacman -Syu wireshark-qt

在安装过程中,您将看到以下屏幕,建议您不要Wireshark
以root用户身份运行。按Tab键将红色突出显示移动到“ <OK>”,然后按空格键。

在下一个屏幕上,按Tab键将红色突出显示移动到“ <YES>”,然后按空格键。

要运行Wireshark
,您必须是安装期间创建的“ wireshark”组的成员。这使您可以控制谁可以运行Wireshark
。不在“ wireshark”组中的任何人都不能跑步Wireshark
。
要将自己添加到“ Wireshark”组,请使用以下命令:
sudo usermod -a -G wireshark $USER
为了使新的组成员身份生效,您可以注销然后重新登录,或使用以下命令:
newgrp wireshark
要查看您是否在新组中,请使用以下groups
命令:
groups

您应该在组列表中看到“ wireshark”。
启动Wireshark
您可以使用以下命令启动Wireshark。“&”号(&
)Wireshark
作为后台任务启动,这意味着您可以使用终端窗口进行操作。您甚至可以关闭终端窗口,Wireshark将继续运行。
输入以下内容:
Wireshark &

出现Wireshark界面。列出了计算机中存在的网络接口设备以及一些内置的伪设备。

接口旁边的波浪线表示该接口处于活动状态,并且网络流量正在通过该接口。一条平线表示该接口上没有任何活动。此列表中的第一项是“ enp0s3”,这是该计算机的有线连接,并且按预期显示活动。
要开始捕获数据包,请右键单击“ enp0s3”,然后在上下文菜单中选择“开始捕获”。

您可以设置过滤器以减少Wireshark捕获的流量。我们更喜欢捕获所有内容并过滤掉进行分析时不希望看到的任何内容。这样,我们知道发生的一切都在跟踪中。您不希望因捕获过滤器而无意中错过解释您要调查的情况的网络事件。
当然,对于高流量的网络,跟踪可能很快变得非常大,因此在这种情况下,在捕获时进行过滤是有意义的。或者,也许您只是喜欢这种方式。
请注意,捕获过滤器的语法与显示器的语法略有不同。

上图中高亮显示的图标从左到右分别表示以下内容:
- 鱼翅:如果为蓝色,则单击它将开始捕获数据包。如果Wireshark正在捕获数据包,则该图标将为灰色。
- 正方形:如果为红色,则单击它将停止正在运行的数据包捕获。如果Wireshark没有捕获数据包,此图标将为灰色。
- 带有圆形箭头的鱼翅:如果为绿色,则单击将停止当前运行的跟踪。这使您有机会保存或丢弃捕获的数据包,然后重新启动跟踪。如果Wireshark没有捕获数据包,此图标将为灰色。
分析痕迹
单击红色正方形图标将停止数据捕获,因此您可以分析在跟踪中捕获的数据包。数据包按时间顺序显示,并根据数据包协议进行颜色编码。高亮显示的数据包的详细信息显示在Wireshark界面的下面两个窗格中。

使读取跟踪更容易的一种简单方法是让Wireshark为数据包的源IP地址和目标IP地址提供有意义的名称。为此,请单击查看>名称解析,然后选择“解析网络地址”。
Wireshark将尝试解析发送和接收每个数据包的设备的名称。它不能识别所有设备,但是可以帮助您读取跟踪信息。

将显示滚动到左侧将在右侧显示更多列。信息列显示Wireshark可以从数据包中检测到的任何信息。在下面的示例中,我们看到了一些ping
请求和响应。

默认情况下,Wireshark按照跟踪的顺序显示所有数据包。许多设备同时发送和发送数据包。这意味着两个设备之间的单个会话很可能会在其他设备之间交织来自其他设备的数据包。
要检查单个对话,可以按协议隔离它。每个数据包的协议显示在协议列中。您将看到的大多数协议都属于TCP / IP系列。您可以指定确切的协议,也可以使用以太网作为包罗万象的东西。
右键单击要检查的序列中的任何数据包,然后单击“会话过滤器”>“以太网”。在下面的示例中,我们选择了一个ping
请求数据包。

由于Wireshark自动生成了一个过滤器来执行此操作,因此显示了数据包的顺序,而没有其他包。它显示在过滤器栏中,并以绿色突出显示,表明过滤器的语法正确。
要清除过滤器,请单击过滤器栏上的“ X”。
创建自己的过滤器
让我们在过滤器栏中放置一个简单的过滤器:
ip.addr == 192.168.4.20
这将选择从IP地址为192.168.4.20的设备发送或接收的所有数据包。请注意,双等号(==
)之间没有空格。

要查看设备(源)发送的数据包,可以使用 ip.src
;要查看已到达设备(目标)的数据包,可以使用 ip.dst
,如下所示:
ip.dst == 192.168.4.20 && ip.src == 192.168.4.28

请注意,使用双“&&&
”号表示逻辑上的“和”。该过滤器查找从192.168.4.28到达192.168.4.20的数据包。
刚接触Wireshark过滤器的人们通常认为,这样的过滤器将捕获两个IP地址之间的所有数据包,但事实并非如此。
它实际上所做的是过滤来自IP地址192.168.4.20或来自IP地址192.168.4.20的所有数据包,无论它们来自何处或从何处发送。它对来自IP地址192.168.4.28的所有数据包都执行相同的操作。简而言之,它过滤了进出该IP地址的所有流量。
您也可以寻找其他协议的活动。例如,您可以键入以下过滤器以查找HTTP请求:
http.request

要排除来自设备或发送到设备的数据包,请使用感叹号(!
)并将过滤器括在括号[ ()
]中:
!(ip.addr == 192.168.4.14)
该过滤器不包括发送到192.168.4.14或从192.168.4.14发送的所有数据包。

这是违反直觉的,因为过滤器包含等于运算符(==
)。您可能曾希望像这样键入此过滤器:
ip.addr !=192.168.4.14
但是,这不起作用。
您也可以按照协议在数据包中搜索字符串。此过滤器搜索包含字符串“ youtube”的传输控制协议(TCP)数据包:
tcp contains youtube

查找重传的筛选器作为检查是否存在连接问题的一种有用方法。重传是由于在初始传输过程中损坏或丢失而重新发送的数据包。重传次数过多表示连接速度慢或设备响应速度慢。
输入以下内容:
tcp.analysis.retransmission

出生,生命,死亡和加密
每当一个设备与另一个设备联系并发送SYN
(同步)数据包时,就会启动两个设备之间的网络连接。然后,接收设备发送一个ACK
(确认)数据包。它指示是否将通过发送SYN
数据包来接受连接。
SYN
而ACK
实际上是在同一个包两个标志。原始设备SYN
通过发送来确认ACK
,然后设备建立网络连接。
这称为三向握手:
A -> SYN -> B A <- SYN, ACK <- B A -> ACK -> B
在下面的屏幕快照中,计算机“ nostromo.local”上的某人与计算机“ ubuntu20-04.local”建立了安全外壳(SSH)连接。三向握手是两台计算机之间通信的第一部分。请注意,包含SYN
数据包的两行 以深灰色进行颜色编码。

滚动显示屏显示的列在右边显示的SYN
,SYN/ACK
和ACK
握手。

您会注意到,两台计算机之间的数据包交换在TCP和SSH协议之间交替进行。数据包通过加密的SSH连接传递,但消息包(如ACK
)通过TCP发送。我们将很快过滤掉TCP数据包。
当不再需要网络连接时,它将被丢弃。断开网络连接的数据包序列是四次握手。
一侧发送FIN
(完成)数据包。另一端发送,ACK
以确认FIN
,然后还发送,FIN
以表明同意断开连接。第一侧ACK
为FIN
刚接收到的发送一个,然后拆除网络连接。
这是四向握手的样子:
A -> FIN -> B A <- FIN, ACK <- B A -> ACK -> B
有时,无论如何将要发送FIN
的ACK
数据包的原始背负,如下所示:
A -> FIN, ACK -> B A <- FIN, ACK <- B A -> ACK -> B
这就是本例中发生的情况。

如果我们只想查看此会话的SSH流量,则可以使用指定该协议的过滤器。我们键入以下内容,以查看使用SSH协议往返于远程计算机的所有流量:
ip.addr == 192.168.4.25 && ssh
这将过滤除往返于192.168.4.25的SSH流量以外的所有内容。

其他有用的过滤器模板
在过滤器栏中键入过滤器时,它将在过滤器的语法正确之前保持红色。过滤器正确且完整时,它将变为绿色。
如果键入的协议,如tcp
,ip
,udp
,或shh
,后跟一个句点(.
),菜单出现。它将列出包含该协议的最新过滤器,以及可以在该协议名称的过滤器中使用的所有字段。
例如,ip
你可以使用 ip.addr
,ip.checksum
,ip.src
,ip.dst
,ip.id
,ip.host
,和几十人。
使用以下过滤器模板作为过滤器的基础:
- 只显示HTTP协议数据包:
http
- 仅显示DNS协议数据包:
dns
- 只显示以4000为源或目标端口的TCP数据包:
tcp.port==4000
- 要显示所有TCP重置数据包:
http.request
- 要过滤掉ARP,ICMP和DNS数据包,请执行以下操作:
!(arp or icmp or dns)
- 要显示跟踪中的所有重传:
tcp.analysis.retransmission
- 要过滤标志(如
SYN
或FIN
):您必须为这些1
标志设置一个比较值:表示已设置标志,0
而未设置。因此,一个示例为:tcp.flags.syn == 1
。
我们在这里介绍了显示过滤器的一些指导原则和基本用法,但是,当然还有很多。
要了解Wireshark
滤波器的全部功能和强大功能,请务必查看其在线参考。继续阅读