Wireshark过滤规则:是什么?
Wireshark过滤规则是一套强大的语法指令,用于从海量的网络数据包中精确地挑选出我们感兴趣的部分进行查看和分析。想象一下,一个繁忙的网络接口每秒钟会捕获成百上千甚至成千上万个数据包,涵盖各种协议、源地址、目的地址和端口。如果没有过滤规则,分析师将淹没在无关的数据洪流中,根本无法快速定位问题或理解特定通信。
Wireshark主要提供两种类型的过滤规则:
- 捕获过滤器 (Capture Filters): 在开始捕获数据包之前应用。它们决定了哪些数据包会被网卡捕获并保存到Wireshark的捕获文件中。这些过滤器的语法基于libpcap/WinPcap库(即BPF – Berkeley Packet Filter语法),与Display Filter语法有所不同,且功能相对有限。一旦数据包被捕获过滤器丢弃,它就不会出现在捕获文件中,从而大大减小文件大小和后续分析的负担。
- 显示过滤器 (Display Filters): 在数据包已经被捕获或从文件加载后应用。它们决定了在Wireshark主界面中显示哪些数据包。Display Filter语法更加丰富和灵活,可以检查数据包的各个层次(以太网、IP、TCP/UDP、应用层等)的字段、值甚至内容。应用显示过滤器并不会丢弃数据包,只是暂时隐藏不符合规则的数据包,你可以随时修改或移除显示过滤器来查看所有数据包。
为什么要使用Wireshark过滤规则?
使用过滤规则至关重要,原因如下:
- 聚焦关键信息: 网络流量通常包含大量噪声和无关数据(如广播、多播、操作系统后台通信等)。过滤规则可以帮助你排除这些干扰,只专注于你想要分析的特定会话、协议或主机。
- 提升分析效率: 减少显示的数据包数量可以显著加快在大量数据中滚动、查找和分析的速度。无需手动翻阅成千上万个无关数据包。
- 减小文件大小: 使用捕获过滤器可以防止无关数据包被保存,从而生成更小的捕获文件,这使得文件更容易传输、存储和分享。
- 保护隐私与安全: 在某些环境中捕获时,你可能不希望捕获包含敏感信息(如登录凭据、私有数据)的特定流量。尽管不是万无一失的方法,但合理的捕获过滤器可以帮助减少这类信息被无意捕获的风险。
- 快速故障排除: 当定位特定问题(如某个服务无法访问、某个连接中断)时,可以直接过滤出与该服务、主机或端口相关的流量,快速诊断问题所在。
在哪里应用Wireshark过滤规则?
在Wireshark界面中有两个主要的地方可以应用过滤规则:
捕获过滤器 (Capture Filter) 应用位置
在你点击“捕获(Capture)”菜单下的“选项(Options)”或者在主界面选择一个接口后,在弹出的捕获设置窗口中,有一个“捕获过滤器(Capture filter)”输入框。在这里输入BPF语法规则,然后点击“开始(Start)”捕获。
注意: 捕获过滤器的语法与显示过滤器不同!请勿混淆。捕获过滤器语法更简洁,主要基于协议、地址、端口等基本属性。
显示过滤器 (Display Filter) 应用位置
Wireshark主界面的数据包列表上方有一个显眼的“应用一个显示过滤器…(Apply a display filter…)”输入框。在这里输入显示过滤器的语法规则,然后点击输入框旁边的“应用(Apply)”按钮(或按Enter键)。Wireshark会立即刷新数据包列表,只显示符合规则的数据包。
这个输入框通常带有颜色指示,如果输入的规则有效,背景会变为绿色;如果规则无效或有语法错误,背景会变为红色。
如何编写Wireshark过滤规则?
编写过滤规则主要是学习其语法和常用的字段名称、操作符以及值的表示方法。以下是针对功能更强大的“显示过滤器”的详细介绍,因为它在后分析阶段使用频率更高且功能更丰富。捕获过滤器语法后面会单独说明。
显示过滤器基本语法结构
显示过滤器的基本结构是:协议.字段 操作符 值
-
协议/字段 (Protocol/Field): 指定你想要检查的协议层(如
ip,tcp,udp,http,dns等)或协议内部的特定字段(如ip.src,tcp.port,http.request.method等)。Wireshark可以识别上千个字段名称,可以在“表达式…”按钮中查找。 -
操作符 (Operator): 用于比较字段的值和指定的值。
==: 等于!=: 不等于>: 大于<: 小于>=: 大于等于<=: 小于等于contains: 字段(或数据包的原始数据)包含指定的值(字符串或字节序列)matches或~=: 字段值与指定的正则表达式匹配(仅适用于字符串字段)
-
值 (Value): 你想要比较的具体数值、IP地址、字符串等。
- 数字:直接写数字,如
80,443 - IP地址:用点分十进制表示,如
192.168.1.100 - 字符串:用双引号括起来,如
"GET","HTTP/1.1" - 布尔值:
true或false(用于检查某个标志位是否设置) - 字节序列:用冒号分隔的十六进制数,如
aa:bb:cc:dd
- 数字:直接写数字,如
常见显示过滤器示例
按协议过滤
tcp: 显示所有TCP协议的数据包。udp: 显示所有UDP协议的数据包。icmp: 显示所有ICMP协议的数据包。http: 显示所有HTTP协议的数据包。dns: 显示所有DNS协议的数据包。arp: 显示所有ARP协议的数据包。
按地址过滤 (IP, MAC)
ip.src == 192.168.1.1: 显示源IP地址为192.168.1.1的数据包。ip.dst == 192.168.1.100: 显示目的IP地址为192.168.1.100的数据包。ip.addr == 192.168.1.1: 显示源或目的IP地址为192.168.1.1的数据包。ip.src != 192.168.1.1: 显示源IP地址不为192.168.1.1的数据包。ip.addr == 192.168.1.0/24: 显示源或目的IP地址在192.168.1.0/24子网范围内的数据包。eth.addr == 00:1a:2b:3c:4d:5e: 显示源或目的MAC地址为00:1a:2b:3c:4d:5e的数据包。
按端口过滤
tcp.port == 80: 显示源或目的TCP端口为80的数据包。udp.port == 53: 显示源或目的UDP端口为53的数据包。port == 22: 显示源或目的TCP或UDP端口为22的数据包。tcp.dstport == 443: 显示目的TCP端口为443的数据包。udp.srcport > 1024: 显示源UDP端口大于1024的数据包。
按包长度过滤
frame.len == 64: 显示帧长度(包括以太网头、校验和等)恰好为64字节的数据包。ip.len < 100: 显示IP层及以上部分长度小于100字节的数据包。tcp.len > 0: 显示包含TCP载荷的数据包(因为如果只有TCP头,长度为0)。
按内容过滤
contains(data, "password"): 显示数据载荷中包含字符串"password"的数据包。注意,这会检查原始数据。http.request.uri contains "login": 显示HTTP请求URI中包含字符串"login"的数据包。这是针对特定协议字段的过滤。data[0:4] == aa:bb:cc:dd: 显示数据载荷起始的4个字节是aa:bb:cc:dd的数据包。
按TCP标志位过滤
TCP头部有各种标志位,如SYN, ACK, FIN, RST等,可以用来过滤特定的连接状态包。
tcp.flags.syn == 1: 显示设置了SYN标志位的数据包(通常是TCP连接的第一个包)。tcp.flags.ack == 1: 显示设置了ACK标志位的数据包。tcp.flags.syn == 1 and tcp.flags.ack == 1: 显示同时设置了SYN和ACK标志位的数据包(通常是TCP三次握手中的第二个包)。tcp.flags.reset == 1或tcp.flags.rst == 1: 显示设置了RESET标志位的数据包。tcp.flags.fin == 1: 显示设置了FIN标志位的数据包(用于正常关闭连接)。
如何组合过滤规则?
你可以使用逻辑运算符来组合多个过滤条件,创建更复杂的规则:
-
and或&&: 逻辑与,同时满足两个条件。
例:ip.src == 192.168.1.100 and tcp.dstport == 80(来自192.168.1.100且目的TCP端口是80的数据包) -
or或||: 逻辑或,满足任一条件。
例:tcp.port == 80 or udp.port == 53(TCP或UDP端口是80或53的数据包) -
not或!: 逻辑非,不满足某个条件。
例:not icmp(所有非ICMP协议的数据包)
例:!ip.addr == 192.168.1.0/24(所有源或目的IP地址不在192.168.1.0/24子网内的数据包)
可以使用括号 () 来改变逻辑运算的优先级,就像在数学表达式中一样。
例:(tcp.port == 80 or tcp.port == 443) and ip.addr == 192.168.1.100 (来自或发往192.168.1.100,且TCP端口是80或443的数据包)
捕获过滤器 (Capture Filter) 的编写
捕获过滤器的语法(BPF语法)与显示过滤器不同,且更为精简。它主要用于快速匹配网络、主机、端口和协议。
BPF语法结构
基本单位:[type] [direction] [protocol] [filter value]
-
type: 过滤对象类型,可以是host,net,port。 -
direction: 流量方向,可以是src,dst,src and dst,src or dst(后两个不常用,默认是src or dst)。 -
protocol: 协议类型,可以是ether,ip,tcp,udp,icmp,arp等。 -
filter value: 具体的值,如地址、端口号。
这些基本单位可以通过逻辑运算符 and, or, not 进行组合(注意:BPF语法使用这些英文单词,而不是符号&&, ||, !)。
常见捕获过滤器示例 (BPF语法)
host 192.168.1.100: 捕获与IP地址192.168.1.100相关的所有流量(源或目的)。src host 192.168.1.100: 捕获源IP地址为192.168.1.100的流量。dst port 80: 捕获目的端口为80的TCP或UDP流量。port 22: 捕获源或目的端口为22的TCP或UDP流量。tcp port 22: 捕获源或目的TCP端口为22的流量。udp port 53: 捕获源或目的UDP端口为53的流量。net 192.168.1.0/24或net 192.168.1.0 mask 255.255.255.0: 捕获与192.168.1.0/24子网相关的所有流量。tcp and port 80: 捕获所有TCP协议且端口为80的流量。host 192.168.1.100 and not port 22: 捕获与192.168.1.100相关但不经过端口22的流量。tcp[13] == 0x12: 这是一个更高级的BPF过滤器,检查TCP头的第13个字节(Flags字段)是否等于0x12(SYN+ACK)。BPF允许基于偏移量进行过滤,但这种方式不如显示过滤器直观。
重要区别:
- 目的: 捕获过滤器为了节省资源和空间,直接丢弃不符的数据;显示过滤器为了分析便利,只是隐藏不符的数据。
- 语法: 捕获过滤器使用BPF语法,功能相对简单;显示过滤器使用Wireshark自己的语法,功能非常强大,可以检查协议的几乎所有字段。
- 应用时机: 捕获过滤器在捕获前设置;显示过滤器在捕获或加载后设置。
因此,通常的做法是使用一个简单的捕获过滤器来减少捕获的数据量,然后在Wireshark中使用详细的显示过滤器来进行精细分析。
过滤规则的“多少”和“复杂性”
关于“多少”过滤规则,这没有固定的数量限制。你可以在一个过滤表达式中组合任意数量的条件,只要它们符合语法规则。规则的“多少”更体现在其“复杂性”上。
过滤规则的复杂性体现在:
- 组合度: 使用
and,or,not以及括号构建多层次的逻辑判断。 - 字段的深度: 可以深入到应用层协议(如HTTP、DNS、SMB等)的特定字段进行过滤,例如
http.request.method == "POST",dns.qry.name == "www.example.com"。 - 值的匹配方式: 不仅可以精确匹配数值或字符串,还可以使用范围(如
port > 1024)、子网掩码(如ip.addr == 192.168.1.0/24)、内容查找(contains)甚至正则表达式(matches)。
编写复杂的过滤规则需要对网络协议有深入的理解,并且熟悉Wireshark中各个协议字段的名称。Wireshark的“表达式...”按钮是一个非常有用的工具,可以帮助你查找可用的协议和字段名称,并辅助构建过滤表达式。
如何获取更多过滤规则帮助和示例?
学习Wireshark过滤规则最好的方式是实践和查阅官方文档。
- Wireshark界面中的“表达式...”按钮: 在显示过滤器输入框旁边,点击这个按钮会弹出一个窗口,列出了Wireshark识别的所有协议和字段,你可以通过浏览或搜索找到需要的字段,并根据提示构建表达式。
- Wireshark官方文档: Wireshark的官方网站提供了详细的Display Filter和Capture Filter语法参考。这是最权威和全面的信息来源。
- 在线资源: 许多网络分析的教程和论坛都会提供大量的Wireshark过滤规则示例,覆盖各种常见的分析场景。
通过不断练习,你会越来越熟练地构建出高效且精确的过滤规则,从而大大提升网络故障排除和性能分析的能力。