Wireshark和 TcpDump抓包分析心得
1. Wireshark與tcpdump介紹
Wireshark是一個網絡協定檢測工具,支援Windows平台和Unix平台,我一般隻在Windows平台下使用Wireshark,如果是Linux的話,我直接用tcpdump了,因為我工作環境中的Linux一般隻有字元界面,且一般而言Linux都自帶的tcpdump,或者用tcpdump抓包以後用Wireshark打開分析。
在Windows平台下,Wireshark通過WinPcap進行抓包,封裝的很好,使用起來很友善,可以很容易的制定抓包過濾器或者顯示過濾器,具體在下面介紹。Wireshark是一個免費的工具,隻要google一下就能很容易找到下載下傳的地方。
2. 簡單的例子
2.1 tcpdump
使用root使用者登入,運作tcpdump指令就可以開始抓包。這裡說明一下,如果使用SSH登入到遠端Linux,然後直接運作tcpdump,會發現抓到大量的資料包,速度快的都看不清楚,這是因為tcpdump抓到的包發送給遠端的終端顯示,同時又抓了這個包,再顯示,再抓取,造成了循環抓取。當然,這樣抓包沒有任何意義,除了證明你的網絡是通的。
預設情況下,tcpdump會選擇第一塊網卡,也就是eth0,進行抓包,每行顯示一個抓取的資料包,如:
0.003183 192.168.21.137 72.14.203.147 TCP 38039 > http [SYN] Seq=0 Win=5840Len=0 MSS=1460 SACK_PERM=1 TSV=36941509 TSER=0 WS=6
0.011707 72.14.203.147 192.168.21.137 TCP http > 38039[SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460
0.011770 192.168.21.137 72.14.203.147 TCP 38039 > http [ACK] Seq=1 Ack=1Win=5840 Len=0
以上三個資料包就是著名的TCP三向交握的資料包,其中38039是用戶端的TCP端口,http的預設端口是80,如果tcpdump在/etc/services中發現端口對應的服務名稱,那麼會自動的轉為名字,是以這裡會顯示為http。表示用戶端的38039端口和伺服器端的http端口進行TCP三向交握。
前面提到tcpdump預設選擇第一塊網卡進行抓包,我們可以使用-i參數指定通過哪一個網卡抓包,如(#表示我輸入的指令,Linux下root使用者的提示符就是#):
# tcpdump –i eth1
或者
#tcpdump –i any
如果想知道我們可以通過哪幾個網卡抓包,可以使用-D參數,如:
# tcpdump –D
1.eth0
2.any
3.lo
因為我的機器上隻有一個網卡,是以隻有eth0,如果有多塊網卡活動的話,會有eth1,eth2依次下去。any的意思是通過任意一塊網卡進行抓包,lo是回環接口。(關于TCP三向交握和回環接口等網絡問題,請參考《TCP/IP協定詳解》)。
預設情況下,tcpdump抓包結果顯示在螢幕(嚴格點,專業點應該說是标準輸出)上,顯然這不利于進一步的資料分析,是以我們需要将抓包結果存放在檔案中。可是使用-w指令将結果儲存在檔案中,如:
#tcpdump –w google.cap
這句指令将抓包結果存放在google.cap檔案中,結束以後可以用Wireshark打開檢視。同僚,tcpdump出了抓包,還可以使用-r參數制定抓包資料檔案,結合過濾器對抓包資料分析,如:
#tcpdump –r google.cap http
這句指令的意思是讓tcpdump讀取google.cap檔案,把其中http協定的資料包都給過濾出來。關于過濾器在下面詳細介紹。
2.2 Wireshark
我在windows系統中使用Wireshark的,首先熟悉一下界面,圖1是使用Wireshark打開google.cap檔案的界面,
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuIWY5MDMwIzMyQ2N3QTY3EWOlVzNmVzNmlTYiRDNwkjYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
圖1 Wireshark界面
圖1中标注出三快區域,R1區域用來顯示簡單的資料包資訊,我們用tcpdump抓包的時候,預設情況下也是顯示成這樣的;R2區域用來顯示選中的資料包的詳細資訊,細心一點會發現他是按照TCP/IP四層結構顯示的,第一行是資料鍊路層的資訊,第二行是網絡層資訊(IP協定),第三行是傳輸層資訊(TCP協定),第四行是應用層資訊(HTTP協定),可以展開每一行用來觀察具體的内容;R3區域是用來顯示此資料包的真實面目。我們在R1和R2區域看到的資訊都是Wireshark整理以後給我們看的,抓包的真實資料實際上是一堆二進制序列,用ultraedit打開google.cap檔案可以看到就是一些數字,如圖2所示。
圖2 抓封包件長的樣子
使用Wireshark抓包非常容易,直接點選按鈕
(工具欄第三個按鈕)
(工具欄第一個按鈕)就開始抓包了,會發現隻要一點選這個按鈕,立刻就顯示抓到包了,這是因為Wireshark預設在混雜模式下抓包,隻要經過網卡的資料包都抓取下來(當然這台機器要連在網絡中,如果沒有資料流過當然沒有包可抓),點選按鈕
停止此次抓包。
如果機器上安裝了多塊網卡,Wireshark預設選擇第一張網卡抓包,如果等抓包完成了,這是發現選錯了網卡是一件極度郁悶的事情。點選按鈕可以在抓包之前選擇抓哪張網卡。
圖3 選擇網卡
我機器上隻有一張網卡,另外兩個是安裝Vmware時的虛拟網卡,可以看到雖然Packets上面已經有資料了,實際上需要點選Start才開始抓包。
解決了選擇網卡的問題以後,考慮如果過濾抓包内容,點選菜單欄上的” Capture” > “Options”可以看到制定抓包規則的界面,如圖4所示。
圖4 制定抓包規則
圖4可以看到Caputre packets inpromiscuous mode,預設是選中的,表示Wireshark預設在混雜模式下抓包。同樣可以選擇通過哪張網卡抓包,不過這些都不是重點,最重要的是Caupture Fileter這裡,點選該按鈕,可以看到彈出一些預定義好的過濾器。比如選擇“HTTP TCP port(80)”,下面Filter string: tcp port http就是過濾器的表示。表示抓tcp協定的,端口為80的資料包(http協定的預設端口是80)。
3. 過濾器(BPF語言)的使用
主要介紹一下在tcpdump中的過濾器使用,因為懂了這個就可以得心應手的使用wireshark了。
從最簡單的開始,BPF語言主要有一個标志或者數字和限定詞組成,限定詞有三種:
第一種:指定類型
net, 定義抓取某個網絡的資料包,給出網絡号就行了,它根據給的網絡号位元組數是1,2,3來判斷A類位址,B類位址或者C類位址,比如tcpdump net 10.1.1 ,它就認為這是一個C類位址。
portrange,顧名思義,這個是指定端口範圍的,用連字元”-”指定範圍,比如tcpdump port 1025-8080
第二種:指定方向
第三種:指定協定
我們知道網絡協定有N種。。。我列一下常用的幾種,其他的可以去google一下J
ether和fddi,以太網協定
tr, TR協定
ip, IP協定
ip6,IPv6協定
arp, ARP協定
好了,最後還需要注意的是邏輯運算,and,or, not(與,或,非),上面已經有一個例子了, 這裡就不再羅嗦了,和普通的程式設計語言沒有什麼不同。
除此之外,還有更加牛X的功能,比如指定TCP中的某個辨別位是什麼,這種應用我一般很少用,不再羅嗦了。