轉 Wireshark和TcpDump抓包分析心得

1. Wireshark與tcpdump介紹編程

 Wireshark是一個網絡協議檢測工具,支持Windows平臺和Unix平臺,我通常只在Windows平臺下使用Wireshark,若是是Linux的話,我直接用tcpdump了,由於我工做環境中的Linux通常只有字符界面,且通常而言Linux都自帶的tcpdump,或者用tcpdump抓包之後用Wireshark打開分析。windows

在Windows平臺下,Wireshark經過WinPcap進行抓包,封裝的很好,使用起來很方便,能夠很容易的制定抓包過濾器或者顯示過濾器,具體在下面介紹。Wireshark是一個免費的工具,只要google一下就能很容易找到下載的地方。瀏覽器

tcpdump是基於Unix系統的命令行式的數據包嗅探工具。若是要使用tcpdump抓取其餘主機MAC地址的數據包,必須開啓網卡混雜模式,所謂混雜模式,用最簡單的語言就是讓網卡抓取任何通過它的數據包,無論這個數據包是否是發給它或者是它發出的,點擊【http://en.wikipedia.org/wiki/Promiscuous_mode】獲取更多有關混雜模式的資料。通常而言,Unix不會讓普通用戶設置混雜模式,由於這樣能夠看到別人的信息,好比telnet的用戶名和密碼,這樣會引發一些安全上的問題,因此只有root用戶能夠開啓混雜模式,開啓混雜模式的命令是:ifconfig eth0 promisc, eth0是你要打開混雜模式的網卡。確定有人要問若是在windows下要不要打開混雜模式,windows下網卡沒有什麼混雜模式不混雜模式,在於應用程序自己,如使用Wireshark抓包的時候能夠經過設置爲在混雜模式下抓包(這就是爲何該死的ARP欺騙病毒能夠猖狂的緣由)。tcpdump固然也能夠指定抓包過濾器,並且其過濾器語言很是著名,叫作Berkeley包過濾,簡稱BPF語言。安全

2. 簡單的例子服務器

咱們經過訪問www.google.com.hk這個網址來看看抓包結果。網絡

2.1  tcpdumptcp

前面說過通常狀況下Linux都自帶了tcpdump,可是若是發生了小几率事件,發現沒有tcpdump的話,能夠到http://www.tcpdump.org下載源代碼,編譯安裝。編程語言

使用root用戶登陸,運行tcpdump命令就能夠開始抓包。這裏說明一下,若是使用SSH登陸到遠程Linux,而後直接運行tcpdump,會發現抓到大量的數據包,速度快的都看不清楚,這是由於tcpdump抓到的包發送給遠程的終端顯示,同時又抓了這個包,再顯示,再抓取,形成了循環抓取。固然,這樣抓包沒有任何意義,除了證實你的網絡是通的。工具

由於沒有打開網卡的混雜模式,因此若是本機沒有任何進程訪問網絡,是抓不到包的,若是在字符界面下,用wget http://www.google.com.hk 訪問網址,若是有GUI,能夠打開firefox瀏覽器訪問http://www.google.com.hkgoogle

默認狀況下,tcpdump會選擇第一塊網卡,也就是eth0,進行抓包,每行顯示一個抓取的數據包,如:

0.003183              192.168.21.137  72.14.203.147     TCP        38039 > http [SYN] Seq=0 Win=5840 Len=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=1 Win=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文件的界面,

 

圖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 in promiscuous mode,默認是選中的,表示Wireshark默認在混雜模式下抓包。一樣能夠選擇經過哪張網卡抓包,不過這些都不是重點,最重要的是Caupture Fileter這裏,點擊該按鈕,能夠看到彈出一些預約義好的過濾器。好比選擇「HTTP TCP port(80)」,下面Filter string: tcp port http就是過濾器的表示。表示抓tcp協議的,端口爲80的數據包(http協議的默認端口是80)。

3. 過濾器(BPF語言)的使用

         主要介紹一下在tcpdump中的過濾器使用,由於懂了這個就能夠駕輕就熟的使用wireshark了。

         從最簡單的開始,BPF語言主要有一個標誌或者數字和限定詞組成,限定詞有三種:

          第一種:指定類型

          host, 定義抓取哪一個IP地址(也能夠給它mac地址,格式是00:00:00:00:00:00)的數據包,好比我想抓有關192.168.0.148這個IP地址的數據包,那麼就寫成tcpdump host 192.168.0.148, host是限定詞,192.168.0.148就是標誌。這條命令會抓取從發出或者向192.168.0.148發送的數據包。

          net, 定義抓取某個網絡的數據包,給出網絡號就好了,它根據給的網絡號字節數是1,2,3來判斷A類地址,B類地址或者C類地址,好比tcpdump net 10.1.1 ,它就認爲這是一個C類地址。

port,指定端口,好比tcpdump host and port 22, 這是抓端口爲22的數據包,不論是TCP仍是UDP的,這裏我稍微早一點的給出了邏輯操做,and J,若是隻想抓TCP的,那麼能夠寫tcpdump host 192.168.0.148 and tcp port 22。

portrange,顧名思義,這個是指定端口範圍的,用連字符」-」指定範圍,好比tcpdump port 1025-8080

         第二種:指定方向

咱們以前的命令都是說「這條命令會抓取從192.168.0.148發出或者向192.168.0.148發送」,因此,若是指向抓從發出的數據包可使用限定詞src, 命令:tcpdump src host 192.168.0.148,反過來,想抓發向192.168.0.148的數據包,使用限定詞dst,命令:tcpdump dst host 192.168.0.148。

        第三種:指定協議

咱們知道網絡協議有N種。。。我列一下經常使用的幾種,其餘的能夠去google一下J

ether和fddi, 以太網協議

tr, TR協議

ip, IP協議

ip6, IPv6協議

arp,  ARP協議

好了,最後還須要注意的是邏輯運算,and, or, not(與,或,非),上面已經有一個例子了, 這裏就再也不羅嗦了,和普通的編程語言沒有什麼不一樣。

除此以外,還有更加牛X的功能,好比指定TCP中的某個標識位是什麼,這種應用我通常不多用,再也不羅嗦了。

Excerpted from Wireshark和TcpDump抓包分析心得 - zrzlj的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/zrzlj/article/details/6076219

Sign Up & Read Comfortably—Anytime, Anywhere

A subscription to Readability offers great features for mobile reading, saving articles for later and supporting the writers you enjoy. Learn More »

相關文章
相關標籤/搜索