用Tcpdump過濾資料包

yhj20041128001發表於2011-11-03

 

 

Tcpdump的安裝及使用例子

對於網路管理人員來說,使用嗅探器可以隨時掌握網路的實際情況,在網路效能急劇下降的時候,可以通過嗅探器來分析原因,找出造成網路阻塞的根源。Tcpdump就是Linux平臺下一個以命令列方式執行的網路流量監測工具。它能截獲網路卡上收到的資料包,並能夠協助網路管理員對其中的內容進行相應的分析。

嗅探器能夠截獲指定介面或所有介面的資料包,這取決於如何對嗅探器進行配置。預設情況下嗅探器一般會顯示所有從網路上截獲的資料包,但通常會因為資料量過大而使網路管理員理不清頭緒。因此,嗅探器一般都提供有相應的機制來對截獲的資料包進行過濾,從而只顯示符合特定要求的資料包。Tcpdump提供了一整套完善的規則來對截獲的資料包進行過濾,由於大多數圖形化的嗅探器都使用類似的過濾機制,因此對Linux網路管理員來說,瞭解如何使用Tcpdump來捕獲感興趣的資料包是一項必須掌握的基本功。

Tcpdump的安裝

在一些Linux發行版中,Tcpdump通常作為標準的軟體包被預設安裝,執行“tcpdump”命令可以確定是否已經安裝了Tcpdump。如果系統中還沒有安裝Tcpdump,可以去“
http://www.tcpdump.org”下載最新的Tcpdump原始碼包。下面以Tcpdump 3.7.1為例,講述如何安裝Tcpdump,此處使用的作業系統是Red Hat 8.0。

首先下載最新的原始碼包,並將其解壓縮,命令如下:

# cp tcpdump-3.7.1.tar.gz /usr/local/src/
# cd /usr/local/src/
# tar xzvf tcpdump-3.7.1.tar.gz



在編譯Tcpdump之前,應先確定pcap庫(libpcap)已經安裝完畢。這個庫是編譯Tcpdump時所必需的。如果該庫已經安裝,就可以執行下面的命令來編譯並安裝Tcpdump:

# cd tcpdump-3.7.1
# ./configure
# make
# make install



Tcpdump的命令列選項

Tcpdump是一個命令列方式的網路嗅探器。它通過使用命令選項來過濾網路卡截獲的資料包,如果不進行過濾,過多數量的包會使網路管理員很難理清頭緒。Tcpdump的命令格式如下:

tcpdump [ -adeflnNOpqRStuvxX ] [ -c 數量 ] [ -C 檔案尺寸 ] [ -F 檔名 ] [ -i 網路介面 ] [ -m 檔名 ] [ -r 檔名 ] [ -s 長度 ] [ -T 型別 ] [ -w 檔名 ] [ -E algo:secret ] [ 表示式 ]

表1 Tcpdump常用命令列選項 -a 將網路地址和廣播地址轉變成容易識別的名字
-d 將已截獲的資料包的程式碼以人容易理解的格式輸出;
-dd 將已截獲的資料包的程式碼以C程式的格式輸出;
-ddd 將已截獲的資料包的程式碼以十進位制格式輸出;
-e 輸出資料鏈路層的頭部資訊;
-f 將internet地址以數字形式輸出;
-l 將標準輸出變為行緩衝方式;
-n 不將網路地址轉換成易識別的主機名,只以數字形式列出主機地址(如IP地址),這樣可以避免DNS查詢;
-t 不輸出時間戳;
-v 輸出較詳細的資訊,例如IP包中的TTL和服務型別資訊;
-vv 輸出詳盡的報文資訊;
-c 在捕獲指定個數的資料包後退出;
-F 從指定的檔案中讀取過濾規則,忽略命令列中指定的其它過濾規則;
-i 指定監聽的網路介面;
-r 從指定的檔案中讀取資料包(該檔案一般通過-w選項產生);
-w 將截獲的資料包直接寫入指定的檔案中,不對其進行分析和輸出;
-T 將截獲的資料包直接解釋為指定型別的報文,目前支援的型別有cnfp、rpc、rtp、snmp、vat和wb。


表1給出了一些常用的Tcpdump命令列選項,使用這些選項可以過濾出真正感興趣的資料包。

使用Tcpdump的命令列選項可以很方便地過濾出需要的資料包。例如,要過濾掉所有除ARP請求和應答的通訊資料,可以輸入“tcpdump arp”命令。該命令只對ARP的請求和應答資訊進行截獲,在Tcpdump的輸出資訊中,請求是“arp who-has”這樣的條目,而應答則是“arp reply”這樣的條目,如圖1所示。




圖1 ARP過濾


如果要做更多的處理,比如從指定的網路介面截獲5個ARP資料包,並且不將網路地址轉換成主機名,則可以用命令“tcpdump arp -i eth0 -c 5 -n”。

Tcpdump的過濾表示式

Tcpdump的過濾表示式是一個正規表示式,Tcpdump利用其作為過濾資料包的條件。如果一個資料包滿足表示式的條件,則這個資料據包將會被捕獲;如果不指定表示式,則在網路上任何兩臺主機間的所有資料包都將被截獲。過濾表示式的作用就是使Tcpdump只輸出網路管理員所需要的資料,如一個指定的網路介面和特定主機間的IP資料包。

Tcpdump的過濾表示式中一般有如下幾種型別的關鍵字:

◆ 型別關鍵字

這類關鍵字用於指定主機、網路或埠,包括host、net和port三個關鍵字。例如,可以用“host 9.185.10.57”來標明監聽的主機;用“net 9.185.0.0”來標明監聽的網路;用“port 23”來標明監聽的埠。如果沒有在表示式中指明型別,則預設的型別為host。

◆ 方向關鍵字

這類關鍵字用於指定截獲的方向,包括dst、src、dst or src、dst and src四個關鍵字。例如,可以用src 9.185.10.57來指明截獲的資料包中的源主機地址;用“dst net 9.185.0.0”來指明截獲的資料包中的目標網路地址。如果沒有在表示式中指明方向,則預設的方向為“dst or src”,即兩個方向的資料包都將被捕獲。對於資料鏈路層協議(如SLIP和PPP),使用inbound和outbound來定義方向。

◆ 協議關鍵字

這類關鍵字用於指定要截獲的資料包所屬的協議,包括ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp和udp等關鍵字。關鍵字fddi指明在FDDI(分散式光纖資料介面網路)上的特定網路協議。實際上它是ether的別名。fddi和ether具有類似的源地址和目標地址,所以可以將fddi協議包當作ether的包進行分析和處理。其它幾個關鍵字只是指定了所要截獲的協議資料包。如果沒有在表示式中指明協議,則Tcpdump會截獲所有協議的資料包。

除了上述三種型別的關鍵字外,Tcpdump的過濾表示式中還可以指定的一些重要關鍵字包括gateway、broadcast、multicast、less、greater。這些關鍵字對於監聽網路中的廣播和多播很有幫助。關於這些關鍵字的更多資訊和用法請參考Tcpdump的man手冊。

在Tcpdump的過濾表示式中,各類關鍵字之間還可以通過布林運算子來構成組合表示式,以滿足實際運用時的需要。布林運算子包括取非運算子(not或!)、與運算子(and或&&)、或運算子(or或||),使用布林運算子可以將表示式組合起來構成強大的組合條件,從而能夠對Tcpdump的過濾器做進一步細化。

下面給出幾個使用Tcpdump過濾資料包的例子,嗅探器提供的過濾表示式對於管理員監測網路執行狀況非常重要:

1. 如果想要截獲主機“9.185.10.57”所有收到和發出的資料包,可以使用如下命令:

# tcpdump host 9.185.10.57



2. 如果想要截獲在主機“9.185.10.57”和主機“9.185.10.58”或“9.185.10.59”之間傳遞的資料包,可以使用如下命令:

# tcpdump host 9.185.10.57 and \
>\(9.185.10.58 or 9.185.10.59\)



需要注意的是,在使用布林運算子構成組合表示式時,有時需要使用括號來表達複雜的邏輯關係。如果要在命令列中使用括號,一定要用轉義字元(“\”)對括號進行轉義,否則命令列直譯器將給出語法錯誤的提示。

3. 如果想要截獲主機“9.185.10.57”和除主機“9.186.10.58”外所有其它主機之間通訊的IP資料包,可以使用如下命令:

# tcpdump ip host 9.185.10.57 and ! 9.185.10.58



4. 如果想要截獲主機“9.185.10.57”接收或發出的FTP(埠號為21)資料包,可以使用如下命令:

# tcpdump tcp port 21 host 9.185.10.57



5. 如果懷疑係統正受到拒絕服務(DoS)攻擊,網路管理員可以通過截獲發往本機的所有ICMP包,來確定目前是否有大量的ping指令流向伺服器,此時就可以使用下面的命令:

# tcpdump icmp -n -i eth0


Tcpdump的輸出結果

在對網路中的資料包進行過濾後,Tcpdump的輸出結果中包含網路管理員關心的網路狀態資訊。由於Tcpdump只是一個命令列方式的嗅探器,因而其輸出結果不是很直觀,下面以幾種典型的輸出資訊為例,介紹如何對Tcpdump的輸出結果進行分析。

1. 資料鏈路層頭資訊

使用“tcpdump -e host tiger”命令截獲主機“tiger”所有發出和收到的資料包,並在輸出結果中包含資料鏈路層的頭部資訊。

“tiger”是一臺裝有Linux的主機,其MAC地址是00:D0:59:BF:DA:06;“mag”是一臺裝有SCO Unix的工作站,其MAC地址是08:90:B0:2F:AF:46,上述命令的輸出結果如下:

20:15:20.735429 eth0
< 08:90:b0:2f:af:46 00:d0:59:bf:da:06 ip 60: mag.36579 >
tiger.ftp 0:0(0) ack 25565 win 8970 (DF)



在輸出的資訊中,“20:15:20”為截獲資料包的時間,“735429”是毫秒數,“eth0 介面eth0接收該資料包(若為“eth0 >”,則表示從網路介面eth0傳送資料包)。“08:90:b0:2f:af:46”是主機mag的MAC地址,指明傳送該資料包的源主機為“mag”,“00:d0:59:bf:da:06”是主機tiger的MAC地址,指明該資料包傳送的目標主機為“tiger”。“ip”表明該資料包是IP資料包,“60”是資料包的長度,“mag.36579 > tiger.ftp”表明該資料包是從主機“mag”的36579埠發往主機“tiger”的FTP(21)埠。“ack 25565”表示對序列號為25565的包進行確認,“win 8970”則指明傳送視窗的大小為8760。

2. ARP包的輸出資訊

若使用“tcpdump arp -c 2”命令截獲ARP資料包,得到的輸出結果可能是:

20:42:22.713502 eth0
> arp who-has mag tell tiger
(00:d0:59:bf:da:06)
20:42:22.713907 eth0
< arp reply mag is-at 08:90:b0:2f:af:46
(00:d0:59:bf:da:06)



在輸出的資訊中,“20:42:22”為截獲資料包的時間;“713502”和“713907”為毫秒數;“eth0 >”表明從主機發出該資料包;“eth0
3. TCP包的輸出資訊

用Tcpdump截獲的TCP包的一般輸出格式如下:

src > dst: flags data-sequno ack window urgent options



“src > dst:”標明從源地址到目的地址;flags是TCP包中的標誌資訊,包括S(SYN)標誌、F(FIN)標誌、P(PUSH)標誌、R(RST)標誌和“.”(沒有標誌);data-sequno是資料包中的資料序列號;ack是下次期望的資料序列號;window是接收快取的視窗大小;urgent標明資料包中是否有緊急指標;options是可能的選項值。

4. UDP包的輸出資訊

用Tcpdump截獲的UDP包的一般輸出格式如下:

src.port1 > dst.port2: udp lenth



UDP中包含的資訊很簡單。上面的輸出結果表明從主機“src”的“port1”埠發出的一個UDP資料包被送到主機“dst”的“port2”埠,資料包的型別是UDP,其長度為“lenth”。

通過上面的介紹可以知道,Tcpdump是一個命令列方式的嗅探器。它可以根據需要顯示出經過一個網路介面的所有資料包,供網路管理員對網路進行檢測。但由於採用的是命令列方式,對這些資料包的分析可能會比較困難。利用Tcpdump提供的表示式過濾一些截獲的資料包,可以從截獲的大量資料包中提取出有用的資訊,從而能夠有針對性地對網路進行監測。

由於所有網路嗅探器的原理都大體相似,因而Tcpdump的基本知識可以應用於幾乎所有的嗅探器。Tcpdump是基於命令列方式的嗅探器,其輸出結果比較難於分析,因此很多網路管理員都使用圖形化的嗅探器來檢測網路故障,並處理可能存在的安全問題。下次將介紹兩個圖形化的網路嗅探器—Ethereal和EhterApe。同Tcpdump相比,使用這兩個嗅探器的分析過程要簡單許多。(轉)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23757700/viewspace-710139/,如需轉載,請註明出處,否則將追究法律責任。

相關文章