學(xué)習(xí)一個(gè) Linux 命令:tcpdump 命令
轉(zhuǎn)自:戀貓大鯉魚
https://dablelv.blog.csdn.net/article/details/7158794
1.命令簡(jiǎn)介
tcpdump 是一款類 Unix/Linux 環(huán)境下的抓包工具,允許用戶截獲和顯示發(fā)送或收到的網(wǎng)絡(luò)數(shù)據(jù)包。tcpdump 是一個(gè)在 BSD 許可證下發(fā)布的自由軟件。
2.命令格式
tcpdump [ -AbdDefhlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
[ -C file_size ] [ -F file ] [ -G rotate_seconds ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ expression ]
3.選項(xiàng)說(shuō)明
-A
以 ASCII 碼方式顯示每一個(gè)數(shù)據(jù)包(不會(huì)顯示數(shù)據(jù)包中鏈路層頭部信息)。在抓取包含網(wǎng)頁(yè)數(shù)據(jù)的數(shù)據(jù)包時(shí),可方便查看數(shù)據(jù)
-b
用 ASDOT 符號(hào)而不是 ASPLAIN 符號(hào)在 BGP 數(shù)據(jù)包中打印 AS 號(hào)
-B, --buffer-size=BUFFER_SIZE
設(shè)置操作系統(tǒng)捕捉緩沖大小,單位 KB
-c [數(shù)據(jù)包數(shù)目]
收到指定的數(shù)據(jù)包數(shù)目后,就停止進(jìn)行捕獲操作
-C FILE_SIZE
與 -w FILE 選項(xiàng)配合使用。該選項(xiàng)使得 tcpdump 在把原始數(shù)據(jù)包直接保存到文件中之前,檢查此文件大小是否超過(guò) file-size。如果超過(guò)了,將關(guān)閉此文件,另創(chuàng)一個(gè)文件繼續(xù)保存原始數(shù)據(jù)包。新創(chuàng)建的文件名與 -w 選項(xiàng)指定的文件名一致, 但文件名后多了一個(gè)數(shù)字,該數(shù)字會(huì)從1開(kāi)始隨著新創(chuàng)建文件的增多而增加。file-size的單位是百萬(wàn)字節(jié)(nt: 這里指1,000,000個(gè)字節(jié),并非1,048,576個(gè)字節(jié), 后者是以1024字節(jié)為1k, 1024k字節(jié)為1M計(jì)算所得, 即1M=1024*1024 =1,048,576)
-d
把編譯過(guò)的數(shù)據(jù)包編碼轉(zhuǎn)換成可閱讀的格式,并傾倒到標(biāo)準(zhǔn)輸出
-dd
把編譯過(guò)的數(shù)據(jù)包編碼轉(zhuǎn)換成C語(yǔ)言的格式,并傾倒到標(biāo)準(zhǔn)輸出
-ddd
把編譯過(guò)的數(shù)據(jù)包編碼轉(zhuǎn)換成十進(jìn)制數(shù)字的格式,并傾倒到標(biāo)準(zhǔn)輸出
-D, --list-interfaces
打印系統(tǒng)中所有 tcpdump 可以在其上進(jìn)行抓包的網(wǎng)絡(luò)接口。每一個(gè)接口會(huì)打印出數(shù)字編號(hào), 相應(yīng)的接口名字, 以及一個(gè)可能的網(wǎng)絡(luò)接口描述。其中網(wǎng)絡(luò)接口名字和數(shù)字編號(hào)可以用在tcpdump的-i [flag]選項(xiàng)(nt:把名字或數(shù)字代替flag), 來(lái)指定要在其上抓包的網(wǎng)絡(luò)接口。此選項(xiàng)在不支持接口列表命令的系統(tǒng)上很有用(nt: 比如, Windows 系統(tǒng), 或缺乏 ifconfig -a 的UNIX系統(tǒng)); 接口的數(shù)字編號(hào)在windows 2000 或其后的系統(tǒng)中很有用, 因?yàn)檫@些系統(tǒng)上的接口名字比較復(fù)雜, 而不易使用。如果tcpdump編譯時(shí)所依賴的libpcap庫(kù)太老,-D 選項(xiàng)不會(huì)被支持, 因?yàn)槠渲腥狈?pcap_findalldevs()函數(shù)
-e
每行打印輸出中將包括數(shù)據(jù)包的數(shù)據(jù)鏈路層頭部信息
-f
顯示外部的IPv4地址時(shí)(nt:foreign IPv4 addresses, 可理解為非本機(jī)ip地址), 采用數(shù)字方式而不是名字。此選項(xiàng)是用來(lái)對(duì)付Sun公司的NIS服務(wù)器的缺陷(nt: NIS, 網(wǎng)絡(luò)信息服務(wù), tcpdump 顯示外部地址的名字時(shí)會(huì)用到它提供的名稱服務(wù)): 此NIS服務(wù)器在查詢非本地地址名字時(shí),常常會(huì)陷入無(wú)盡的查詢循環(huán))。由于對(duì)外部(foreign)IPv4地址的測(cè)試需要用到本地網(wǎng)絡(luò)接口(nt: tcpdump 抓包時(shí)用到的接口)及其IPv4 地址和網(wǎng)絡(luò)掩碼. 如果此地址或網(wǎng)絡(luò)掩碼不可用, 或者此接口根本就沒(méi)有設(shè)置相應(yīng)網(wǎng)絡(luò)地址和網(wǎng)絡(luò)掩碼(nt: linux 下的 'any' 網(wǎng)絡(luò)接口就不需要設(shè)置地址和掩碼, 不過(guò)此'any'接口可以收到系統(tǒng)中所有接口的數(shù)據(jù)包), 該選項(xiàng)不能正常工作。
-F FILE
使用file文件作為過(guò)濾條件表達(dá)式的輸入, 此時(shí)命令行上的輸入將被忽略
-G [rotate_seconds]
類似于-C [file_size]命令選項(xiàng),-C按文件大小來(lái)新建文件存儲(chǔ)數(shù)據(jù)包,-G則根據(jù)指定的時(shí)間周期,將監(jiān)聽(tīng)到的數(shù)據(jù)包寫入新的文件,新建的文件名由-w選項(xiàng)指定,并且文件名后接有時(shí)間串,時(shí)間串的格式由strftime(3)指定。如果沒(méi)有指定時(shí)間串的格式,新的文件將覆蓋舊的文件。如果與 -C 選項(xiàng)同時(shí)使用的話,文件名稱格式將是 file<count>。
-h,--help
打印tcpdump的幫助信息和libpcap的版本信息。(nt:libpcap是unix/linux平臺(tái)下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)包)
--version
打印 tcpdump 和 libpcap 的 version
-i [interface],--interface=interface
指定 tcpdump 需要監(jiān)聽(tīng)的接口。如果沒(méi)有指定,tcpdump 會(huì)從系統(tǒng)接口列表中搜尋編號(hào)最小的已配置好的接口(不包括 loopback 接口)。一但找到第一個(gè)符合條件的接口,搜尋馬上結(jié)束。
在采用2.2版本或之后版本內(nèi)核的Linux操作系統(tǒng)上, 'any'這個(gè)虛擬網(wǎng)絡(luò)接口可被用來(lái)接收所有網(wǎng)絡(luò)接口上的數(shù)據(jù)包(nt: 這會(huì)包括目的是該網(wǎng)絡(luò)接口的,也包括目的不是該網(wǎng)絡(luò)接口的)。需要注意的是如果真實(shí)網(wǎng)絡(luò)接口不能工作在'混雜模式'(promiscuous)下,則無(wú)法在'any'這個(gè)虛擬網(wǎng)絡(luò)接口上抓取其數(shù)據(jù)包。
如果 -D 標(biāo)志被指定,tcpdump會(huì)打印系統(tǒng)中的接口編號(hào),而該編號(hào)就可用于此處的 interface 參數(shù)
-l
對(duì)標(biāo)準(zhǔn)輸出進(jìn)行行緩沖(nt: 使標(biāo)準(zhǔn)輸出設(shè)備遇到一個(gè)換行符就馬上把這行的內(nèi)容打印出來(lái))
-L
列出指定網(wǎng)絡(luò)接口所支持的數(shù)據(jù)鏈路層的類型后退出.(nt: 指定接口通過(guò)-i 來(lái)指定)
-n
不把主機(jī)的網(wǎng)絡(luò)地址轉(zhuǎn)換成名字
-m MODULE
通過(guò) module 指定的 file 裝載 SMI 和 MIB 模塊(nt: SMI,Structure of Management Information, 管理信息結(jié)構(gòu);MIB, Management Information Base, 管理信息庫(kù)。可理解為,這兩者用于SNMP(Simple Network Management Protoco)協(xié)議數(shù)據(jù)包的抓取。具體SNMP 的工作原理未知, 另需補(bǔ)充)。
此選項(xiàng)可多次使用,從而為tcpdump裝載不同的MIB模塊
-M SECRET
如果 TCP 數(shù)據(jù)包(TCP segments)有TCP-MD5選項(xiàng)(在RFC 2385有相關(guān)描述), 則為其摘要的驗(yàn)證指定一個(gè)公共的密鑰 secret
-n
不將地址(比如主機(jī)地址、端口號(hào)等)轉(zhuǎn)換到對(duì)應(yīng)的名字
-N
不要打印主機(jī)名的域名資格,比如打印 nic 而不是 nic.ddn.mil
-O,--no-optimize
不啟用進(jìn)行包匹配時(shí)所用的優(yōu)化代碼. 當(dāng)懷疑某些bug是由優(yōu)化代碼引起的, 此選項(xiàng)將很有用
-p,--no-promiscuous-mode
把網(wǎng)絡(luò)接口設(shè)置為非'混雜'模式。但必須注意,在特殊情況下此網(wǎng)絡(luò)接口還是會(huì)以'混雜'模式來(lái)工作;從而 -p 的設(shè)與不設(shè),不能當(dāng)做以下選項(xiàng)的代名詞:'ether host {local-hw-add}'或'ether broadcast'(nt: 前者表示只匹配以太網(wǎng)地址為host的包, 后者表示匹配以太網(wǎng)地址為廣播地址的數(shù)據(jù)包
-q
快速打印輸出,即打印很少的協(xié)議相關(guān)信息,從而輸出行都比較簡(jiǎn)短
-r [file]
從指定的文件讀取數(shù)據(jù)包,如果 file 為 - 符號(hào), 則tcpdump會(huì)從標(biāo)準(zhǔn)輸入中讀取包數(shù)據(jù)
-R
設(shè)定tcpdump對(duì)ESP/AH數(shù)據(jù)包的解析按照RFC1825而不是RFC1829(nt:AH:認(rèn)證頭,ESP:安全負(fù)載封裝,這兩者會(huì)用在IP包的安全傳輸機(jī)制中)。如果此選項(xiàng)被設(shè)置,tcpdump將不會(huì)打印出'禁止中繼'域(nt: relay prevention field)。另外,由于ESP/AH規(guī)范中沒(méi)有規(guī)定ESP/AH數(shù)據(jù)包必須擁有協(xié)議版本號(hào)域,所以tcpdump不能從收到的ESP/AH數(shù)據(jù)包中推導(dǎo)出協(xié)議版本號(hào)
-s, --snapshot-length=SNAPLEN
設(shè)置 tcpdump 的數(shù)據(jù)包抓取長(zhǎng)度為 SNAPLEN,而不是默認(rèn)的 262144 字節(jié)。如果產(chǎn)生包截短這種情況, tcpdump的相應(yīng)打印輸出行中會(huì)出現(xiàn)''[|proto]''的標(biāo)志(proto 實(shí)際會(huì)顯示為被截短的數(shù)據(jù)包的相關(guān)協(xié)議層次). 需要注意的是, 采用長(zhǎng)的抓取長(zhǎng)度(nt: snaplen比較大), 會(huì)增加包的處理時(shí)間, 并且會(huì)減少tcpdump 可緩存的數(shù)據(jù)包的數(shù)量, 從而會(huì)導(dǎo)致數(shù)據(jù)包的丟失. 所以, 在能抓取我們想要的包的前提下, 抓取長(zhǎng)度越小越好。把snaplen 設(shè)置為0意味著讓tcpdump自動(dòng)選擇合適的長(zhǎng)度來(lái)抓取數(shù)據(jù)包
-S,--absolute-tcp-sequence-numbers
打印 TCP 數(shù)據(jù)包的順序號(hào)時(shí), 使用絕對(duì)的順序號(hào), 而不是相對(duì)的順序號(hào).(nt: 相對(duì)順序號(hào)可理解為, 相對(duì)第一個(gè)TCP 包順序號(hào)的差距,比如, 接受方收到第一個(gè)數(shù)據(jù)包的絕對(duì)順序號(hào)為232323, 對(duì)于后來(lái)接收到的第2個(gè),第3個(gè)數(shù)據(jù)包, tcpdump會(huì)打印其序列號(hào)為1, 2分別表示與第一個(gè)數(shù)據(jù)包的差距為1 和 2. 而如果此時(shí)-S 選項(xiàng)被設(shè)置, 對(duì)于后來(lái)接收到的第2個(gè), 第3個(gè)數(shù)據(jù)包會(huì)打印出其絕對(duì)順序號(hào):232324, 232325)
-t
在每行輸出中不打印時(shí)間戳
-tt
不對(duì)每行輸出的時(shí)間進(jìn)行格式處理(nt: 這種格式一眼可能看不出其含義, 如時(shí)間戳打印成1261798315)
-ttt
tcpdump 輸出時(shí), 每?jī)尚写蛴≈g會(huì)延遲一個(gè)段時(shí)間,單位毫秒
-tttt
在每行打印的時(shí)間戳之前添加日期的打印
-ttttt
設(shè)置每一行輸出時(shí)相對(duì)于第一行的時(shí)間間隔,單位毫秒
-T TYPE
強(qiáng)制 tcpdump 按 type 指定的協(xié)議所描述的包結(jié)構(gòu)來(lái)分析收到的數(shù)據(jù)包。目前已知的type可取的協(xié)議為:
(1)aodv(Ad-hoc On-demand Distance Vector protocol, 按需距離向量路由協(xié)議, 在Ad hoc(點(diǎn)對(duì)點(diǎn)模式)網(wǎng)絡(luò)中使用);
(2)cnfp(Cisco NetFlow protocol);
(3)rpc(Remote Procedure Call);
(4)rtp(Real-Time Applications protocol);
(5)rtcp(Real-Time Applications con-trol protocol);
(6)snmp(Simple Network Management Protocol);
(7)tftp(Trivial File Transfer Protocol, 碎文件協(xié)議);
(8)vat(Visual Audio Tool,可用于在internet上進(jìn)行電視電話會(huì)議的應(yīng)用層協(xié)議), 以及wb(distributed White Board,可用于網(wǎng)絡(luò)會(huì)議的應(yīng)用層協(xié)議)
-u
打印出未加密的 NFS 句柄(nt:handle可理解為NFS中使用的文件句柄, 這將包括文件夾和文件夾中的文件)
-U
使得當(dāng) tcpdump 在使用 -w 選項(xiàng)時(shí),其文件寫入與包的保存同步。(nt:即當(dāng)每個(gè)數(shù)據(jù)包被保存時(shí), 它將及時(shí)被寫入文件中,而不是等文件的輸出緩沖已滿時(shí)才真正寫入此文件)。-U標(biāo)志在老版本的libpcap庫(kù)(nt:tcpdump所依賴的報(bào)文捕獲庫(kù))上不起作用, 因?yàn)槠渲腥狈cap_cump_flush()函數(shù)
-v
產(chǎn)生詳細(xì)的輸出。比如包的生存時(shí)間、標(biāo)識(shí)、總長(zhǎng)度以及IP包的一些選項(xiàng)。這也會(huì)打開(kāi)一些附加的包完整性檢測(cè), 比如對(duì)IP或ICMP包頭部的校驗(yàn)和
-vv
產(chǎn)生比-v更詳細(xì)的輸出。比如NFS(Network File System)回應(yīng)包中的附加域?qū)?huì)被打印,SMB(Server Message Block)數(shù)據(jù)包也會(huì)被完全解碼
-vvv
更詳細(xì)的輸出。例如,telent時(shí)所使用的SB,SE選項(xiàng)將會(huì)被打印, 如果telnet同時(shí)使用-X圖形界面選項(xiàng),其相應(yīng)的圖形選項(xiàng)將會(huì)以16進(jìn)制的方式打印出。
-w FILE
把包數(shù)據(jù)直接寫入文件而不進(jìn)行分析和打印輸出,這些包數(shù)據(jù)可在隨后通過(guò)-r選項(xiàng)來(lái)重新讀入并進(jìn)行分析和打印
-W FILECOUNT
此選項(xiàng)與 -C 選項(xiàng)配合使用,這將限制可打開(kāi)的文件數(shù)目, 并且當(dāng)文件數(shù)據(jù)超過(guò)這里設(shè)置的限制時(shí), 依次循環(huán)替代之前的文件, 這相當(dāng)于一個(gè)擁有filecount 個(gè)文件的文件緩沖池。同時(shí),該選項(xiàng)會(huì)使得每個(gè)文件名的開(kāi)頭會(huì)出現(xiàn)足夠多并用來(lái)占位的0,可以方便這些文件被正確的排序
-x:打印每個(gè)包的頭部數(shù)據(jù), 同時(shí)會(huì)以16進(jìn)制打印出每個(gè)包的數(shù)據(jù)(但不包括連接層的頭部),總共打印的數(shù)據(jù)大小不會(huì)超過(guò)整個(gè)數(shù)據(jù)包的大小與snaplen 中的最小值。必須要注意的是, 如果高層協(xié)議數(shù)據(jù)沒(méi)有snaplen這么長(zhǎng),并且數(shù)據(jù)鏈路層(比如,Ethernet層)有填充數(shù)據(jù), 則這些填充數(shù)據(jù)也會(huì)被打印
-xx:打印每個(gè)包的頭部數(shù)據(jù), 同時(shí)會(huì)以16進(jìn)制打印出每個(gè)包的數(shù)據(jù), 其中包括數(shù)據(jù)鏈路層的頭部
-X:當(dāng)分析和打印時(shí), tcpdump會(huì)打印每個(gè)包的頭部數(shù)據(jù),同時(shí)會(huì)以16進(jìn)制和ASCII碼形式打印出每個(gè)包的數(shù)據(jù)(但不包括鏈路層的頭部)。這對(duì)于分析一些新協(xié)議的數(shù)據(jù)包很方便
-XX:當(dāng)分析和打印時(shí),tcpdump會(huì)打印每個(gè)包的頭部數(shù)據(jù),同時(shí)會(huì)以16進(jìn)制和ASCII碼形式打印出每個(gè)包的數(shù)據(jù), 其中包括數(shù)據(jù)鏈路層的頭部.這對(duì)于分析一些新協(xié)議的數(shù)據(jù)包很方便
-y [datalinktype],--linktype=datalinktype:設(shè)置tcpdump只捕獲數(shù)據(jù)鏈路層協(xié)議類型是datalinktype的數(shù)據(jù)包
-z [postrotate-command]:與-C或-G聯(lián)用,當(dāng)每一個(gè)文件被關(guān)閉時(shí)執(zhí)行命令postrotate-command。比如,-z gzip或-z bzip2將對(duì)每一個(gè)保存的文件進(jìn)行壓縮
-Z , --relinquish-privileges=USER
使 tcpdump 放棄自己的超級(jí)權(quán)限(如果以 root 用戶啟動(dòng) tcpdump,tcpdump 將會(huì)有超級(jí)用戶權(quán)限),并把當(dāng)前 tcpdump 的用戶 ID 設(shè)置為 USER,組 ID 設(shè)置為 USER 屬組的 ID
expression
條件表達(dá)式用于選擇捕獲符合條件的數(shù)據(jù)包,無(wú) expression,網(wǎng)絡(luò)上任何兩臺(tái)主機(jī)間的所有數(shù)據(jù)包都將被截獲
4.常用示例
4.1 監(jiān)視指定主機(jī)的數(shù)據(jù)包
(1)打印所有到達(dá)或從主機(jī) sunrise 發(fā)出的數(shù)據(jù)包,host 可以是 IP 地址或主機(jī)名。
tcpdump host sunrise
(2)打印主機(jī) A 與 B 或 C 之間來(lái)往的所有數(shù)據(jù)包。
tcpdump host A and \( B or C \)
(3)打印 ace 與任何其他主機(jī)之間通信的 IP 數(shù)據(jù)包,但不包括與 helios 之間的數(shù)據(jù)包.
tcpdump ip host ace and not helios
4.2 監(jiān)視指定網(wǎng)絡(luò)的數(shù)據(jù)包
(1)打印本地主機(jī)與 Berkeley 網(wǎng)絡(luò)上的主機(jī)之間的所有通信數(shù)據(jù)包。
tcpdump net ucb-ether
(2)打印所有通過(guò)網(wǎng)關(guān) snup 的 ftp 數(shù)據(jù)包。注意,表達(dá)式被單引號(hào)括起來(lái)了,這可以防止 Shell 對(duì)其中的括號(hào)進(jìn)行錯(cuò)誤解析。
tcpdump 'gateway snup and (port ftp or ftp-data)'
(3)打印不是本地網(wǎng)絡(luò)的數(shù)據(jù)包。
tcpdump ip and not net localnet
4.3 監(jiān)視指定協(xié)議的數(shù)據(jù)包
(1)打印 TCP 會(huì)話中的的開(kāi)始和結(jié)束數(shù)據(jù)包,并且數(shù)據(jù)包的源或目的不是本地網(wǎng)絡(luò)上的主機(jī)。(nt:localnet,實(shí)際使用時(shí)要真正替換成本地網(wǎng)絡(luò)的名字)
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
(2)打印長(zhǎng)度超過(guò) 576 字節(jié),并且網(wǎng)關(guān)地址是 snup 的 IP 數(shù)據(jù)包。
tcpdump 'gateway snup and ip[2:2] > 576'
ip[2:2] 表示整個(gè) IP 數(shù)據(jù)包的長(zhǎng)度。
(3)打印除’echo request’或者’echo reply’類型以外的 ICMP 數(shù)據(jù)包(比如,需要打印所有非 ping 程序產(chǎn)生的數(shù)據(jù)包時(shí)可用到此表達(dá)式 。(nt: ‘echo reuqest’ 與 ‘echo reply’ 這兩種類型的 ICMP 數(shù)據(jù)包通常由 ping 程序產(chǎn)生)
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
4.4 監(jiān)視指定主機(jī)和端口的數(shù)據(jù)包
(1)抓取主機(jī) 100.94.138.110 所有經(jīng)由接口 eth1 接收的數(shù)據(jù)包,且端口號(hào)是20700。
tcpdump -i eth1 -lnXps0 dst 100.94.138.110 and dst port 20700 -c 10
命令選項(xiàng)說(shuō)明:lnXps0 請(qǐng)參照上文的命令選項(xiàng)詳解,-c 10 表示只捕捉 10 個(gè)數(shù)據(jù)包。
參考文檔
[1] tcpdump manual
[2] 維基百科.tcpdump
[3] tcpdump官方網(wǎng)站
[4] Linux tcpdump命令詳解


