天天看點

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

介紹

掌握顯示過濾器對于網絡分析者來說是一項必備的技能。這是一項大海撈針的技巧。學會建構,編輯,儲存關鍵的顯示過濾器能夠節省數小時的時間。

與捕捉過濾器使用的BPF文法不同,顯示過濾器使用的是Wireshark特定的格式。除了某些特例之外,Wireshark顯示過濾器和捕捉過濾器有很大的差別。

更多資訊

過濾HTTP資料流:

在排查網頁浏覽器會話或檢查網速過慢問題時,對浏覽器會話進行過濾就顯得尤為重要。過濾HTTP資料流有兩種方式:

http

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

第二種過濾方法更加有效。讓我們通過分别對網頁浏覽會話應用兩個過濾條件來比較一下:

基于TCP端口号的應用過濾:

本例中的抓封包件包含與網站​​www.wireshark.org的連結以及請求下載下傳Wireshark​​的請求。我們使用tcp.port==80的顯示過濾器并且發現,确實,所有封包都符合條件,如下圖所示。很好這就是我們想要的結果。

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

我們仔細看封包20的Protocol列,Wireshark并沒有在封包中看到任何HTTP指令或回複,是以HTTP協定分析器沒有被應用于此封包。它隻是一個TCP封包(TCP ACK, FIN, RST,以及三路TCP握手信号都列成TCP)。

如果你想要檢視TCP連接配接建立,維護以及關閉封包,就應該使用上述過濾條件(并且你會一直看到這些TCP封包)。

謹慎使用基于TCP的應用名過濾:

現在來看一下對資料流應用http過濾條件的情況。下圖中,你會看到Wireshark顯示了13,353個封包。這些是Protocol列中包含HTTP的封包。

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

這是整個網站浏覽會話的一部分,使用HTTP過濾條件我們無法檢測出TCP錯誤,對于應用永遠是使用端口号過濾器優于TCP。

小貼士:

不幸的是,Wireshark對于HTTP資料流的預設過濾是http。可以考慮将預設對HTTP資料流的過濾改為基于端口号。

按照某一IP位址或主機過濾封包:

對于IPv4資料流,我們使用字段名ip.src,ip.dst,ip.addr;對于IPv6資料流,使用ipv6.src,ipv6.dst,ipv6.host以及ipv6.addr。注意當你在Packet Details面闆中點選IP位址時,将會看到它們被稱為:ip.src,ip.dst, ipv6.src或ipv6.dst。字段名ip.host和ipv6.host,ip.addr以及ipv6.addr不在封包裡。

ip.host和ipv6.host過濾條件在IPv4/IPv6源和目的位址字段查找解析為指定主機名的IPv4或IPv6位址。ip.addr==[address]和ipv6.addr==[address]過濾條件在IPv4/IPv6源和目的位址字段查找指定IPv4/IPv6位址。

  • 例如:ip.addr==10.3.1.1

顯示在IP源位址字段或IP目的位址字段包含10.3.1.1的幀。

  • 例如:!ip.addr==10.3.1.1

顯示除了在IP源位址字段或IP目的位址字段包含10.3.1.1以外的幀。

  • 例如:ipv6.addr==2406:da00:ff00::6b16:f02d

顯示以2406:da00:ff00::6b16:f02d為源位址或目的位址的幀

  • 例如:ip.src==10.3.1.1

顯示所有來自10.3.1.1的資料流。

  • 例如:ip.dst==10.3.1.1

顯示所有發往10.3.1.1的資料流

  • 例如:ip.host==www.wireshark.org

顯示所有解析為​​www.wireshark.org的IP​​位址。

按照某一IP位址範圍過濾封包:

可以使用>或<比較運算符或邏輯運算符&&查找某一位址範圍内的封包。

  • 例如:ip.addr>10.3.0.1&&ip.addr<10.3.0.5

顯示來自或發往10.3.0.2,10.3.0.3,10.3.0.4的資料流。

  • 例如:(ip.addr>=10.3.0.1&&ip.addr<=10.3.0.6)&&!ip.addr==10.3.0.3

顯示來自或發往10.3.0.1,10.3.0.2,10.3.0.4,10.3.0.5,10.3.0.6的資料流,10.3.0.3排除在外。

  • ipv6.addr>=fe80::&&ipv6.addr

顯示IPv6位址從0xfe80到0xfec0開頭的資料流。

按照某一IP子網過濾封包:

可以通過ip.addr字段名定義一個子網。這種格式使用IP位址後跟斜杠以及一個字尾,表明IP位址中定義的網絡部分的比特數。

  •  例如:ip.addr==10.3.0.0/16

顯示在IP源位址或目的位址字段以10.3開頭的資料流。

  • 例如:ip.addr==10.3.0.0/16 && !ip.addr==10.3.1.1

顯示除了10.3.1.1以外,在IP源位址或目的位址字段以10.3開頭的資料流。

  • 例如:!ip.addr==10.3.0.0/16 && !ip.addr==10.2.0.0/16

顯示所有資料流,除了在IP源位址或目的位址字段以10.3和10.2開頭的資料流.

使用右鍵|作為過濾條件:

如下圖所示:在某一幀的Packet Details面闆,擴充HTTP部分,右鍵Request URI一行,選擇Apply as Filter | Selected。

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

Wireshark會建立合适的顯示過濾條件(http.request.rui==”/”)并應用于抓封包件。之後過濾得到2個封包,顯示使用者從兩個不同的IP位址通路首頁内容,如下圖所示。

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

如果你想排除這類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,如下圖所示:

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

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。

一站式學習Wireshark(十):應用Wireshark顯示過濾器分析特定資料流(下)

錯誤的用法導緻不奏效:

錯誤: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