引自:https://www.wireshark.org/docs/man-pages/wireshark-filter.html
名称
wireshark-filter - Wireshark过滤器语法和参考
概要
wireshark [其他选项] [ -R “过滤器表达式”]
tshark [其他选项] [ -R “过滤表达式”]
描述
Wireshark和TShark共享一个强大的过滤引擎,可帮助消除数据包跟踪中的噪音,并让您只看到您感兴趣的数据包。如果数据包满足过滤器中表达的要求,则会显示在数据包列表中。通过显示过滤器,您可以将协议中的字段与特定值进行比较,将字段与字段进行比较,并检查指定字段或协议是否存在。
过滤器也被其他功能使用,例如统计信息生成和数据包列表着色(后者仅适用于Wireshark)。本手册页介绍了它们的语法。可以在Wireshark和https://www.wireshark.org/docs/dfref/上的显示过滤器参考中找到过滤器字段的综合参考。
过滤器语法
检查字段或协议是否存在
最简单的过滤器允许您检查协议或字段的存在。如果要查看包含IP协议的所有数据包,则过滤器将为“ip”(不带引号)。要查看包含令牌环RIF字段的所有数据包,请使用“tr.rif”。
将过滤器中的协议或字段视为隐式具有“存在”运算符。
比较运算符
字段也可以与值进行比较。比较运算符可以通过类似英语的缩写或通过类C符号表示:
eq, == Equal
ne, != Not Equal
gt, > Greater Than
lt, < Less Than
ge, >= Greater than or Equal to
le, <= Less than or Equal to
搜索和匹配运营商
存在的附加运算符仅以英语表示,而不是类似C语法:
contains Does the protocol, field or slice contain a value
matches, ~ Does the protocol or text string match the given
case-insensitive Perl-compatible regular expression
“contains”运算符允许过滤器搜索字符序列,表示为字符串(带引号或未带引号)或字节,表示为字节数组,或表示为单个字符,表示为C样式字符常量。例如,要在捕获中搜索给定的HTTP URL,可以使用以下过滤器:
http contains "https://www.wireshark.org"
“包含”运算符不能用于原子字段,例如数字或IP地址。
“matches”或“〜”运算符允许过滤器应用于指定的Perl兼容正则表达式(PCRE)。“匹配”运算符仅针对协议和具有文本字符串表示的协议字段实现。默认情况下,匹配不区分大小写。例如,要搜索给定的WAP WSP User-Agent,您可以编写:
wsp.user_agent matches "cldc"
这将匹配“cldc”,“CLDC”,“cLdC”或大写和小写字母的任何其他组合。
您可以使用强制区分大小写
wsp.user_agent matches "(?-i)cldc"
这是PCRE (?选项)构造的一个例子。(?-i)执行区分大小写的模式匹配,但也可以指定其他选项。有关更多信息,请参见http://perldoc.perl.org/perlre.html上的pcrepattern(3)手册页。
功能
过滤语言具有以下功能:
upper(string-field) - converts a string field to uppercase
lower(string-field) - converts a string field to lowercase
len(field) - returns the byte length of a string or bytes field
count(field) - returns the number of field occurrences in a frame
string(field) - converts a non-string field to string
upper()和lower()对于执行不区分大小写的字符串比较很有用。例如:
upper(ncp.nds_stream_name) contains "MACRO"
lower(mount.dump.hostname) == "angel"
string()将字段值转换为字符串,适用于“匹配”或“包含”等运算符。整数字段将转换为其十进制表示形式。它可以与IP /以太网地址(以及其他地址)一起使用,但不能与字符串或字节字段一起使用。例如:
string(frame.number) matches "[13579]$"
给你所有奇数包。
协议字段类型
每个协议字段都是键入的。类型是:
ASN.1 object identifier
Boolean
Character string
Compiled Perl-Compatible Regular Expression (GRegex) object
Date and time
Ethernet or other MAC address
EUI64 address
Floating point (double-precision)
Floating point (single-precision)
Frame number
Globally Unique Identifier
IPv4 address
IPv6 address
IPX network number
Label
Protocol
Sequence of bytes
Signed integer, 1, 2, 3, 4, or 8 bytes
Time offset
Unsigned integer, 1, 2, 3, 4, or 8 bytes
1-byte ASCII character
整数可以用十进制,八进制或十六进制表示法表示,或者用C样式字符常量表示。以下六个显示过滤器是等效的:
frame.pkt_len > 10
frame.pkt_len > 012
frame.pkt_len > 0xa
frame.pkt_len > '\n'
frame.pkt_len > '\xa'
frame.pkt_len > '\012'
布尔值为true或false。在测试布尔字段的值的显示过滤器表达式中,“true”表示为1或任何其他非零值,“false”表示为零。例如,令牌环数据包的源路由字段是布尔值。要查找任何源路由数据包,显示过滤器将是:
tr.sr == 1
可以找到非源路由数据包:
tr.sr == 0
以太网地址和字节数组由十六进制数字表示。十六进制数字可以用冒号,句号或连字符分隔:
eth.dst eq ff:ff:ff:ff:ff:ff
aim.data == 0.1.0.d
fddi.src == aa-aa-aa-aa-aa-aa
echo.data == 7a
IPv4地址可以用点分十进制表示法表示,也可以使用主机名表示:
ip.dst eq www.mit.edu
ip.src == 192.168.1.1
可以将IPv4地址与数字相同的逻辑关系进行比较:eq,ne,gt,ge,lt和le。IPv4地址按主机顺序存储,因此在显示过滤器中使用IPv4地址时,您不必担心IPv4地址的字节顺序。
无类别域间路由(CIDR)表示法可用于测试IPv4地址是否在特定子网中。例如,此显示过滤器将查找129.111 Class-B网络中的所有数据包:
ip.addr == 129.111.0.0/16
请记住,斜杠后面的数字表示用于表示网络的位数。CIDR表示法也可以与主机名一起使用,如在此示例中查找与“sneezy”相同的C类网络上的IP地址:
ip.addr eq sneezy/24
CIDR表示法只能用于IP地址或主机名,而不能用于变量名。因此,像“ip.src / 24 == ip.dst / 24”这样的显示过滤器无效(尚未)。
IPX网络由无符号32位整数表示。在测试IPX网络值时,您很可能会使用十六进制:
ipx.src.net == 0xc0a82c00
字符串用双引号括起来:
http.request.method == "POST"
在双引号内,您可以使用反斜杠来嵌入双引号或以八进制或十六进制表示的任意字节。
browser.comment == "An embedded \" double-quote"
使用十六进制查找“HEAD”:
http.request.method == "\x48EAD"
使用八进制查找“HEAD”:
http.request.method == "\110EAD"
这意味着您必须使用双引号内的反斜杠来转义反斜杠。
smb.path contains "\\\\SERVER\\SHARE"
在“smb.path”中查找\\ SERVER \ SHARE。
切片运算符
如果字段是文本字符串或字节数组,则可以截取字段。例如,您可以像这样过滤以太网地址(前三个字节)的供应商部分:
eth.src[0:3] == 00:00:83
另一个例子是:
http.content_type[0:4] == "text"
您也可以在协议名称上使用切片运算符。“框架”协议可能很有用,包含Wireshark或TShark捕获的所有数据。
token[0:5] ne 0.0.0.1.1
llc[0] eq aa
frame[100-199] contains "wireshark"
以下语法控制切片:
[i:j] i = start_offset, j = length
[i-j] i = start_offset, j = end_offset, inclusive.
[i] i = start_offset, length = 1
[:j] start_offset = 0, length = j
[i:] start_offset = i, end_offset = end_of_field
偏移可以是负数,在这种情况下,它们表示从字段末尾的偏移量。字段的最后一个字节位于偏移-1处,最后一个字节位于偏移-2处,依此类推。以下是检查帧的最后四个字节的方法:
frame[-4:4] == 0.1.2.3
要么
frame[-4:] == 0.1.2.3
始终将切片与字符串或字节序列进行比较。作为一种特殊情况,当切片只有1个字节宽时,您可以将其与0xff或更小的十六进制整数(这意味着它适合一个字节)进行比较。对于大于一个字节的字节序列,不允许这样做,因为那时需要指定多字节整数的字节顺序。此外,十进制数不允许这样做,因为它们会与已经允许作为字节字符串的十六进制数混淆。Neverthelss,单字节十六进制整数可以是convienent:
frame[4] == 0xff
切片可以组合。您可以使用逗号运算符连接它们:
ftp[1,3-5,9:] == 01:03:04:05:09:0a:0b
这将偏移量1,偏移量3-5和偏移量9连接到ftp数据的末尾。
会员运营商
可以仅使用成员资格运算符检查字段与一组值的匹配。例如,您可以使用以下过滤器在常见HTTP / HTTPS端口上找到流量:
tcp.port in {80 443 8080}
而不是更冗长:
tcp.port == 80 or tcp.port == 443 or tcp.port == 8080
要使用HEAD或GET方法查找HTTP请求:
http.request.method in {"HEAD" "GET"}
值集还可以包含范围:
tcp.port in {443 4430..4434}
ip.addr in {10.0.0.5 .. 10.0.0.9 192.168.1.1..192.168.1.9}
frame.time_delta in {10 .. 10.5}
输入转化次数
如果字段是文本字符串或字节数组,则可以以最方便的方式表示。
因此,例如,以下过滤器是等效的:
http.request.method == "GET"
http.request.method == 47.45.54
范围也可以用任何一种方式表示:
frame[60:2] gt 50.51
frame[60:2] gt "PQ"
位字段操作
也可以使用位字段操作来定义测试。目前支持以下位字段操作:
bitwise_and, & Bitwise AND
按位AND操作允许测试以查看是否设置了一个或多个位。按位AND对整数协议字段和切片进行操作。
在测试TCP SYN数据包时,您可以编写:
tcp.flags & 0x02
该表达式将匹配包含“tcp.flags”字段的所有数据包与0x02位,即SYN位置位。
同样,通过以下方式实现对所有WSP GET和扩展GET方法的过滤:
wsp.pdu_type & 0x40
使用切片时,必须将位掩码指定为字节字符串,并且它必须与切片本身具有相同的字节数,如下所示:
ip[42:2] & 40:ff
逻辑表达式
可以使用逻辑表达式组合测试。这些也可以用类C语法或类似英语的缩写来表达:
and, && Logical AND
or, || Logical OR
not, ! Logical NOT
表达式也可以用括号分组。以下是所有有效的显示过滤器表达式:
tcp.port == 80 and ip.src == 192.168.2.1
not llc
http and frame[100-199] contains "wireshark"
(ipx.src.net == 0xbad && ipx.src.node == 0.0.0.0.0.1) || ip
请记住,只要表达式中出现协议或字段名称,就会隐式调用“exists”运算符。“exists”运算符具有最高优先级。这意味着必须将第一个过滤器表达式读作“向我显示tcp.port存在且等于80的数据包,并且ip.src存在且等于192.168.2.1”。第二个过滤器表达式意味着“向我显示不存在(llc存在)的数据包”,或者换句话说“where llc不存在”,因此将匹配所有不包含llc协议的数据包。第三滤波器表达式包括存在帧中的偏移199的约束,换句话说,帧的长度至少为200。
必须特别注意每个数据包出现多次的字段。每个IP数据包发生两次“ip.addr”,一次用于源地址,一次用于目标地址。同样,“tr.rif.ring”字段每个数据包可以出现多次。以下两个表达式不等效:
ip.addr ne 192.168.4.1
not ip.addr eq 192.168.4.1
第一个过滤器显示“显示ip.addr存在的数据包不等于192.168.4.1”。也就是说,只要数据包中的一个ip.addr不等于192.168.4.1,数据包就会通过显示过滤器。另一个ip.addr可能等于192.168.4.1,数据包仍会显示。第二个过滤器显示“不显示任何ip.addr字段等于192.168.4.1的数据包”。如果一个ip.addr是192.168.4.1,则数据包不通过。如果ip.addr字段都不是192.168.4.1,则显示该数据包。
在处理乘法重复字段时,很容易将'ne'和'eq'运算符视为具有隐式“exists”修饰符。“ip.addr ne 192.168.4.1”可以被认为是“存在不等于192.168.4.1的ip.addr”。“not ip.addr eq 192.168.4.1”可以被认为是“不存在等于192.168.4.1的ip.addr”。
注意乘法重复的字段; 他们可能会让人困惑。
使用显示滤波器去除数据包迹线中的噪声时,还必须小心。例如,如果要过滤掉所有IP地址数据包到地址224.1.2.3,则使用:
ip.dst ne 224.1.2.3
可能限制太多。使用“ip.dst”进行过滤仅选择满足该规则的IP数据包。不会显示任何其他数据包,包括所有非IP数据包。要显示非IP数据包,您可以使用以下两种表达式之一:
not ip or ip.dst ne 224.1.2.3
not ip.addr eq 224.1.2.3
第一个过滤器使用“not ip”来包含所有非IP数据包,然后让“ip.dst ne 224.1.2.3”过滤掉不需要的IP数据包。上面已经解释了第二个滤波器,其中讨论了用多个出现的场进行滤波。
滤波器场参考
整个显示过滤器列表太大,无法在此处列出。您可以在以下位置找到参考和示例:
-
在线显示过滤器参考:https://www.wireshark.org/docs/dfref/
-
帮助: Wireshark中支持的协议
-
tshark -G fields
在命令行上 -
Wireshark维基:https://wiki.wireshark.org/DisplayFilters
笔记
在Wireshark的过滤器手册页是一部分Wireshark的分布。最新版本的Wireshark可以在https://www.wireshark.org找到。
GRegex在GLib中提供了“匹配”运算符中的正则表达式。有关更多信息,请参阅http://developer.gnome.org/glib/2.32/glib-regex-syntax.html或http://www.pcre.org/。
此联机帮助页未描述捕获筛选器语法,这是不同的。请参阅pcap-filter(7)的手册页,如果不存在,请参阅tcpdump(8),如果不存在,请参阅https://wiki.wireshark.org/CaptureFilters以获取捕获说明过滤器。