1. 程式人生 > >GNU開發工具——WireShark網絡分析工具

GNU開發工具——WireShark網絡分析工具

WireShark 網絡分析工具

GNU開發工具——WireShark網絡分析工具

一、WireShark網絡分析工具簡介

1、WireShark簡介

Wireshark是目前全球使用最廣泛的開源網絡封包分析軟件(前身為Ethereal),由Gerald Combs編寫並於1998年以GPL開源許可證發布。網絡封包分析軟件的功能是擷取網絡封包,並盡可能顯示出最為詳細的網絡封包資料。

2、WireShark架構

技術分享圖片
GUI:處理所有的用戶輸入輸出(所有窗體,對話框等)
Core:核心模塊,通過函數調用將其他模塊連接在一起
Epan:包分析引擎(WireShark Packetage Analyzing)
Protocol-Tree:負責獨立包的信息剖析。

Dissectors:存在於epan/dissectors目錄下的各種協議解析器,支持700+種協議解析,對於每種協議,×××都能識別出協議字段(field),並顯示出字段值(field value)。
Dissector Plugins:支持將解析器的具體實現作為獨立模塊存在。
Display-Filters:顯示過濾引擎,源碼在epan/dfilter目錄
Capture:抓包引擎接口,利用libpcap/WinPcap從底層抓取網絡數據包,libpcap/WinPcap提供了通用的抓包接口,能從不同類型的網絡接口(包括以太網,令牌環網,ATM網等)獲取數據包。
Wiretap:wiretap庫用於讀寫捕獲的文件,讀寫格式時libpcap、 pcapng或者其他類型的文件格式。
Dumpcap:捕獲引擎本身,執行需要提升權限。
WinPcap/libpcap:提供不同平臺的包捕捉以及過濾支持功能的庫。

3、libpcap簡介

WireShark使用libpcap/WinPCAP作為接口,直接與網卡進行數據報文交換。
libpcap(Packet Capture Library),即數據包捕獲函數庫,是Unix/Linux平臺下的網絡數據包捕獲函數庫,是一個獨立於系統的用戶層包捕獲的API接口,為底層網絡監測提供了一個可移植的框架。
WinPcap是一個專為Windows系統設計的、基於libpcap的庫。
地址:http://www.winpcap.org/。
libpcap是一個c庫,用於網絡抓包和過濾,源於tcpdump項目。tcpdump項目中抓包、過濾、capture file的讀寫的代碼被提取出來成為libpcap,由tcpdump項目的開發者維護。

libpcap主要由兩部份組成:網絡分接頭(Network Tap)和數據過濾器(Packet Filter)。網絡分接頭從網絡設備驅動程序中收集數據拷貝,過濾器決定是否接收該數據包。Libpcap利用BSD Packet Filter(BPF)算法對網卡接收到的鏈路層數據包進行過濾。BPF算法的基本思想是在有BPF監聽的網絡中,網卡驅動將接收到的數據包復制一份交給 BPF過濾器,過濾器根據用戶定義的規則決定是否接收此數據包以及需要拷貝該數據包的哪些內容,然後將過濾後的數據給與過濾器相關聯的上層應用程序。
libpcap的包捕獲機制就是在數據鏈路層加一個旁路處理。當一個數據包到達網絡接口時,libpcap首先利用已經創建的Socket從鏈路層驅動程序中獲得該數據包的拷貝,再通過Tap函數將數據包發給BPF過濾器。BPF過濾器根據用戶已經定義好的過濾規則對數據包進行逐一匹配,匹配成功則放入內核緩沖區,並傳遞給用戶緩沖區,匹配失敗則直接丟棄。如果沒有設置過濾規則,所有數據包都將放入內核緩沖區,並傳遞給用戶層緩沖區。

二、WireShark快速抓包

1、WireShark主窗口

技術分享圖片
MENUS(菜單欄):顯示打開文件的路徑名稱
SHORTCUTS(工具欄,快捷方式):常用功能菜單的快捷方式
DISPLAY FILTER(顯示過濾器):顯示過濾器設置
PACKET LIST PANE(封包列表):封包列表
PACKET DETAILS PANE(封包詳細信息):選中封包的詳細信息
DISSECTOR PANE(16進制數據):選中封包的16進制數據
MISCELLANOUS(狀態欄,雜項)

2、網卡接口選擇

打開菜單欄Capture->Options,界面如下:
技術分享圖片

3、快速抓包

選擇網卡,點擊“開始抓包”按鈕。
技術分享圖片

4、停止抓包

點擊“停止抓包”按鈕,界面如下:
技術分享圖片

三、WireShark顯示設置

1、顯示設置

通過對顯示設置工具欄的按鈕進行設置,可以放大、縮小、重置主界面的顯示區。
技術分享圖片

2、列設置

默認列表顯示:序號、時間、源、目的、協議、長度、信息
A、增加列
在封包詳細信息區的任意字段,如TTL,右鍵選擇菜單“Apply as Column”,將選擇的字段信息添加到封包列表區作為一列。
技術分享圖片
B、刪除列
在封包列表區的某列右鍵點擊,選擇“Remove This Column”菜單項,將該列從列表區刪除。
技術分享圖片
C、修改列
在封包列表區的某列右鍵點擊,選擇“Edit Column”菜單項,可以修改該列的名稱。

3、時間設置

A、時間格式設置
點擊菜單欄“View->Time Display Format”,選擇合適的時間顯示格式。
技術分享圖片
B、時間參考設置
選中封包列表區的Time列的某項,右鍵單擊菜單“Set/Unset Time Reference”設置該數據項為時間參考點,可以設置多個時間參考點。
技術分享圖片

4、名字解析

名字解析將MAC地址、IP地址、端口號等轉換成名字,方便記憶,默認開啟MAC地址解析。
點擊菜單欄“Capture->Options->Options”,選中“Name Resolution”的三個復選框,如下圖:
技術分享圖片

四、WireShark數據包操作

1、標記數據包

A、標記/高亮數據包
在封包列表區選中某個封包,右鍵選擇“Mark/Unmark Packet”標記/取消標記高亮。
技術分享圖片
B、修改數據包顏色
在封包列表區單擊右鍵,選擇“Colorize Conversation->Ethernet->New Coloring Rule”菜單項,可以對Ethernet協議進行具體的配色工作。
技術分享圖片
技術分享圖片

2、註釋數據包

在封包列表區的某個數據包上單擊鼠標右鍵,選擇“Packet Comment”菜單項,對數據包進行註釋。
技術分享圖片

3、合並數據包

點擊菜單欄“File->Merge”菜單項,彈出對話框,選擇要合並的數據包。
WireShark需要將當前抓取的數據包保存為文件後才能和其他數據包合並。

4、導出數據包

可以導出特定的數據包,如過濾後的特定協議數據包、標記數據包、特定範圍內的數據包。
技術分享圖片
也可以導出數據包為其他格式文件。

五、WireShark參數設置

1、首選項設置

點擊菜單欄“Edit->Preference”菜單項,
技術分享圖片
主界面布局設置
技術分享圖片
封包列表區的列信息設置
技術分享圖片
字體和顏色設置
技術分享圖片

2、抓包選項設置

點擊菜單欄“Capture->Options”菜單項
A、網卡設置
技術分享圖片
B、多文件連續保存
創建一個文件名,開啟文件連續保存,如每個文件達到1M或每隔1分鐘存取一個文件。
技術分享圖片
C、名字解析設置
多文件連續保存時,可以選擇抓包停止的條件,抓取一定數量的數據包、抓取一定數量的文件時自動停止抓包。選取MAC地址解析、TCP解析等功能。
技術分享圖片

六、WireShark過濾器

1、抓包過濾器

通過BPF(Berkeley Packet Filter)語法選擇性抓取某些特定條件的數據包。
類型:host、net、port
方向:src、dst
協議:ether、ip、tcp、udp、http、ftp
邏輯運算符:與(&&)、或(||)、非(!)
A、ethernet過濾器
第二層過濾器,根據mac地址來進行過濾???

ether?host?XX:抓取源和目的為指定的mac的以太網幀??
ether?dst?XX:抓取目的為指定mac的以太網幀??
ether?src?XX:抓取源為指定mac的以太網幀??
ether?broadcast:抓取所有以太網廣播流量??
ether?multicast:抓取多播流量??
ether?proto?<protocol>:抓取指定協議的以太網流量,比如以太網類型為0x0800,ether?proto?0800。以太網類型指的是以太網幀幀頭的ether-type字段,表示上層的協議類型。0x0800為ipv4、0x86dd為ipv6、0x0806為arp。?
ether host 00:88:ca:86:f8:0d
ether src host 00:88:ca:86:f8:0d
ether dst host 00:88:ca:86:f8:0d

B、主機和網絡過濾器,第三層過濾器??
ip或ipv6:抓取ipv4或ipv6流量??

host?<host>:抓取源或目的為指定主機名(網址)或ip的流量??
dst?host?<host>:抓取目的為指定主機名(網址)或ip的流量??
src?host?<host>:抓取源為指定主機名(網址)或ip的流量??
gateway?<host>:抓取穿越網關的流量,host必須是主機名。??
net?<net>:抓取源或目的為指定網絡號的流量,如:net?192.168.1或net?192.168.1.0??
dst?net?<net>:抓取目的為指定網絡號的流量??
src?net?<net>:抓取源為指定網絡號的流量??
net?<net>?mask?<netmask>:抓取源或目的由net和mask共同指明的ipv4網絡號的流量,ipv6流量無效。如:net?192.168.1.0?mask?255.255.255.0??
dst?net?<net>?mask?<netmask>:抓取目的由net和mask共同指明的ipv4網絡號的流量,ipv6流量無效。??
src?net?<net>?mask?<netmask>:抓取源由net和mask共同指明的ipv4網絡號的流量,ipv6流量無效。??
net?<net>/<len>:抓取源或目的為指定網絡和長度的流量,如:net?192.168.1.0/24??
dst?net?<net>/<len>:抓取目的為指定網絡和長度的流量??
src?net?<net>/<len>:抓取源為指定網絡和長度的流量??
broadcast:抓取ip廣播包,通常如:ip?broadcast??
multicast:?抓取ip多播包??
ip?proto?<protocol?code>:抓取ip包頭協議類型字段值等於特定值的數據包。如:tcp為6,udp為17,icmp為1??
ip6?proto?<protocol>:?抓取ipv6包頭中下一個包頭字段值等於特定值的ipv6數據包。無法用該原詞根據ipv6擴展包頭鏈中的相關字段值執行過濾。??
icmp?[icmptype]==<identifier>:抓取特定類型[icmptype]的icmp數據包,<identifier>表示的是icmp頭部中的類型字段值,如,0(icmp?echo?reply數據包)或8(icmp?echo?request數據包)等。如:icmp[icmptype]==icmp-echo?或?icmp[icmptype]==8??
ip[2:2]==<number>:抓取指定長度的ip數據包(number表示ip包頭中的ip包總長度字段值)??
ip[8]==<number>:抓取具有指定ttl的ip數據包(number表示ip包頭中的ttl字段值)??
ip[9]==<number>:抓取指定協議類型的ip數據包(number表示ip包頭中的協議類型字段值)??
ip[12:4]==ip[16:4]:表示數據包源和目的ip相同??
註:中括號內的數字表示相關協議頭部的內容,第一個數字指從協議頭部的第幾個字節開始關註,第二個數字表示所要關註的字節數。
host 192.168.1.1
src host 192.168.1.1
dst host 192.168.1.1

C、tcp和udp及端口過濾,第四層?過濾器

port?<port>:匹配port指明的端口號,如:port?80或port?http??
dst?port?<port>:目的端口號為指定的端口號??
src?port?<port>:源端口號為指定的端口號??
tcp?portrange?<p1>-<p2>或udp?portrange?<p1>-<p2>:用來抓取端口範圍介於p1和p2之間的tcp或udp數據包??。
tcp?src?portrange?<p1>-<p2>或udp?dst?portrange?<p1>-<p2>??。
tcp?[tcpflags]?&?(tcp-syn|tcp-fin)!=0:抓取tcp連接中用來發起連接(syn標記位置1)或終止連接(FIN標記位置1)的數據包?。
tcp?[tcpflags]?&(tcp-rst)!=0:抓取所有RST標記位置1的TCP數據包,RST標記位用來立刻拆除連接,PSH用來表示將數據提交給末端進程處理。??
less?<length>:抓取不長於指定長度的數據包,寫法等價於:len?<=?<length>??
greater?<length>:抓取不短於標識符指定的長度的數據包,寫法等價於:len?>=?<length>??
tcp?portrange?2000-2500:抓取端口在這個範圍內的tcp數據包?。
tcp[13]?&?0x00=0:抓取所有標記位都未置1的tcp流量(在懷疑遭遇空掃描攻擊時使用)?。
tcp[13]?&?0x01=1:抓取FIN位置1,但ACK位置0的TCP流量??
tcp[13]?&?0x03=3:抓取SYN和FIN位同時置1的TCP流量??
tcp[13]?&?0x05=5:抓取RST和FIN位同時置1的TCP流量??
tcp[13]?&?0x06=6:抓取SYN和RST位同時置1的TCP流量??
tcp[13]?&?0x08=8:抓取PSH位置1,但ACK位置0的TCP流量??
13指代TCP頭部中的標記字段,‘=’號後面數字表示tcp標記位的置位情況。0表示標記位都沒置1,1表示FIN位置1,但ACK位置0,1+2表示SYN和FIN位同時置1,1+4表示RST和FIN同時置1,2+4表示SYN和RST同時置1,8表示PSH位置1,但ACK置0.??
port 80
! port 80
dst port 80
src port 80

D、復合過濾:
host 192.168.1.100 && port 8080
抓包過濾器在菜單欄“Capture->Options”
技術分享圖片

2、顯示過濾器

將抓取的數據包通過顯示過濾器過濾出某些特定的數據包。
邏輯操作符:and、or、xor、not
比較操作符:==、!=、>、<、>=、<=
IP地址:ip.addr、ip.src、ip.dst
端口:tcp.port、tcp.srcport、tcp.dstport、tcp.flag.syn、tcp.flag.ack
協議:arp、ip、icmp、tcp、udp、dns
過濾IP地址:

ip.addr == 192.168.1.1
ip.src == 192.168.1.1
ip.dst == 192.168.1.1
ip.src == 192.168.1.100 and ip.dst == 58.250.135.156

過濾端口:

tcp.port == 80
tcp.srcport == 80
tcp.dstport == 80
tcp.flag.syn == 1

過濾協議:

arp
tcp
udp
not http

復合過濾:

ip.src == 192.168.1.100 and tcp.dstport == 80
ip.addr == 192.168.1.106 and udp.port == 4000

七、WireShark高級功能

1、數據流追蹤

將TCP、UDP、SSL等碎片化的數據包進行重組並完整呈現出來。
單擊菜單欄“Analyze->Follow->TCP Stream”或是選中某個TCP數據包右鍵菜單“Folow->TCP Stream”,查看數據流。
技術分享圖片

2、專家信息

可以對數據包中特定狀態進行警告說明。
點擊菜單欄“Analyze->Expert Information”菜單項
技術分享圖片
根據對統計出的不同級別(Error、Warning、Note、Chat)的數據包,點擊相應的數據包,主界面顯示區會跳到相應的數據包並高亮標記。

3、統計摘要信息

對抓取的數據包進行全局統計
點擊菜單欄“Statistics->Capture File Properties”菜單項
技術分享圖片
可以查看抓取的數據包的統計信息。

4、協議分層統計

點擊菜單欄“Statistics->Protocol Hierarchy”菜單項
技術分享圖片
可以統計通信流量中不同協議占用的百分比。

5、網絡節點統計

“Statistics->Endpoints”
技術分享圖片
統計通信會話中每個節點接收和發送的數據包和字節數,通過網絡節點統計可以找出網絡中哪個節點(IP地址或端口號)最占用帶寬。

6、網絡會話統計

“Statistics->Conversations”
技術分享圖片
統計通信會話之間接收和發送的數據包和字節數,通過網絡會話統計可以找出網絡中哪個會話(IP地址或端口號)最占用帶寬。

7、數據包長度統計

“Statistics->Packet Lengths”
技術分享圖片
統計數據流量中數據包長度的分布。

8、圖表分析

“Statistics->IO Graph”查看網絡吞吐量圖表。
技術分享圖片
對網絡中的吞吐流量進行實時圖形顯示,可以對不同過濾條件過濾的數據包以不同的線型、顏色表示。
“Statistics->Flow Graph”查看數據流圖
技術分享圖片
將會話通信過程圖形可視化出來。

GNU開發工具——WireShark網絡分析工具