過濾器可以讓你找出你所希望進行分析的數據包。簡單來說,一個過濾器就是定義了一定條件,用來包含或者排除數據包的表達式。如果你不希望看到一些數據包,你可以寫一惡搞過濾器來屏蔽它們。如果你希望只看到某些數據包,你可以寫一個只顯示這些數據包的過濾器。
Wireshark主要提供兩種主要的過濾器。
- 捕獲過濾器:當進行數據包捕獲時,只有那些滿足給定的包含/排除表達式的數據包會被捕獲。
- 顯示過濾器:該過濾器根據指定的表達式用於在一個已捕獲的數據包集合中,隱藏不想顯示的數據包,或者只顯示那些需要的數據包。
這里我們先介紹一下捕獲過濾器。
捕獲過濾器用於進行數據包補貨的是機場和,使用它的一個主要原因就是性能。如果你知道你並不需要分析某個類型的流量,你可以簡單地使用捕獲過濾器過濾掉它,從而節省那些會被用來捕獲這些數據包的處理器資源。
當處理大量數據的時候,創建自定義的捕獲過濾器時相當好用的。它可以讓你專注於那些與你手頭事情有關的數據包,從而加速分析過程。
舉個例子,你在一台多角色的服務器上捕獲流量時,很可能會用到捕獲過濾器,假設你正在解決一個運行於262端口的網絡服務問題,如果你正在分析的那台服務器在許多端口運行着各種不同的昂羅服務,找到並分析只運行於262端口的流量本身可能就具有一定的工作量。你可以通過Capture Options對話框達到目的,步驟如下所示。
- 選擇捕獲->捕獲過濾器,然后編輯一個新的捕獲過濾器選項:名稱為“port 262”(這個可以隨便取),過濾器為“port 262”
- 選擇“捕獲->選項”,然后在對應的網卡的后面(或者選定給定網卡后,在下方的捕獲過濾器)中輸入“port 262”
- 當你設定好你的過濾器之后,單擊“開始”開始捕獲。
1.捕獲過濾器的BPF語法
捕獲過濾器應用於WinPcap,並使用Berkeley Packet Filter(BPF)語法。這個語法被廣泛用於多種數據包嗅探軟件,主要因為大部分數據包嗅探軟件都依賴於使用BPF的libpcap/WinPcap庫。掌握BPF語法對你在數據包層級更深入地探索網絡來說,非常關鍵。
使用BPF語法創建的過濾器被稱為表達式,並且表達式包含一個或多個原語。每個原語包含一個或多個限定詞,然后跟着一個ID名字或者數字,如:
限定詞 | 說明 | 例子 |
---|---|---|
Type | 指出名字或數字所代表的意義 | host、net、port |
Dir | 指明傳輸方向時前往還是來自名字或數字 | src、dst |
Proto | 限定所要匹配的協議 | ether、ip、tcp、udp、http、ftp |
一個捕獲過濾器樣例
在給定表達式的組成部分中,一個src限定詞和192.168.0.10組成了一個原語。這個源於本身就是表達式,可以用它只捕獲那些目標IP地址時192.168.0.10的流量。
你可以使用一下3中邏輯運算符,對原語進行組合,從而創建更高級的表達式。
- 連接運算符 與 (&&)
- 選擇運算符 或 (||)
- 否定運算符 非 (!)
舉例來說,下面的這個表達式只對源地址是192.168.0.10和源端口或目標端口是80的流量進行捕獲。
src 192.168.0.10 && port 80
2.主機名和地址過濾器
你所創建的大多數過濾器都會關注與一個或一些特定的網絡設備。根據這個情況,可以根據設備的MAC地址、IPv4地址、IPv6地址或者DNS主機名配置過濾規則。
舉例來說,假設你對一個正在和你網絡中某個服務器進行交互的主機所產生的流量感興趣,你在這台服務器上可以創建一個使用host限定詞的過濾器,來捕獲所有和那台主機IPv4地址相關的流量。
host 172.16.16.149
去過你在使用一個IPv6網絡,你可能需要使用基於IPv6地址的host限定詞進行過濾,如下所示。
host 2001:0:9d38:6ab8:3845:3f91:9aca:947a
你同樣可以使用基於一台設備的主機名host限定詞進行過濾,就像一下這樣。
host testserver2
或者,如果你考慮到一台主機的IP地址可能會變化,你可以通過加入ether協議限定詞,對它的MAC地址進行過濾。
ether host 00-1a-a0-52-e2-a0
傳輸方向限定詞通常會和前面例子演示的那些過濾器一起使用,來捕獲流向或者流出某台主機的流量。舉例來說,如果想捕獲來自某台主機的流量,加入src限定詞。
src host 172.16.16.149
當你在一個原語中沒有指定一種類型限定符(host、net或者port)時,host限定詞將作為默認選擇。所以上面的那個例子也可以寫成沒有類型限定符的樣子。
dst 172.16.16.149
3.端口和協議過濾器
不僅僅可以基於主機過濾,你還可以對基於每個數據包的端口進行過濾。端口過濾通常被用來過濾使用已知端口的服務和應用。舉例來說,下面是一個只對8080端口進行流量捕獲的簡單過濾器的例子。
port 8080
如果想要捕獲除8080端口外的所有流量,如下所示。
!port 8080
端口過濾器可以和傳輸方向限定符一起使用。舉例來說,如果希望只捕獲前往監聽標准HTTP80端口的Web服務器的流量,使用dst限定符。
dst port 80
4.協議過濾器
協議過濾器可以讓你基於特定協議進行數據包過濾。這通常被用於那些不是應用層的不能簡單地使用特定端口進行定義的協議。所以如果你只想看看ICMP流量,可以使用下面這個過濾器。
icmp
如果你想看除了IPv6之外的所有流量,下面這個過濾器能夠滿足要求。
!ip6
5.協議域過濾器
BPF語法提供給我們的一個強大功能,就是hi我們可以通過檢查協議頭中的每一字節來創建基於那些數據的特殊過濾器。
舉例來說,假設我們想要基於ICMP過濾器的類型域進行過濾,而類型域位於數據包最開頭也就是偏移量為0的位置,那么我們可以通過在協議限定符后輸入由方括號括起的字節偏移量,在這個例子中就是icmp[0],來指定我們想在一個數據包內進行檢查的位置。這樣將返回一個1字節的整型值用於比較。比如只想要得到代表目標不可達(類型3)信息的ICMP數據包,我們在我們的過濾器表達式中令其等於3,如下所示。
icmp[0]==3
如果只想要檢查代表echo請求(類型8)或echo回復(類型0)的ICMP數據包,使用帶有OR運算符的兩個原語。
icmp[0]==8||icmp[0]==0
這些過濾器盡管很好用,但是只能基於數據包頭部的1個字節進行過濾。當然,你可以在方括號中偏移值的后面以冒號分割加上一個字節長度,來制定你希望返回給過濾器表達式的數據長度。
舉例來說,我們想要創建一個捕獲所有以類型3代碼1表示的目標不可達、主機不可達的ICMP數據包,它們都是彼此相鄰的1字節字段,位於數據包頭部偏移量為0的位置。那么我們通過創建一個檢查數據包頭部偏移量為0處為2個字節數據的過濾器,並與十六進制值0301(類型3、代碼1)進行比較,如下所示。
icmp[0:2]==0x0301
一個常用的場景是只捕獲帶有RST標志的TCP數據包。但是RST位對應的比特位對應tcp[13]這個字節的數值4所在的那個二進制位。所以過濾器看上去是這樣的。
tcp[13]&4==4
如果希望所有被設置了PSH標志(比特位代表數字8)的數據包,我們的過濾器應該會將其相應位置替換成這樣。
tcp[13]&8==8
6.捕獲過濾器表達式樣例
常用捕獲過濾器
過濾器 | 說明 |
---|---|
tcp[13]&32==32 | 設置了URG位的TCP數據包 |
tcp[13]&16==16 | 設置了ACK位的TCP數據包 |
tcp[13]&8==8 | 設置了PSH位的TCP數據包 |
tcp[13]&4==4 | 設置了RST位的TCP數據包 |
tcp[13]&2==2 | 設置了SYN位的TCP數據包 |
tcp[13]&1==1 | 設置了FIN位的TCP數據包 |
tcp[13]==18 | TCP SYN-ACK數據包 |
ether host 00:00:00:00:00:00(替換為你的MAC) | 流入或流出你MAC地址的流量 |
!ether host 00:00:00:00:00:00(替換為你的MAC) | 不流入或流出你MAC地址的流量 |
broadcast | 僅廣播流量 |
icmp | ICMP流量 |
icmp[0:2]==0x0301 | ICMP目標不可達、主機不可達 |
ip | 僅IPv4流量 |
ip6 | 僅IPv6流量 |
udp | 僅UDP流量 |