介紹
掌握顯示過濾器對於網路分析者來說是一項必備的技能。這是一項大海撈針的技巧。學會構建,編輯,儲存關鍵的顯示過濾器能夠節省數小時的時間。
與捕捉過濾器使用的BPF語法不同,顯示過濾器使用的是Wireshark特定的格式。除了某些特例之外,Wireshark顯示過濾器和捕捉過濾器有很大的區別。
更多資訊
過濾HTTP資料流:
在排查網頁瀏覽器會話或檢查網速過慢問題時,對瀏覽器會話進行過濾就顯得尤為重要。過濾HTTP資料流有兩種方式:
http
tcp.port==xx(xx表示所使用的HTTP埠)
第二種過濾方法更加有效。讓我們通過分別對網頁瀏覽會話應用兩個過濾條件來比較一下:
基於TCP埠號的應用過濾:
本例中的抓包檔案包含與網站www.wireshark.org的連結以及請求下載Wireshark的請求。我們使用tcp.port==80的顯示過濾器並且發現,確實,所有報文都符合條件,如下圖所示。很好這就是我們想要的結果。
我們仔細看報文20的Protocol列,Wireshark並沒有在報文中看到任何HTTP命令或回覆,因此HTTP協議分析器沒有被應用於此報文。它只是一個TCP報文(TCP ACK, FIN, RST,以及三路TCP握手訊號都列成TCP)。
如果你想要檢視TCP連線建立,維護以及關閉報文,就應該使用上述過濾條件(並且你會一直看到這些TCP報文)。
謹慎使用基於TCP的應用名過濾:
現在來看一下對資料流應用http過濾條件的情況。下圖中,你會看到Wireshark顯示了13,353個報文。這些是Protocol列中包含HTTP的報文。
這是整個網站瀏覽會話的一部分,使用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會建立合適的顯示過濾條件(http.request.rui==”/”)並應用於抓包檔案。之後過濾得到2個報文,顯示使用者從兩個不同的IP地址訪問主頁內容,如下圖所示。
如果你想排除這類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對資料流建立並應用以下過濾條件:
(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。
錯誤的用法導致不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報文。
小貼士:
當你知道只有一個欄位符合你的過濾欄位名的時候,不要害怕使用!=運算子。有時,這是最好用的過濾運算子。