Tcpdump的安裝及使用例子 對 于網(wǎng)絡(luò)管理人員來說,使用嗅探器可以隨時掌握網(wǎng)絡(luò)的實際情況,在網(wǎng)絡(luò)性能急劇下降的時候,可以通過嗅探器來分析原因,找出造成網(wǎng)絡(luò)阻塞的根源。 Tcpdump就是Linux平臺下一個以命令行方式運行的網(wǎng)絡(luò)流量監(jiān)測工具。它能截獲網(wǎng)卡上收到的數(shù)據(jù)包,并能夠協(xié)助網(wǎng)絡(luò)管理員對其中的內(nèi)容進(jìn)行相應(yīng)的 分析。
嗅探器能夠截獲指定接口或所有接口的數(shù)據(jù)包,這取決于如何對嗅探器進(jìn)行配置。缺省情況下嗅探器一般會顯示所有從網(wǎng)絡(luò)上截獲的數(shù) 據(jù)包,但通常會因為數(shù)據(jù)量過大而使網(wǎng)絡(luò)管理員理不清頭緒。因此,嗅探器一般都提供有相應(yīng)的機制來對截獲的數(shù)據(jù)包進(jìn)行過濾,從而只顯示符合特定要求的數(shù)據(jù) 包。Tcpdump提供了一整套完善的規(guī)則來對截獲的數(shù)據(jù)包進(jìn)行過濾,由于大多數(shù)圖形化的嗅探器都使用類似的過濾機制,因此對Linux網(wǎng)絡(luò)管理員來說, 了解如何使用Tcpdump來捕獲感興趣的數(shù)據(jù)包是一項必須掌握的基本功。
Tcpdump的安裝
在一些Linux 發(fā)行版中,Tcpdump通常作為標(biāo)準(zhǔn)的軟件包被默認(rèn)安裝,執(zhí)行“tcpdump”命令可以確定是否已經(jīng)安裝了Tcpdump。如果系統(tǒng)中還沒有安裝 Tcpdump,可以去“http://www.tcpdump.org”下載最新的Tcpdump源碼包。下面以Tcpdump 3.7.1為例,講述如何安裝Tcpdump,此處使用的操作系統(tǒng)是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之前,應(yīng)先確定pcap庫(libpcap)已經(jīng)安裝完畢。這個庫是編譯Tcpdump時所必需的。如果該庫已經(jīng)安裝,就可以執(zhí)行下面的命令來編譯并安裝Tcpdump:
# cd tcpdump-3.7.1 # ./configure # make # make install
Tcpdump的命令行選項
Tcpdump是一個命令行方式的網(wǎng)絡(luò)嗅探器。它通過使用命令選項來過濾網(wǎng)卡截獲的數(shù)據(jù)包,如果不進(jìn)行過濾,過多數(shù)量的包會使網(wǎng)絡(luò)管理員很難理清頭緒。Tcpdump的命令格式如下:
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 數(shù)量 ] [ -C 文件尺寸 ] [ -F 文件名 ] [ -i 網(wǎng)絡(luò)接口 ] [ -m 文件名 ] [ -r 文件名 ] [ -s 長度 ] [ -T 類型 ] [ -w 文件名 ] [ -E algo:secret ] [ 表達(dá)式 ]
表1 Tcpdump常用命令行選項 -a 將網(wǎng)絡(luò)地址和廣播地址轉(zhuǎn)變成容易識別的名字 -d 將已截獲的數(shù)據(jù)包的代碼以人容易理解的格式輸出; -dd 將已截獲的數(shù)據(jù)包的代碼以C程序的格式輸出; -ddd 將已截獲的數(shù)據(jù)包的代碼以十進(jìn)制格式輸出; -e 輸出數(shù)據(jù)鏈路層的頭部信息; -f 將internet地址以數(shù)字形式輸出; -l 將標(biāo)準(zhǔn)輸出變?yōu)樾芯彌_方式; -n 不將網(wǎng)絡(luò)地址轉(zhuǎn)換成易識別的主機名,只以數(shù)字形式列出主機地址(如IP地址),這樣可以避免DNS查詢; -t 不輸出時間戳; -v 輸出較詳細(xì)的信息,例如IP包中的TTL和服務(wù)類型信息; -vv 輸出詳盡的報文信息; -c 在捕獲指定個數(shù)的數(shù)據(jù)包后退出; -F 從指定的文件中讀取過濾規(guī)則,忽略命令行中指定的其它過濾規(guī)則; -i 指定監(jiān)聽的網(wǎng)絡(luò)接口; -r 從指定的文件中讀取數(shù)據(jù)包(該文件一般通過-w選項產(chǎn)生); -w 將截獲的數(shù)據(jù)包直接寫入指定的文件中,不對其進(jìn)行分析和輸出; -T 將截獲的數(shù)據(jù)包直接解釋為指定類型的報文,目前支持的類型有cnfp、rpc、rtp、snmp、vat和wb。
表1給出了一些常用的Tcpdump命令行選項,使用這些選項可以過濾出真正感興趣的數(shù)據(jù)包。
使 用Tcpdump的命令行選項可以很方便地過濾出需要的數(shù)據(jù)包。例如,要過濾掉所有除ARP請求和應(yīng)答的通信數(shù)據(jù),可以輸入“tcpdump arp”命令。該命令只對ARP的請求和應(yīng)答信息進(jìn)行截獲,在Tcpdump的輸出信息中,請求是“arp who-has”這樣的條目,而應(yīng)答則是“arp reply”這樣的條目,如圖1所示。
圖1 ARP過濾
如果要做更多的處理,比如從指定的網(wǎng)絡(luò)接口截獲5個ARP數(shù)據(jù)包,并且不將網(wǎng)絡(luò)地址轉(zhuǎn)換成主機名,則可以用命令“tcpdump arp -i eth0 -c 5 -n”。
Tcpdump的過濾表達(dá)式
Tcpdump 的過濾表達(dá)式是一個正則表達(dá)式,Tcpdump利用其作為過濾數(shù)據(jù)包的條件。如果一個數(shù)據(jù)包滿足表達(dá)式的條件,則這個數(shù)據(jù)據(jù)包將會被捕獲;如果不指定表達(dá) 式,則在網(wǎng)絡(luò)上任何兩臺主機間的所有數(shù)據(jù)包都將被截獲。過濾表達(dá)式的作用就是使Tcpdump只輸出網(wǎng)絡(luò)管理員所需要的數(shù)據(jù),如一個指定的網(wǎng)絡(luò)接口和特定 主機間的IP數(shù)據(jù)包。
Tcpdump的過濾表達(dá)式中一般有如下幾種類型的關(guān)鍵字:
◆ 類型關(guān)鍵字
這 類關(guān)鍵字用于指定主機、網(wǎng)絡(luò)或端口,包括host、net和port三個關(guān)鍵字。例如,可以用“host 9.185.10.57”來標(biāo)明監(jiān)聽的主機;用“net 9.185.0.0”來標(biāo)明監(jiān)聽的網(wǎng)絡(luò);用“port 23”來標(biāo)明監(jiān)聽的端口。如果沒有在表達(dá)式中指明類型,則缺省的類型為host。
◆ 方向關(guān)鍵字
這類關(guān)鍵字用于指 定截獲的方向,包括dst、src、dst or src、dst and src四個關(guān)鍵字。例如,可以用src 9.185.10.57來指明截獲的數(shù)據(jù)包中的源主機地址;用“dst net 9.185.0.0”來指明截獲的數(shù)據(jù)包中的目標(biāo)網(wǎng)絡(luò)地址。如果沒有在表達(dá)式中指明方向,則缺省的方向為“dst or src”,即兩個方向的數(shù)據(jù)包都將被捕獲。對于數(shù)據(jù)鏈路層協(xié)議(如SLIP和PPP),使用inbound和outbound來定義方向。
◆ 協(xié)議關(guān)鍵字
這 類關(guān)鍵字用于指定要截獲的數(shù)據(jù)包所屬的協(xié)議,包括ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp和udp等關(guān)鍵字。 關(guān)鍵字fddi指明在FDDI(分布式光纖數(shù)據(jù)接口網(wǎng)絡(luò))上的特定網(wǎng)絡(luò)協(xié)議。實際上它是ether的別名。fddi和ether具有類似的源地址和目標(biāo)地 址,所以可以將fddi協(xié)議包當(dāng)作ether的包進(jìn)行分析和處理。其它幾個關(guān)鍵字只是指定了所要截獲的協(xié)議數(shù)據(jù)包。如果沒有在表達(dá)式中指明協(xié)議,則 Tcpdump會截獲所有協(xié)議的數(shù)據(jù)包。
除了上述三種類型的關(guān)鍵字外,Tcpdump的過濾表達(dá)式中還可以指定的一些重要關(guān)鍵字包括 gateway、broadcast、multicast、less、greater。這些關(guān)鍵字對于監(jiān)聽網(wǎng)絡(luò)中的廣播和多播很有幫助。關(guān)于這些關(guān)鍵字的 更多信息和用法請參考Tcpdump的man手冊。
在Tcpdump的過濾表達(dá)式中,各類關(guān)鍵字之間還可以通過布爾運算符來構(gòu)成組合 表達(dá)式,以滿足實際運用時的需要。布爾運算符包括取非運算符(not或!)、與運算符(and或&&)、或運算符(or或||),使用布 爾運算符可以將表達(dá)式組合起來構(gòu)成強大的組合條件,從而能夠?qū)cpdump的過濾器做進(jìn)一步細(xì)化。
下面給出幾個使用Tcpdump過濾數(shù)據(jù)包的例子,嗅探器提供的過濾表達(dá)式對于管理員監(jiān)測網(wǎng)絡(luò)運行狀況非常重要:
1. 如果想要截獲主機“9.185.10.57”所有收到和發(fā)出的數(shù)據(jù)包,可以使用如下命令:
# tcpdump host 9.185.10.57
2. 如果想要截獲在主機“9.185.10.57”和主機“9.185.10.58”或“9.185.10.59”之間傳遞的數(shù)據(jù)包,可以使用如下命令:
# tcpdump host 9.185.10.57 and \ >\(9.185.10.58 or 9.185.10.59\)
需要注意的是,在使用布爾運算符構(gòu)成組合表達(dá)式時,有時需要使用括號來表達(dá)復(fù)雜的邏輯關(guān)系。如果要在命令行中使用括號,一定要用轉(zhuǎn)義字符(“\”)對括號進(jìn)行轉(zhuǎn)義,否則命令行解釋器將給出語法錯誤的提示。
3. 如果想要截獲主機“9.185.10.57”和除主機“9.186.10.58”外所有其它主機之間通信的IP數(shù)據(jù)包,可以使用如下命令:
# tcpdump ip host 9.185.10.57 and ! 9.185.10.58
4. 如果想要截獲主機“9.185.10.57”接收或發(fā)出的FTP(端口號為21)數(shù)據(jù)包,可以使用如下命令:
# tcpdump tcp port 21 host 9.185.10.57
5. 如果懷疑系統(tǒng)正受到拒絕服務(wù)(DoS)攻擊,網(wǎng)絡(luò)管理員可以通過截獲發(fā)往本機的所有ICMP包,來確定目前是否有大量的ping指令流向服務(wù)器,此時就可以使用下面的命令:
# tcpdump icmp -n -i eth0 Tcpdump的輸出結(jié)果
在對網(wǎng)絡(luò)中的數(shù)據(jù)包進(jìn)行過濾后,Tcpdump的輸出結(jié)果中包含網(wǎng)絡(luò)管理員關(guān)心的網(wǎng)絡(luò)狀態(tài)信息。由于Tcpdump只是一個命令行方式的嗅探器,因而其輸出結(jié)果不是很直觀,下面以幾種典型的輸出信息為例,介紹如何對Tcpdump的輸出結(jié)果進(jìn)行分析。
1. 數(shù)據(jù)鏈路層頭信息
使用“tcpdump -e host tiger”命令截獲主機“tiger”所有發(fā)出和收到的數(shù)據(jù)包,并在輸出結(jié)果中包含數(shù)據(jù)鏈路層的頭部信息。
“tiger”是一臺裝有Linux的主機,其MAC地址是00:D0:59:BF:DA:06;“mag”是一臺裝有SCO Unix的工作站,其MAC地址是08:90:B0:2F:AF:46,上述命令的輸出結(jié)果如下:
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”為截獲數(shù)據(jù)包的時間,“735429”是毫秒數(shù),“eth0 <”表示從網(wǎng)絡(luò)接口eth0接收該數(shù)據(jù)包(若為“eth0 >”,則表示從網(wǎng)絡(luò)接口eth0發(fā)送數(shù)據(jù)包)。“08:90:b0:2f:af:46”是主機mag的MAC地址,指明發(fā)送該數(shù)據(jù)包的源主機為 “mag”,“00:d0:59:bf:da:06”是主機tiger的MAC地址,指明該數(shù)據(jù)包發(fā)送的目標(biāo)主機為“tiger”。“ip”表明該數(shù)據(jù)包 是IP數(shù)據(jù)包,“60”是數(shù)據(jù)包的長度,“mag.36579 > tiger.ftp”表明該數(shù)據(jù)包是從主機“mag”的36579端口發(fā)往主機“tiger”的FTP(21)端口。“ack 25565”表示對序列號為25565的包進(jìn)行確認(rèn),“win 8970”則指明發(fā)送窗口的大小為8760。
2. ARP包的輸出信息
若使用“tcpdump arp -c 2”命令截獲ARP數(shù)據(jù)包,得到的輸出結(jié)果可能是:
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”為截獲數(shù)據(jù)包的時間;“713502”和“713907”為毫秒數(shù);“eth0 >”表明從主機發(fā)出該數(shù)據(jù)包;“eth0 <”表明從主機接收該數(shù)據(jù)包。“arp”表明該數(shù)據(jù)包是ARP請求,“who-has mag tell tiger”表明是主機“tiger”請求主機“mag”的MAC地址,“00:d0:59:bf:da:06”是主機“tiger”的MAC地址。 “reply mag is-at”表明主機“mag”響應(yīng)“tiger”的ARP請求,“08:90:b0:2f:af:46”是主機“mag”的MAC地址。
3. TCP包的輸出信息
用Tcpdump截獲的TCP包的一般輸出格式如下:
src > dst: flags data-sequno ack window urgent options
“src > dst:”標(biāo)明從源地址到目的地址;flags是TCP包中的標(biāo)志信息,包括S(SYN)標(biāo)志、F(FIN)標(biāo)志、P(PUSH)標(biāo)志、R(RST)標(biāo)志 和“.”(沒有標(biāo)志);data-sequno是數(shù)據(jù)包中的數(shù)據(jù)序列號;ack是下次期望的數(shù)據(jù)序列號;window是接收緩存的窗口大??;urgent 標(biāo)明數(shù)據(jù)包中是否有緊急指針;options是可能的選項值。
4. UDP包的輸出信息
用Tcpdump截獲的UDP包的一般輸出格式如下:
src.port1 > dst.port2: udp lenth
UDP中包含的信息很簡單。上面的輸出結(jié)果表明從主機“src”的“port1”端口發(fā)出的一個UDP數(shù)據(jù)包被送到主機“dst”的“port2”端口,數(shù)據(jù)包的類型是UDP,其長度為“lenth”。
通 過上面的介紹可以知道,Tcpdump是一個命令行方式的嗅探器。它可以根據(jù)需要顯示出經(jīng)過一個網(wǎng)絡(luò)接口的所有數(shù)據(jù)包,供網(wǎng)絡(luò)管理員對網(wǎng)絡(luò)進(jìn)行檢測。但由 于采用的是命令行方式,對這些數(shù)據(jù)包的分析可能會比較困難。利用Tcpdump提供的表達(dá)式過濾一些截獲的數(shù)據(jù)包,可以從截獲的大量數(shù)據(jù)包中提取出有用的 信息,從而能夠有針對性地對網(wǎng)絡(luò)進(jìn)行監(jiān)測。
由于所有網(wǎng)絡(luò)嗅探器的原理都大體相似,因而Tcpdump的基本知識可以應(yīng)用于幾乎所有的 嗅探器。Tcpdump是基于命令行方式的嗅探器,其輸出結(jié)果比較難于分析,因此很多網(wǎng)絡(luò)管理員都使用圖形化的嗅探器來檢測網(wǎng)絡(luò)故障,并處理可能存在的安 全問題。下次將介紹兩個圖形化的網(wǎng)絡(luò)嗅探器—Ethereal和EhterApe。同Tcpdump相比,使用這兩個嗅探器的分析過程要簡單許多。(轉(zhuǎn))
|