如何在 Linux 上使用 Wireshark 过滤器

Wireshark 是世界一流的数据包分析器,可在 Linux、Windows 和 macOS 上使用。它的过滤器灵活而复杂,但有时违反直觉。我们将解释您需要注意的“陷阱”。
使用 Real Bite 进行数据包分析
Wireshark 是开源世界的瑰宝之一。它是世界一流的软件工具,专业人士和业余爱好者都可以使用它来调查和诊断网络问题。软件开发人员使用它来查明和描述通信例程中的错误。安全研究人员使用它来捕获和取消网络上的恶意活动。
典型的工作流程是以捕获模式运行 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

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

在下一个屏幕上,按 Tab 将红色突出显示移动到“

要运行 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 正在捕获数据包,则此图标将为灰色。
- Square:如果它是红色的,点击它将停止正在运行的数据包捕获。如果 Wireshark 未捕获数据包,则此图标将为灰色。
- 带有圆形箭头的鱼翅:如果这是绿色的,点击它会停止当前运行的轨迹。这使您有机会保存或丢弃捕获的数据包,并重新开始跟踪。如果 Wireshark 未捕获数据包,则此图标将为灰色。
分析跟踪
单击红色方块图标将停止数据捕获,以便您可以分析跟踪中捕获的数据包。数据包按时间顺序显示,并根据数据包的协议进行颜色编码。突出显示的数据包的详细信息显示在 Wireshark 界面的两个下方窗格中。

使读取跟踪更容易的一种简单方法是让 Wireshark 为数据包的源和目标 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.28 的所有数据包执行相同的操作。更简单地说,它过滤所有进出任一 IP 地址的流量。
您也可以查找其他协议上的活动。例如,您可以键入此过滤器来查找 HTTP 请求:
http.request

要排除来自或发送到设备的数据包,请使用感叹号 (!
) 并将过滤器括在括号 [()
] 中:
!(ip.addr == 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
实际上是同一个数据包中的两个标志。原始设备通过发送ACK
确认SYN
,然后设备建立网络连接。
这称为三次握手:
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
来表明它同意应该断开连接。第一方为刚刚收到的FIN
发送一个ACK
,然后断开网络连接。
这是四次握手的样子:
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
过滤器的全部范围和强大功能,请务必查看其在线参考。