0%

应用 Wireshark 显示过滤器分析特定数据流

掌握显示过滤器对于网络分析者来说是一项必备的技能。这是一项大海捞针的技巧。学会构建,编辑,保存关键的显示过滤器能够节省数小时的时间。

与捕捉过滤器使用的 BPF 语法不同,显示过滤器使用的是 Wireshark 特定的格式。除了某些特例之外,Wireshark 显示过滤器和捕捉过滤器有很大的区别。

最简单的过滤器语法

最简单的显示过滤器可基于协议应用域名,或字符,对大小写敏感。绝大多数简单的显示过滤器由小写字母组成。

协议过滤器

  • arp:显示所有包括 ARP 请求和回复在内的所有 ARP 数据流
  • ip:显示内含 IPv4 头的(如 ICMP 目的地址不可达报文,在 ICMP 报文头之后返回到来方向的 IPv4 头)IP 数据流
  • ipv6:显示所有 IPv6 数据流,包括内含 IPv6 报文头的 IPv4 报文,如 6to4,Teredo,以及 ISATAP 数据流
  • tcp:显示所有基于 TCP 的数据流

应用过滤器

  • bootp:显示所有 DHCP 数据流(基于 BOOTP)
  • dns:显示包括 TCP 区域传输以及基于标准 UDP 的 DNS 请求和回复在内的所有 DNS 数据流
  • tftp:显示所有 TFTP(Trivial File Transfer Protocol)数据流
  • http:显示所有 HTTP 命令,回复以及数据传输报文,但不显示 TCP 握手报文,TCP ACK 报文以及 TCP 结束报文
  • icmp:显示所有 ICMP 报文

域过滤器

  • boot.option.hostname:显示所有包含主机名的 DHCP 数据流(DHCP 基于 BOOTP)
  • http:host:显示所有包含 HTTP 主机名字段的 HTTP 报文。此报文是客户端向网络服务器发送请求时发出的
  • ftp.request.command:显示所有包含命令的 FTP 数据流,比如 USER,PASS,或 RETR 命令

字符过滤器

  • tcp.analysis.flags:显示所有包含 TCP 分析标识的所有报文,包括报文丢失,重传,或零窗口标识
  • tcp.analysis,zero_window:显示含有表明发送方的接收缓存用完标识的报文

了解字段名

很多显示过滤器都是基于字段名(例如 http.host)。要了解字段名,在 Packet list 面板选中字段查看 Status 条,如下图所示。

1552618219538

Packet Details面板中展开 HTTP 报文头。在 HTTP 段点击Request Method行,状态条表明这一字段称为http.request.method。在显示过滤器区域输入http.request.method以显示所有包含这一字段的报文。

使用自动完成功能

在过滤器区域输入http.request.method时 Wireshark 打开一个窗口让你遍历过滤器选项。当输入http.,会看到所有以此为开头的显示过滤条件列表。继续输入http.request. ,会看到以这一短语为开头的过滤条件。

可以使用自动完成功能查看所有可用的过滤条件。例如,输入tcp. ,Wireshark 会列出所有可用的 TCP 过滤条件。如果输入tcp.analysis.,Wireshark 会列出所有处理 TCP 问题与性能的 TCP analysis 过滤条件。

显示过滤器比较运算符

通过扩展过滤条件可查找某一域值,Wireshark 针对此功能支持数字比较运算符。

  1. == 或 eq

    ip.src == 10.2.2.2 显示所有源地址为 10.2.2.2 的 IPv4 数据流

  2. != 或 ne

    tcp.srcport != 80 显示源端口除了 80 以外的所有 TCP 数据流

  3. >或 gt

    frame.time_relative > 1 显示距前一个报文到达时间相差 1 秒的报文

  4. 《或 lt

    tcp.window_size < 1460 显示当 TCP 接收窗口小于 1460 字节时的报文

  5. >= 或 ge

    dns.count.answers >= 10 显示包含 10 个以上 answer 的 DNS 响应报文

  6. <= 或 le

    ip.ttl <= 10 显示 IP 报文中 Time to Live 字段小于等于 10 的报文

  7. contains

    http contains “GET” 显示所有 HTTP 客户端发送给 HTTP 服务器的 GET 请求

对于 TCP 应用的过滤条件采用比较运算符。例如想看端口 80 上面的 HTTP 数据流,使用HTTP.port==80

使用 Expressions

当你实在不知道该过滤些什么的时候,使用显示过滤器工具栏的Expression按钮。在Filter Expression窗口,输入感兴趣的应用或协议名,跳转到Field Name列表中相应条目。Relation选项用来添加一个比较运算符,窗口右端是预先定义的值。点击Apply按钮完成。

1552619382659

编辑和使用默认过滤器

Wireshark 提供 15 个缺省显示过滤器供创建新的显示过滤器时参考。点击Filter按钮或点击 Display Filter 按钮打开显示过滤器窗口,如下图所示:

1552619561587

过滤HTTP 数据流

在排查网页浏览器会话或检查网速过慢问题时,对浏览器会话进行过滤就显得尤为重要。过滤 HTTP 数据流有两种方式:

  1. http
  2. tcp.port==xx(xx 表示所使用的 HTTP 端口)

第二种过滤方法更加有效。让我们通过分别对网页浏览会话应用两个过滤条件来比较一下:

使用http过滤如下

1552722099631

使用tcp.port==80的显示过滤器如下图所示

1552722152605

如果想要查看 TCP 连接建立,维护以及关闭报文,就应该使用上述过滤条件

按照某一 IP 地址或主机过滤报文

对于IPv4数据流,我们使用字段名ip.srcip.dstip.addr

对于IPv6数据流,使用ipv6.srcipv6.dstipv6.host以及ipv6.addr。在 Packet Details 面板中点击 IP 地址将会看到它们被称为:ip.srcip.dst, ipv6.srcipv6.dst。字段名ip.hostipv6.hostip.addr以及ipv6.addr不在报文里。

ip.hostipv6.host过滤条件在IPv4/IPv6源和目的地址字段查找解析为指定主机名的IPv4IPv6地址。ip.addr==[address]ipv6.addr==[address]过滤条件在IPv4/IPv6源和目的地址字段查找指定IPv4/IPv6地址。

  • 显示在 IP 源地址字段或 IP 目的地址字段包含 10.3.1.1 的帧

    ip.addr==10.3.1.1

  • 显示除了在 IP 源地址字段或 IP 目的地址字段包含 10.3.1.1 以外的帧

    !ip.addr==10.3.1.1

  • 显示以 2406:da00:ff00::6b16:f02d 为源地址或目的地址的帧

    ipv6.addr==2406:da00:ff00::6b16:f02d

  • 显示所有来自 10.3.1.1 的数据流

    ip.src==10.3.1.1

  • 显示所有发往 10.3.1.1 的数据流

    ip.dst==10.3.1.1

  • 显示所有解析为 www.wireshark.org 的 IP 地址

    ip.host==www.wireshark.org

按照某一 IP 地址范围过滤报文

可以使用><比较运算符或逻辑运算符&&查找某一地址范围内的报文。

  • 显示来自或发往 10.3.0.2,10.3.0.3,10.3.0.4 的数据流

    ip.addr>10.3.0.1&&ip.addr<10.3.0.5

  • 显示来自或发往 10.3.0.1,10.3.0.2,10.3.0.4,10.3.0.5,10.3.0.6 的数据流,10.3.0.3 排除在外

    (ip.addr>=10.3.0.1&&ip.addr<=10.3.0.6)&&!ip.addr==10.3.0.3

  • 显示 IPv6 地址从 0xfe80 到 0xfec0 开头的数据流

    ipv6.addr>=fe80::&&ipv6.addr<fec0::

按照某一 IP 子网过滤报文

可以通过ip.addr字段名定义一个子网。这种格式使用 IP 地址后跟斜杠以及一个后缀,表明 IP 地址中定义的网络部分的比特数。

  • 显示在 IP 源地址或目的地址字段以 10.3 开头的数据流。

    ip.addr==10.3.0.0/16

  • 显示除了 10.3.1.1 以外,在 IP 源地址或目的地址字段以 10.3 开头的数据流。

    ip.addr==10.3.0.0/16 && !ip.addr==10.3.1.1

  • 显示所有数据流,除了在 IP 源地址或目的地址字段以 10.3 和 10.2 开头的数据流

    !ip.addr==10.3.0.0/16 && !ip.addr==10.2.0.0/16

使用右键作为过滤条件

如下图所示:在某一帧的 Packet Details 面板,扩展 HTTP 部分,右键 Request URI 一行,选择Apply as Filter | Selected

image004.png

Wireshark 会创建合适的显示过滤条件(http.request.rui==”/”)并应用于抓包文件。之后过滤得到 2 个报文,显示用户从两个不同的 IP 地址访问主页内容,如下图所示。

image005.png

如果你想排除这类 HTTP 请求,只要在过滤条件前加!not。可以通过右键 GET 请求并选择Apply as Filter | Not Selected。not http.request.uri==”/”

如果你感兴趣的是其余 HTTP GET 请求,可对上述过滤条件扩展:定位在一个 HTTP GET 请求报文,扩展 HTTP 部分,右键 GET 并选择Apply as Filter,这一次选择and Selected选项。之后,显示过滤器显示如下:

(not http.request.uri==”/”)&&(http.request.method==“GET”)

现在可以看到除了default page request(/)之外的所有HTTP GET请求。

过滤单个 TCP 或 UDP 会话

当你想要观察客户端应用于服务器进程之间的通讯,你需要查找的是一个会话。会话是基于客户端应用和服务器进程的 IP 地址和端口号。通常抓包文件中会包含数百个会话,了解如何快速定位及过滤无疑是很有帮助的。

以下两种常用方式可从抓包文件中提取单一 TCP 或 UDP 会话:

  • 通过在Packet List面板右键一个 TCP 或 UDP 报文并选择Conversation Filter | [TCP|UDP].

  • 通过在Packet List面板右键一个 TCP 或 UDP 报文并选择Follow [TCP|UDP] Stream

右键选择 Conversation Filter

通过在Packet List面板右键一个 TCP 或 UDP 报文并选择Conversation Filter | TCP,如下图所示:

image006.png

Wireshark 对数据流创建并应用以下过滤条件:

(ip.addr eq 24.6.173.220 and ip.addr eq 184.84.222.48) and (tcp.port eq 19953 and tcp.port eq 80)

同样的方法可应用于基于 IP 地址,以太网地址,UDP 地址 / 端口号结合的会话。

右键选择 Follow a Stream

要查看应用命令以及会话中的交换数据,通过在Packet List面板右键一个 TCP 或 UDP 报文并选择Follow [TCP|UDP] Stream,如下图所示。如果选择Follow UDP Stream,显示过滤条件会基于 IP 地址和端口号。如果选择Follow TCP Stream, 显示过滤条件会基于 TCP Stream Index number。

image007.png

错误的用法导致不 work

错误:ip.addr != 10.2.2.2

显示在 IP 源地址IP 目的地址不包含 10.2.2.2 的报文。只要在源或目的 IP 地址不为 10.2.2.2,报文就会被显示出来。这时隐含的会导致实际上并未过滤任何报文。

正确:!ip.addr == 10.2.2.2

显示 IP 源地址和 IP 目的地址都不包含 10.2.2.2 的报文。

错误:!tcp.flags.syn==1

显示所有不含 TCP SYN bit 设置为 1 的报文。其他协议报文,必须 UDP 和 ARP 报文也符合这一过滤条件,因为它们的 TCP SYN bit 没有设置为 1。

正确:tcp.flags.syn!=1

只显示包含 SYN 设置为 0 的 TCP 报文。

小贴士:

当你知道只有一个字段符合你的过滤字段名的时候,不要害怕使用!= 运算符。有时,这是最好用的过滤运算符。