wireshark使用教程及過濾語法總結——血淚史的匯聚

wireshark使用教程及過濾語法總結——血淚史的匯聚

轉載請註明文章來源:wireshark使用教程及過濾語法總結--血淚史的匯聚 - 網路工程 - 周陸軍的個人網站

wireshark介紹

wireshark的官方下載網站: Wireshark · Go Deep.

wireshark是非常流行的網路封包分析軟體,功能十分強大。可以截取各種網路封包,顯示網路封包的詳細信息。

wireshark是開源軟體,可以放心使用。

Wireshark是一款高效免費的網路抓包分析工具。它可以捕獲並描述網線當中的數據,如同使用萬用表測量電壓一樣直觀地顯示出來。在網路分析軟體領域,大多數軟體要麼晦澀難懂要麼價格昂貴,Wireshark改變了這樣的局面,它的最大特點就是免費、開源和多平台支持。

Wireshark幾乎可以運行於所有流行的操作平台,如MS Windows、Mac OS、Linux、FreeBSD、HP-UX、NetBSD、Solaris/i386、Solaris/sparc等等。儘管Wireshark可以在很多操作平台使用,但它支持的傳輸媒介主要是Ethernet。只有Linux平台下Wireshark支持802.11及Token Ring、FDDI和ATM。

Wireshark能夠對大部分區域網協議進行解析,具有界面簡單、操作方便、實時顯示捕獲數據的優點。但Wireshark並不具有分析功能,當一個網路發生異常的時候,Wireshark只會記錄數據,它僅僅是一個測量工具,並不能操作網路,不發送數據包或者做其它的主動動作。

使用wireshark的人必須了解網路協議,否則就看不懂wireshark了。

Wireshark不能做的

為了安全考慮,wireshark只能查看封包,而不能修改封包的內容,或者發送封包。

什麼人會用到wireshark

1. 網路管理員會使用wireshark來檢查網路問題

2. 軟體測試工程師使用wireshark抓包,來分析自己測試的軟體

3. 從事socket編程的工程師會用wireshark來調試

4. 聽說,華為,中興的大部分工程師都會用到wireshark。

總之跟網路相關的東西,都可能會用到wireshark.

wireshark 開始抓包

wireshark是捕獲機器上的某一塊網卡的網路包,當你的機器上有多塊網卡的時候,你需要選擇一個網卡。

點擊Caputre->Interfaces.. 出現下面對話框,選擇正確的網卡。然後點擊"Start"按鈕, 開始抓包

Wireshark 窗口介紹

WireShark 主要分為這幾個界面

1. Display Filter(顯示過濾器), 用於過濾

2. Packet List Pane(封包列表), 顯示捕獲到的封包, 有源地址和目標地址,埠號。 顏色不同,代表

3. Packet Details Pane(封包詳細信息), 顯示封包中的欄位

4. Dissector Pane(16進位數據)

5. Miscellanous(地址欄,雜項)

Wireshark 顯示過濾

使用過濾是非常重要的, 初學者使用wireshark時,將會得到大量的冗餘信息,在幾千甚至幾萬條記錄中,以至於很難找到自己需要的部分。搞得暈頭轉向。

過濾器會幫助我們在大量的數據中迅速找到我們需要的信息。

過濾器有兩種,

一種是顯示過濾器,就是主界面上那個,用來在捕獲的記錄中找到所需要的記錄

一種是捕獲過濾器,用來過濾捕獲的封包,以免捕獲太多的記錄。 在Capture -> Capture Filters 中設置

保存過濾

在Filter欄上,填好Filter的表達式後,點擊Save按鈕, 取個名字。比如"Filter 102",

Filter欄上就多了個"Filter 102" 的按鈕。

過濾器的區別

捕捉過濾器(CaptureFilters):用於決定將什麼樣的信息記錄在捕捉結果中。需要在開始捕捉前設置。

顯示過濾器(DisplayFilters):在捕捉結果中進行詳細查找。他們可以在得到捕捉結果後隨意修改。

那麼我應該使用哪一種過濾器呢?

兩種過濾器的目的是不同的。

捕捉過濾器是數據經過的第一層過濾器,它用於控制捕捉數據的數量,以避免產生過大的日誌文件。

顯示過濾器是一種更為強大(複雜)的過濾器。它允許您在日誌文件中迅速準確地找到所需要的記錄。

兩種過濾器使用的語法是完全不同的。

捕捉過濾器

語法:ProtocolDirectionHost(s)ValueLogical OperationsOther expression例子:tcpdst10.1.1.180andtcp dst 10.2.2.2 3128

Protocol(協議):

可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.

如果沒有特別指明是什麼協議,則默認使用所有支持的協議。

Direction(方向):

可能的值: src, dst, src and dst, src or dst

如果沒有特別指明來源或目的地,則默認使用 「src or dst」 作為關鍵字。

例如,」host 10.2.2.2″與」src or dst host 10.2.2.2″是一樣的。

Host(s):

可能的值: net, port, host, portrange.

如果沒有指定此值,則默認使用」host」關鍵字。

例如,」src 10.1.1.1″與」src host 10.1.1.1″相同。

Logical Operations(邏輯運算):

可能的值:not, and, or.

否(「not」)具有最高的優先順序。或(「or」)和與(「and」)具有相同的優先順序,運算時從左至右進行。

例如,

「not tcp port 3128 and tcp port 23″與」(not tcp port 3128) and tcp port 23″相同。

「not tcp port 3128 and tcp port 23″與」not (tcp port 3128 and tcp port 23)」不同。

過濾表達式的規則

表達式規則

1. 協議過濾

比如TCP,只顯示TCP協議。

2. IP 過濾

比如 ip.src ==192.168.1.102 顯示源地址為192.168.1.102,

ip.dst==192.168.1.102, 目標地址為192.168.1.102

3. 埠過濾

tcp.port ==80, 埠為80的

tcp.srcport == 80, 只顯示TCP協議的願埠為80的。

4. Http模式過濾

http.request.method=="GET", 只顯示HTTP GET方法的。

5. 邏輯運算符為 AND/ OR

常用的過濾表達式

過濾表達式用途http只查看HTTP協議的記錄ip.src ==192.168.1.102 or ip.dst==192.168.1.102源地址或者目標地址是192.168.1.102eth.addr== 00:11:22:33:44:55//過濾目標或源地址是00:11:22:33:44:55的數據包tcp dst port 3128顯示目的TCP埠為3128的封包。ip src host 10.1.1.1顯示來源IP地址為10.1.1.1的封包。

host 10.1.2.

顯示目的或來源IP地址為10.1.2.3的封包。src portrange 2000-2500顯示來源為UDP或TCP,並且埠號在2000至2500範圍內的封包。

src host 10.7.2.12 and not dst net 10.200.0.0/16

顯示來源IP地址為10.7.2.12,但目的地不是10.200.0.0/16的封包。(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8顯示來源IP為10.4.1.12或者來源網路為10.6.0.0/16,目的地TCP埠號在200至10000之間,並且目的位於網路 10.0.0.0/8內的所有封包。

src net 192.168.0.0/24

src net 192.168.0.0 mask 255.255.255.0

顯示來源IP地址為10.1.1.1的封包。

注意事項:

當使用關鍵字作為值時,需使用反斜杠「/」。

「ether proto /ip」 (與關鍵字」ip」相同).

這樣寫將會以IP協議作為目標。

「ip proto /icmp」 (與關鍵字」icmp」相同).

這樣寫將會以ping工具常用的icmp作為目標。

可以在」ip」或」ether」後面使用」multicast」及」broadcast」關鍵字。

當您想排除廣播請求時,」no broadcast」就會非常有用。

Protocol(協議):

您可以使用大量位於OSI模型第2至7層的協議。點擊」Expression…」按鈕後,您可以看到它們。

比如:IP,TCP,DNS,SSH

String1, String2 (可選項):

協議的子類。

點擊相關父類旁的」+」號,然後選擇其子類。

Comparison operators (比較運算符):

可以使用6種比較運算符:

英文寫法:C語言寫法:含義:eq==等於ne!=不等於gt>大於lt<小於ge>=大於等於le<=小於等於

Logical expressions(邏輯運算符):

英文寫法:C語言寫法:含義:and&&邏輯與or||邏輯或xor^^邏輯異或not!邏輯非

顯示過濾器

語法:Protocol.String 1.String 2Comparison

operatorValueLogical

Operations
Other

expression
例子:ftp

passive

ip==10.2.3.4xoricmp.type

例子:

snmp || dns || icmp顯示SNMP或DNS或ICMP封包。ip.addr == 10.1.1.1

顯示來源或目的IP地址為10.1.1.1的封包。

ip.src != 10.1.2.3 or ip.dst != 10.4.5.6

顯示來源不為10.1.2.3或者目的不為10.4.5.6的封包。

換句話說,顯示的封包將會為:

來源IP:除了10.1.2.3以外任意;目的IP:任意

以及

來源IP:任意;目的IP:除了10.4.5.6以外任意

ip.src != 10.1.2.3 and ip.dst != 10.4.5.6

顯示來源不為10.1.2.3並且目的IP不為10.4.5.6的封包。

換句話說,顯示的封包將會為:

來源IP:除了10.1.2.3以外任意;同時須滿足,目的IP:除了10.4.5.6以外任意

tcp.port == 25顯示來源或目的TCP埠號為25的封包。tcp.dstport == 25顯示目的TCP埠號為25的封包。tcp.flags顯示包含TCP標誌的封包。tcp.flags.syn == 0×02顯示包含TCP SYN標誌的封包。

如果過濾器的語法是正確的,表達式的背景呈綠色。如果呈紅色,說明表達式有誤。

wireshark過濾匹配表達式實例

匹配過濾HTTP的請求URI中含有".gif"字元串,並且以.gif結尾(4個位元組)的http請求數據包($是正則表達式中的結尾表示符)

http.request.uri matches ".gif$"

注意區別:http.request.uri contains ".gif$" 與此不同,contains是包含字元串".gif$"(5個位元組)。匹配過濾HTTP的請求URI中含有".gif$"字元串的http請求數據包(這裡$是字元,不是結尾符)

搜索過濾MAC地址前3個位元組是0x001e4f的數據包。

eth.addr[0:3]==00:1e:4f

搜索按條件過濾udp的數據段payload(數字8是表示udp頭部有8個位元組,數據部分從第9個位元組開始udp[8:])

udp[8]==14 (14是十六進位0x14)匹配payload第一個位元組0x14的UDP數據包

udp[8:2]==14:05 可以udp[8:2]==1405,且只支持2個位元組連續,三個以上須使用冒號:分隔表示十六進位。 (相當於 udp[8]==14 and udp[9]==05,1405是0x1405)

udp[8:3]==22:00:f7 但是不可以udp[8:3]==2200f7

udp[8:4]==00:04:00:2a,匹配payload的前4個位元組0x0004002a

而udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP數據包,不一定是從第一位元組匹配。

udp[8:4] matches "\x14\x05\x07\x18"

udp[8:] matches "^\x14\x05\x07\x18\x14"

搜索按條件過濾tcp的數據段payload(數字20是表示tcp頭部有20個位元組,數據部分從第21個位元組開始tcp[20:])

tcp[20:] matches "^GET [ -~]*HTTP/1.1\x0d\x0a"

等同http matches "^GET [ -~]*HTTP/1.1\x0d\x0a"

tcp[20:] matches "^GET (.*?)HTTP/1.1\x0d\x0a"

tcp[20:] matches "^GET (.*?)HTTP/1.1\x0d\x0a[\x00-\xff]*Host: (.*?)pplive(.*?)\x0d\x0a"

tcp[20:] matches "^GET (.*?)HTTP/1.1\x0d\x0a[\x00-\xff]*Host: "

tcp[20:] matches "^POST / HTTP/1.1\x0d\x0a[\x00-\xff]*\x0d\x0aConnection: Keep-Alive\x0d\x0a\x0d\x0a"

檢測SMB頭的smb標記,指明smb標記從tcp頭部第24byte的位置開始匹配。

tcp[24:4] == ff:53:4d:42

檢測SMB頭的smb標記,tcp的數據包含十六進位ff:53:4d:42,從tcp頭部開始搜索此數據。

tcp contains ff:53:4d:42

tcp matches "\xff\x53\x4d\x42"

檢測tcp含有十六進位01:bd,從tcp頭部開始搜索此數據。

tcp matches "\x01\xbd"

檢測MS08067的RPC請求路徑

tcp[179:13] == 00:5c:00:2e:00:2e:00:5c:00:2e:00:2e:00

. . . .

封包列表(Packet List Pane)

封包列表的面板中顯示,編號,時間戳,源地址,目標地址,協議,長度,以及封包信息。 你可以看到不同的協議用了不同的顏色顯示。

你也可以修改這些顯示顏色的規則, View ->Coloring Rules.

封包詳細信息 (Packet Details Pane)

這個面板是我們最重要的,用來查看協議中的每一個欄位。

各行信息分別為

Frame: 物理層的數據幀概況

Ethernet II: 數據鏈路層乙太網幀頭部信息

Internet Protocol Version 4: 互聯網層IP包頭部信息

Transmission Control Protocol: 傳輸層T的數據段頭部信息,此處是TCP

Hypertext Transfer Protocol: 應用層的信息,此處是HTTP協議

TCP包的具體內容

從下圖可以看到wireshark捕獲到的TCP包中的每個欄位。

實例分析TCP三次握手過程

看到這, 基本上對wireshak有了初步了解, 現在我們看一個TCP三次握手的實例

這圖我都看過很多遍了, 這次我們用wireshark實際分析下三次握手的過程。

打開wireshark, 打開瀏覽器輸入 cnblogs.com/tankxiao

在wireshark中輸入http過濾, 然後選中GET /tankxiao HTTP/1.1的那條記錄,右鍵然後點擊"Follow TCP Stream",

這樣做的目的是為了得到與瀏覽器打開網站相關的數據包,將得到如下圖

圖中可以看到wireshark截獲到了三次握手的三個數據包。第四個包才是HTTP的, 這說明HTTP的確是使用TCP建立連接的。

第一次握手數據包

客戶端發送一個TCP,標誌位為SYN,序列號為0, 代表客戶端請求建立連接。 如下圖

第二次握手的數據包

伺服器發回確認包, 標誌位為 SYN,ACK. 將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即0+1=1, 如下圖

第三次握手的數據包

客戶端再次發送確認包(ACK) SYN標誌位為0,ACK標誌位為1.並且把伺服器發來ACK的序號欄位+1,放在確定欄位中發送給對方.並且在數據段放寫ISN的+1, 如下圖:

就這樣通過了TCP三次握手,建立了連接

轉載請註明文章來源:http://www.zhoulujun.cn/zhoulujun/html/theory/network/2016_1130_7908.html


推薦閱讀:

wireshark怎麼捕捉lacp報文?
Wireshark 如何使用?
wireshark找不到介面?
Wireshark使用技巧及數據包分析方法
chrome timing中的queueing代表什麼?

TAG:Wireshark | 網路抓包工具 | 數據抓包 |