簡介
你執行 man tcpdump 命令,你會看到文檔中對tcpdump的說明是“dump traffic on a network”。可見,tcpdump是一個根據使用者的定義對網絡上的數據包進行截獲的包分析工具。tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。tcpdump以其強大的功能,靈活的截取策略,成為每個高級的系統管理員分析網絡,排查問題等所必備的工具之一。
tcpdump提供了源代碼,公開了接口,因此具備很強的可擴展性,對於網絡維護和入侵者都是非常有用的工具。tcpdump存在於基本的 FreeBSD系統中,由於它需要將網絡接口設置為混雜模式,普通用戶不能正常執行,但具備root權限的用戶可以直接執行它來獲取網絡上的信息。因此系統中存在網絡分析工具主要不是對本機安全的威脅,而是對網絡上的其他計算機的安全存在威脅。
安裝
在一些Linux發行版中,Tcpdump通常作為標准的軟件包被默認安裝,執行“tcpdump”命令能夠確定是否已安裝了Tcpdump。如果沒有安裝,你可以通過yum命令,rpm包和源碼包三種方式來安裝tcpdump。tcpdump依賴於libpcap來捕獲網絡數據包。因此,我們在安裝tcpdump的時候必須也得安裝libpcap函數包。
下面我們對三種方式逐一做介紹。
yum命令方式安裝:
這種方式是最省時省心的。如果順利的話,一個命令就可以解決問題。如果安裝的軟件依賴其他軟件包,安裝的時候會提示你被依賴的軟件包也需要被安裝。
rpm包方式安裝:
相比yum命令方式,rpm包方式安裝會稍微麻煩些。
首先,我們要從網上下載tcpdump的rpm包。
然後,通過rpm命令安裝下載的rpm包。
這種形式的安裝是最簡單的安裝方法,rpm包是將軟件編譯後打包成二進制的格式,通過rpm命令可以直接安裝,不需要修改任何東西。
源碼方式安裝:
源碼方式安裝是最繁瑣的。但是,如果最新的版本發布後,可能網絡上還沒有提供rpm包下載,也沒有被加入到yum源中。這個時候,我們只能通過源碼方式安裝。
首先,我們先獲取tcpdump的源碼。這個源碼在tcpdump的官網有下載。官網地址是http://www.tcpdump.org/。
然後,解壓下載的軟件包。
因為我們下載的軟件包是tar.gz格式的壓縮包。我們可以使用tar命令對其解壓,才能得到源碼。
最後,進行源碼的安裝。
我們先要對libpcap包進行安裝。libpcap也依賴於一些其他軟件包。如果在安裝過程中報一些錯誤,可能你需要安裝相應的依賴包。
在編譯安裝libpcap時,如果出現 “configure: error: Your operating system's lex is insufficient to compile libpcap.”的錯誤提示。 說明你沒有安裝flex軟件包。你需要下載安裝flex。打開網址 flex.sourceforge.net,下載flex-2.5.35.tar.gz 。然後通過tar -xvf ./flex-2.5.35.tar.gz 命令解壓文件。
如果沒有編譯安裝此文件,在編譯安裝libpcap時,如果出現 "configure: WARNING: don't have both flex and bison; reverting to lex/yacc checking for capable lex... insufficient" 的錯誤提示。 說明你沒有安裝bison包。打開網址:ftp.gnu.org/gnu/bison/ 下載 bison-2.4.1.tar.gz 軟件包,通過 tar zxvf bison-2.4.1.tar.gz 解壓文件。
在編譯安裝bison-2.4.1時,如果出現 “configure: error: GNU M4 1.4 is required”的錯誤提示。 說明你沒有安裝m4。打開網址:ftp.gnu.org/gnu/m4/ 下載 m4-1.4.1.tar.gz軟件包,通過 tar zxvf m4-1.4.13.tar.gz 解壓文件
而後依次進入目錄m4-1.4.1,bison-1.25,flex-2.5.35,libpcap-1.6.2 tcpdump-4.6.2 並執行以下命令:
命令完成後,libpcap網絡捕包接口程序方可使用。
注意:運行此類程序時需要以root的身份運行,因為系統不允許非root用戶進行一些網絡操作。
基本使用
tcpdump的命令格式如下:
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
命令行參數介紹:
-A 以ASCII格式打印出所有分組,並將鏈路層的頭最小化。
-c 在收到指定的數量的分組後,tcpdump就會停止。
-C 在將一個原始分組寫入文件之前,檢查文件當前的大小是否超過了參數file_size
中指定的大小。如果超過了指定大小,則關閉當前文件,然後在打開一個新的文件。參數 file_size
的單位是兆字節(是1,000,000字節,而不是1,048,576字節)。
-d 將匹配信息包的代碼以人們能夠理解的匯編格式給出。
-dd 將匹配信息包的代碼以c語言程序段的格式給出。
-ddd 將匹配信息包的代碼以十進制的形式給出。
-D 打印出系統中所有可以用tcpdump截包的網絡接口。
-e 在輸出行打印出數據鏈路層的頭部信息。
-E 用spi@ipaddr algo:secret解密那些以addr作為地址,並且包含了安全參數索引值spi的IPsec ESP分組。
-f 將外部的Internet地址以數字的形式打印出來。
-F 從指定的文件中讀取表達式,忽略命令行中給出的表達式。
-i 指定監聽的網絡接口。
-l 使標准輸出變為緩沖行形式。
-L 列出網絡接口的已知數據鏈路。
-m 從文件module中導入SMI MIB模塊定義。該參數可以被使用多次,以導入多個MIB模塊。
-M 如果tcp報文中存在TCP-MD5選項,則需要用secret作為共享的驗證碼用於驗證TCP-MD5選選項摘要(詳情可參考RFC 2385)。
-n 不把網絡地址轉換成名字。
-N 不輸出主機名中的域名部分。例如,‘nic.ddn.mil‘只輸出’nic‘。
-t 在輸出的每一行不打印時間戳。
-O 不運行分組分組匹配(packet-matching)代碼優化程序。
-P 不將網絡接口設置成混雜模式。
-q 快速輸出。只輸出較少的協議信息。
-r 從指定的文件中讀取包(這些包一般通過-w選項產生)。
-S 將tcp的序列號以絕對值形式輸出,而不是相對值。
-s 從每個分組中讀取最開始的snaplen個字節,而不是默認的68個字節。
-T 將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc遠程過程調用)和snmp(簡單網絡管理協議;)。
-t 不在每一行中輸出時間戳。
-tt 在每一行中輸出非格式化的時間戳。
-ttt 輸出本行和前面一行之間的時間差。
-tttt 在每一行中輸出由date處理的默認格式的時間戳。
-u 輸出未解碼的NFS句柄。
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息。
-vv 輸出詳細的報文信息。
-w 直接將分組寫入文件中,而不是不分析並打印出來。
-x 以16進制數形式顯示每一個報文 (去掉鏈路層報頭) . 可以顯示較小的完整報文, 否則只顯示snaplen個字節.
-xx 以16進制數形式顯示每一個報文(包含鏈路層包頭)。
-X 以16進制和ASCII碼形式顯示每個報文(去掉鏈路層報頭)。
-XX 以16進制和ASCII嗎形式顯示每個報文(包含鏈路層報頭)。
-y 設置tcpdump 捕獲數據鏈路層協議類型
-Z 使tcpdump 放棄自己的超級權限(如果以root用戶啟動tcpdump, tcpdump將會有超級用戶權限), 並把當前tcpdump的用戶ID設置為user, 組ID設置為user首要所屬組的ID
常用參數應用示例與應用場景介紹:
默認啟動
tcpdump如果不加任何參數,啟動後默認會監視第一個網絡接口上所有流過的數據包。
觀察指定接口的網絡數據包
想知道本機都有那些網絡接口,可以通過tcpdump -D命令查看。如果想監聽所有的網絡接口,只要把-i參數值改為any就可以了。即,-i any。
以ASCII碼方式查看數據包
web程序與其他服務通信多數支持以ASCII格式傳輸數據。如,向mysql服務端傳輸的sql語句就是以ASCII碼形式進行傳輸。我們就可以使用-A參數查看傳輸的具體sql語句。
把數據寫入指定文件
數據寫入指定文件後,方便使用其他數據包分析軟件進行分析。如 wireshark。在後面,我們將涉及如何使用wireshark分析tcpdump的數據包。
設置讀取數據包的長度
默認讀取的長度比較短,如果需要查看的信息被截斷了。可以指定此參數。
tcpdump能夠截獲指定接口或任何接口的數據包,這取決於如何對tcpdump進行配置。缺省情況下tcpdump一般會顯示任何從網絡上截獲的數據包,但通常這樣的信息量過大,不利於分析。因此,tcpdump提供了使用表達式過濾報文條件,來對截獲的數據包進行過濾,從而只顯示符合特定需要的數據包。下面我們對tcpdump的表達式做下介紹。
表達式是一個正則表達式,tcpdump利用它作為過濾報文的條件,如果一個報文符合表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網絡上所有的信息包將會被截獲。在表達式中一般有如下幾種類型的關鍵字。
第一種是關於類型的關鍵字,主要包括host,port,net。例如:
截獲來自和發往主機102.168.1.100的所有報文數據。
截獲來自和發送到網絡地址為192.168.1.0/24的所有主機的報文數據,
截獲所有從23號端口發出,和發往23號端口的報文數據。如果沒有指定類型,缺省的類型是host.
第二種是確定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明了傳輸的方向。舉例說明:
截獲來自主機 102.168.1.100的所有報文數據
截獲發送到網絡地址為192.168.1.0/24的所有主機的報文數據 。既可以是名字(存在/etc/networks中),也可以是網絡號.
如果沒有指明方向關鍵字,則缺省是src or dst關鍵字。
第三種是協議的關鍵字,主要包括ip,arp,rarp,tcp,udp等類型。關鍵字就是指明了監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的信息包。
截獲所有udp協議的報文數據。
第四種是邏輯運算關鍵字,主要包括,取非運算是 ‘not ‘ ‘! ‘, 與運算是’and’,'&&’;或運算 是’or’ ,’││’;這些關鍵字可以組合起來構成強大的組合條件來滿足人們的需要。
截獲所有發往主機192.168.1.100的80端口或者8080端口的報文數據。
除了這上面幾種類型的關鍵字之外,其他重要的關鍵字如下:portrange,gateway, broadcast,less,greater。
截獲目標端口在1和1023之間的所有報文數據。
截獲所有報文長度大於20的報文數據。
輸出信息的基本格式:
雖然tcpdump會根據指定參數的不同,輸出結果有所差異。但是它基本的輸出格式相同:系統時間 來源主機.端口 > 目標主機.端口 數據包參數。下面我們來看下集中典型的輸出。
數據鏈路層頭信息:
16:49:57 是時間。 格式為,小時:分:秒。
940257 為ID號。
00:16:3e:00:00:2f 發出數據包主機的mac地址。
oui Unknown 表面mac地址對應的oui(廠商代碼)不能識別。
00:16:3e:00:6c:fc 數據包目標主機的mac地址。
ethertype IPv4 (0x0800) 以太網幀所攜帶的上層數據類型為IPv4。
110 是數據包的長度。
host1.41684 表示發送數據包的主機名是host1,端口是41684。
host2.11211 數據包目標地址主機的主機名是host2,接受數據包的端口是11211。
P 表示發送數據。
(44) 表示發送數據的長度是44個字節。
ack 839113 表示對序列號為839113的包進行響應。
win 115 表示發送的窗口大小為115。
TCP包的輸出信息:
17:31:47.143178 是時間
IP 是協議說明。
host1.48232 > 是發送端主機和端口。符號 > 表明數據的傳輸方向。
host2.11211 接收端的主機名和端口。
S flags是TCP包中的標志信息(S是SYN標志,F(FIN),P(PUSH),R(RST),"."(沒有標記))。
第五列 ata-seqno是數據包中的數據的順序號。
第六列 ack是下次期望的順序號。
第七列 window是接收緩存的窗口大小。
UDP包的輸出信息:
用TCPDUMP捕獲的UDP包的一般輸出信息是:
route.port1 > ice.port2: udp lenth
UDP十分簡單,上面的輸出行表明從主機ROUTE的port1端口發出的一個UDP數據包到主機ICE的port2端口,類型是UDP, 包的長度是lenth。
作業示例:
觀察mysql數據通信。
ps:
另外你得了解,為了讓網絡接口可以讓tcpdump監聽,所以執行tcpdump時網絡接口會啟動在“混雜模式(promiscuous)”,所以你會在 /var/log/messages裡面看到很多的警告信息,通知你說你的網卡被設置成為混雜模式。別擔心,那是正常的。至於更多的應用,請參考man tcpdump了。
參考資料
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 輸出格式
http://wangjunle23.blog.163.com/blog/static/1178381712012724196814/ http://blog.chinaunix.net/uid-11242066-id-4084382.html http://bbs.chinaunix.net/thread-1508322-1-1.html http://blog.csdn.net/jiayanhui2877/article/details/5953725 http://www.360doc.com/content/11/1013/12/1162697_155701557.shtml# http://www.startos.com/linux/tips/2010122818605_5.html http://albanianwizard.org/how-to-read-tcpdump-output-tcpdump-advanced-use.albanianwizard http://blog.csdn.net/chinainvent/article/details/5177877 tcp三次握手
轉自:http://www.bo56.com/%E8%B0%83%E8%AF%95%E5%88%A9%E5%99%A8%E4%B9%8Btcpdump/