天天看點

tcpdump簡介

簡介:

tcpdump全稱:dump the traffic on a network,根據使用者的定義對網絡上的資料包進行截獲的包分析工具。 tcpdump可以将網絡中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網絡層、協定、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的資訊。

名稱:

tcpdump -  dump traffic on a network(轉儲網絡上的流量);

描述:

Tcpdump列印出一個與布爾表達式比對的網絡接口上資料包内容的描述。它也可以用-w标志運作,這會導緻它将分組資料儲存到一個檔案中供以後分析,和/或使用-r标志,這會導緻它從儲存的分組檔案中讀取,而不是讀取分組從網絡界面。在任何情況下,隻有比對表達式的資料包才會被tcpdump處理。

如果Tcpdump沒有運作-c标志,它将繼續捕獲資料包,直到它被一個SIGINT信号(例如,通過輸入中斷字元,通常為control-C)或一個SIGTERM信号(通常由kill(1)指令); 如果使用-c 标志運作,它将捕獲資料包,直到它被SIGINT或SIGTERM信号中斷或指定的資料包已被處理。

當tcpdump完成捕獲包時,它會報告計數:

  • 資料包“捕獲”(這是tcpdump接收和處理的資料包數量);
  • (這個意思取決于你正在運作tcpdump的作業系統,可能在作業系統的配置方式上 - 如果在指令行中指定了某個過濾器,則在某些作業系統上無論它們是否與過濾器表達式比對,即使它們與過濾器表達式比對,無論tcpdump是否已經讀取并處理它們,在其他OS上,它都隻計算由過濾器表達式比對的資料包,而不管tcpdump是否已經讀取并處理了它們,而在其他作業系統上,它隻計算由過濾器表達式比對并由tcpdump處理的資料包;
  • 資料包“由核心丢棄”(如果作業系統将該資訊報告給應用程式,則這是由于運作tcpdump的作業系統中的資料包捕獲機制,由于缺少緩沖區空間而丢棄的資料包數量;如果不是,則報告為0)。

在支援SIGINFO信号的平台上,例如大多數BSD(包括Mac OS X)和Digital / Tru64 UNIX,它會在接收到SIGINFO信号(例如,通過輸入“狀态”字元,通常是control-T,盡管在一些平台上,比如Mac OS X,“status”字元預設沒有設定,是以你必須使用stty(1)來設定它),并且将繼續捕獲資料包。

從網絡接口讀取資料包可能需要您有特殊的權限; 有關詳細資訊,請參閱pcap(3PCAP)手冊頁。讀取儲存的資料封包件不需要特殊的權限。

用法:

tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -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 postrotate-command ] [ -Z user ] [ expression ]      

tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c 計數 ]
[ -C file_size ] [ -G rotate_seconds ] [ -F 檔案 ]
[ -i 界面 ] [ -m 子產品 ] [ -M 秘密 ]
[ -r 檔案 ] [ -s snaplen ] [ -T 類型 ] [ -w 檔案 ]
[ -W filecount ]
[ -E spi @ ipaddr算法:秘密,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z 使用者 ] [ 表達式 ]      

選項:

-A     在ASCII中列印每個資料包(減去其連結級别标題)。友善捕捉網頁。

-B     将作業系統捕獲緩沖區大小設定為buffer_size。

-c     收到計數包後退出。

-C     在将一個原始資料包寫入一個儲存檔案之前,檢查該檔案目前是否大于file_size,如果是,關閉目前的儲存檔案并打開一個新檔案。第一個儲存檔案後的儲存檔案将具有用-w标志指定的名稱,後面跟着一個數字,從1開始并繼續向上。file_size的機關是數百萬位元組(1,000,000位元組,而不是1,048,576位元組)。請注意,與-Z選項(預設情況下啟用)一起使用時,在打開第一個savefile之前會删除權限。

-d     将已編譯的資料包比對代碼以可讀的形式轉儲到标準輸出并停止。

-dd     将資料包比對代碼轉儲為C程式片段。

-ddd     将資料包比對代碼轉儲為十進制數(以count開頭)。

-D     列印系統上可用的網絡接口清單以及哪個tcpdump可以捕獲資料包。對于每個網絡接口,都會列印一個編号和一個接口名稱(可能後跟接口的文本描述)。可以将接口名稱或編号提供給-i标志以指定要捕獲的接口。這對于沒有指令列出的系統是有用的(例如,Windows系統,或缺少ifconfig -a的 UNIX系統); 在Windows 2000和更高版本的系統中,該接口名稱是一個有點複雜的字元串。該-D如果标志将不被支援的tcpdump與舊版本的内置的libpcap缺少該函數pcap_findalldevs() 函數。

-e     在每個轉儲線上列印連結級别标題。

-E     使用spi @ ipaddr algo:secret來解密尋址到addr并包含安全參數索引值spi的 IPsec ESP資料包。這種組合可以用逗号或換行符來重複。

  • 請注意,目前支援為IPv4 ESP資料包設定密碼。
  • 算法可能是des-cbc,3des-cbc,blowfish-cbc,rc3-cbc,cast128-cbc,或者沒有。預設值是des-cbc。解密資料包的能力隻有在使用加密技術編譯tcpdump時才存在。
  • 秘密是ESP密鑰的ASCII文本。如果前面有0x,那麼将讀取一個十六進制值。
  • 該選項采用RFC2406 ESP,而不是RFC1827 ESP。該選項僅用于調試目的,并且不鼓勵使用具有真“秘密”密鑰的該選項。通過在指令行上顯示IPsec密鑰,您可以通過ps(1)和其他場合使其他人看到它。
  • 除了上面的文法之外,文法檔案名可以用來讓tcpdump讀取提供的檔案。檔案在接收到第一個ESP資料包時打開,是以tcpdump可能已經被賦予的任何特殊權限應該已經被放棄了。

-f     列印'外國'的IPv4位址數字而不是象征性的(這個選項是為了解決Sun的NIS伺服器嚴重的腦損傷 - 通常它會永久性地翻譯非本地的網際網路号碼)。

  • 對“外部”IPv4位址的測試使用捕獲正在進行的接口的IPv4位址和網絡掩碼完成。如果該位址或網絡掩碼不可用,則可能是因為要執行捕獲的接口沒有位址或網絡掩碼,或者因為捕獲是在可以在多個接口上捕獲的Linux“any”接口上完成的,此選項将無法正常工作。

-F     使用檔案作為過濾器表達式的輸入。在指令行上給出的附加表達式将被忽略。

-G     如果指定,則每rotate_seconds秒旋轉使用-w選項指定的轉儲檔案。儲存檔案将具有由-w指定的名稱,該名稱 應包含由strftime(3)定義的時間格式。如果沒有指定時間格式,則每個新檔案都将覆寫前一個。如果與-C選項一起使用,則檔案名将采用“ file <count>”的形式。

-i     在界面上聽。如果未指定,則tcpdump将在系統接口清單中搜尋編号最小的已配置接口(不包括環回)。選擇最早的比賽會打破關系。

  • 在具有2.2或更高版本核心的Linux系統上,可以使用“any” 接口參數來捕獲所有接口的資料包。請注意,“任何”裝置上的捕捉不會在混雜模式下進行。
  • 如果支援-D标志,那麼由該标志列印的接口号可以用作接口參數。

-I     将界面置于“監視模式”; 這僅在IEEE 802.11 Wi-Fi接口上受支援,并且僅在某些作業系統上受支援。

  • 請注意,在螢幕模式下,擴充卡可能會與其關聯的網絡分離,是以您将無法使用該擴充卡使用任何無線網絡。這可能會阻止通路網絡伺服器上的檔案,或者解決主機名或網絡位址(如果您正在監視模式下進行捕獲并且沒有用另一個擴充卡連接配接到另一個網絡)。
  • 這個标志會影響-L标志的輸出。如果未指定-I,則隻顯示不處于監視模式的可用鍊路層類型; 如果指定-I,則隻顯示在監視模式下可用的鍊路層類型。

-K     不要試圖驗證IP,TCP或UDP校驗和。這對于在硬體中執行部分或全部這些校驗和計算的接口非常有用; 否則,所有傳出的TCP校驗和将被标記為壞。

-l     使stdout行緩沖。如果您希望在捕獲資料的同時檢視資料,則這很有用。例如:

tcpdump -l | tee dat'' or ''tcpdump -l > dat & tail -f dat      

-L     在指定的模式下列出接口的已知資料鍊路類型,然後退出。已知資料連結類型的清單可以取決于指定的模式; 例如,在某些平台上,當不處于監控模式時,Wi-Fi接口可能支援一組資料鍊路類型(例如,它可能僅支援僞造的以太網報頭,或者可能支援802.11報頭但不支援具有無線電資訊的802.11報頭)和另一組資料鍊路類型(例如,它可能支援802.11報頭,或802.11報頭,隻有在監測模式下才有無線電資訊)。

-m     從檔案子產品加載SMI MIB子產品定義。這個選項可以多次使用,将幾個MIB子產品加載到tcpdump中。

-M     使用secret作為共享密鑰,用于通過TCP-MD5選項(RFC 2385)驗證TCP段中發現的摘要(如果存在)。

-n     不要将主機位址轉換為名稱。這可以用來避免DNS查找。

-NN     不要将協定和端口号等轉換為名稱。

-N     不要列印主機名的域名限定。例如,如果你給這個标志,那麼tcpdump将列印“nic”而不是“nic.ddn.mil”。

-O     不要運作資料包比對代碼優化器。隻有當您懷疑優化器中存在錯誤時,這才是有用的。

-p     不要把界面變成混雜模式。請注意,由于某些其他原因,接口可能處于混雜模式; 是以'-p'不能用作'ether host {local-hw-addr}或ether broadcast'的縮寫。

-q     快(安靜?)輸出。列印較少的協定資訊,是以輸出行較短。

-R     假設ESP / AH資料包基于舊規範(RFC1825至RFC1829)。如果指定,tcpdump将不會列印重播預防字段。由于ESP / AH規範中沒有協定版本字段,是以tcpdump無法推導出ESP / AH協定的版本。

-r     從檔案中讀取資料包(使用-w選項建立)。如果檔案是“ - ”,則使用标準輸入。

-S     列印絕對的,而不是相對的TCP序列号。

-s     SNARF snaplen有從每個分組而不是65535個位元組的預設資料的位元組。由于快照有限而截斷的資料包在輸出中用''[|表示 proto ]'',其中proto是發生截斷的協定級别的名稱。請注意,采用較大的快照既增加了處理資料包所需的時間,也有效地減少了資料包緩沖的數量。這可能會導緻資料包丢失。您應該将snaplen限制為捕獲您感興趣的協定資訊的最小數目。将snaplen設定為0會将其設定為預設值65535,以便與最近較早版本的tcpdump向後相容。

-T     由“ 表達式 ” 選擇的強制資料包被解釋為指定的類型。目前已知的類型是aodv(Ad-hoc按需距離矢量協定),cnfp(Cisco NetFlow協定),rpc(遠端過程調用),rtp(實時應用協定),rtcp (實時應用控制協定)snmp(簡單網絡管理協定),tftp(普通檔案傳輸協定),vat(視訊音頻工具)和wb(分布式白闆)。

-t     不要在每個轉儲線上列印時間戳。

-tt    在每個轉儲線上列印未格式化的時間戳。

-ttt     在每個轉儲線上列印目前行和前一行之間的增量(微秒分辨率)。

-tttt     在每個轉儲線上列印預設格式的時間戳,并按日期列印。

-ttttt     在每個轉儲線上列印目前行和第一行之間的增量(微秒分辨率)。

-u     列印未解碼的NFS句柄。

-U     通過-w選項“packet-buffered” 儲存輸出; 即當每個資料包被儲存時,它将被寫入輸出檔案,而不是僅在輸出緩沖器填充時被寫入。該-U如果标志将不被支援的tcpdump與舊版本的内置的libpcap是缺乏pcap_dump_flush() 函數。

-v     解析和列印時,産生(略多)詳細的輸出。例如,列印IP包中的生存時間,辨別,總長度和選項。還啟用額外的資料包完整性檢查,例如驗證IP和ICMP頭校驗和。使用-w選項寫入檔案時,請每隔10秒報告捕獲的資料包數量。

-vv     更詳細的輸出。例如,從NFS回複資料包列印附加字段,SMB資料包完全解碼。

-vvv     更詳細的輸出。例如,telnet SB ... SE選項全部列印。使用-X Telnet選項也以十六進制列印。

-w     将原始資料包寫入檔案,而不是解析并列印出來。他們以後可以用-r選項列印。如果檔案是“ - ”,則使用标準輸出 。有關檔案格式的說明,請參閱pcap-savefile(5)。

-W     與-C選項一起使用時,這會将建立的檔案數量限制為指定的數字,并從頭開始覆寫檔案,進而建立“旋轉”緩沖區。另外,它将命名帶有足夠前導0的檔案以支援最大數量的檔案,使它們能夠正确排序。與-G選項一起使用時,這将限制建立的旋轉轉儲檔案的數量,在達到限制時以狀态0退出。如果與-C一起使用,則行為将導緻每個時間片的循環檔案。

-X     解析和列印時,除了列印每個資料包的标題外,還要以十六進制格式列印每個資料包的資料(減去其連結級别标題)。整個資料包或snaplen位元組中的較小者将被列印。請注意,這是整個鍊路層資料包,是以對于填充的鍊路層(例如以太網),當高層資料包比所需的填充資料更短時,也會列印填充位元組。

-xx     解析和列印時,除了列印每個資料包的标題外,還要以十六進制格式列印每個資料包的資料,包括其連結級别标題。

-X     解析和列印時,除了列印每個資料包的标題之外,還要以十六進制和ASCII格式列印每個資料包的資料(減去其連結級别标題)。這對分析新協定非常友善。

-XX     解析和列印時,除列印每個資料包的标題外,還要以十六進制和ASCII格式列印每個資料包的資料,包括其連結級别标題。

-y     設定資料鍊路類型,而捕捉包中使用datalinktype。

-z     與-C或-G選項一起使用,這将使tcpdump運作“ 指令檔案 ”,其中檔案是每次旋轉後關閉的儲存檔案。例如,指定-z gzip或-z bzip2将使用gzip或bzip2壓縮每個儲存檔案。

  • 請注意,tcpdump将與捕獲并行地運作指令,使用最低優先級,這樣不會幹擾捕獲過程。
  • 如果你想使用一個本身帶有标志或不同參數的指令,你總是可以編寫一個shell腳本,将savefile的名字作為唯一的參數,使标志和參數安排并執行你想要的指令。

-Z     删除權限(如果是root)并将使用者辨別更改為使用者,将組辨別更改為主要使用者組。這種行為預設是啟用的(-Z tcpdump),可以通過-Z root來禁用。

表達

  • 選擇将要轉儲的資料包。如果沒有給出表達式,網絡上的所有資料包将被轉儲。否則,隻有表達式為“真”的資料包 才會被丢棄。
  • 有關表達式文法,請參閱pcap-filter(7)。
  • 可以将表達式參數作為單個參數或多個參數傳遞給tcpdump,以較友善的方式傳遞。通常,如果表達式包含Shell元字元,則将其作為單引号引用傳遞會更容易。在分析之前,多個參數與空格連接配接。

示例:

1、列印所有到達或離開sundown的資料包:

tcpdump host sundown      

2、列印helios和hot或ace之間的流量:

tcpdump host helios and \( hot or ace \)      

3、要在ace和除helios之外的任何主機之間列印所有IP資料包:

tcpdump ip host ace and not helios      

4、列印本地主機和Berkeley(伯克利)主機之間的所有流量:

tcpdump net ucb-ether      

5、要通過Internet網關snup列印所有的ftp流量:(注意表達式被引用來防止shell(錯誤)解釋括号):

tcpdump 'gateway snup and (port ftp or ftp-data)'      

6、要列印既不是來自本地主機也不是本地主機的流量(如果你是通往另一個網絡的話,這些東西不應該放到本地網上)。

tcpdump ip and not net localnet      

7、列印涉及非本地主機的每個TCP會話的開始和結束資料包(SYN和FIN資料包)。

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'      

8、列印所有來自端口80的HTTP HTTP資料包,即僅列印包含資料的資料包,而不列印例如SYN和FIN資料包以及ACK資料包。(IPv6是留給讀者的一個練習。)

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'      

9、列印通過網關snup發送的長度超過576位元組的IP資料包:

tcpdump 'gateway snup and ip[2:2] > 576'      

10、要列印未經以太網廣播或多點傳播發送的IP廣播或多點傳播資料包:

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'      

11、要列印所有不是回應要求/回複的ICMP資料包(即不能ping資料包):

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'      

一、預設啟動

tcpdump      

普通情況下,直接啟動tcpdump将監視第一個網絡接口上所有流過的資料包。

二、監視指定網絡接口的資料包

tcpdump -i eth1      

如果不指定網卡,預設tcpdump隻會監視第一個網絡接口,一般是eth0,下面的例子都沒有指定網絡接口。

三、監視指定主機的資料包

列印所有進入或離開sundown的資料包.

tcpdump host sundown      

也可以指定ip,例如截獲所有192.168.1.120 的主機收到的和發出的所有的資料包

tcpdump host 192.168.1.120      

列印helios 與 hot 或者與 ace 之間通信的資料包

tcpdump host helios and \( hot or ace \)      

截獲主機210.27.48.120 和主機192.168.1.110或192.168.1.100的通信

tcpdump host 192.168.1.120 and \ (192.168.1.110 or 192.168.1.100 \)      

列印ace與任何其他主機之間通信的IP 資料包, 但不包括與helios之間的資料包.

tcpdump ip host ace and not helios      

如果想要擷取主機192.168.1.120除了和主機192.168.1.110之外所有主機通信的ip包,使用指令:

tcpdump ip host 192.168.1.120 and ! 192.168.1.110      

截獲主機hostname發送的所有資料

tcpdump -i eth0 src host hostname      

監視所有送到主機hostname的資料包

tcpdump -i eth0 dst host hostname      

四、監視指定主機和端口的資料包

如果想要擷取主機192.168.1.120接收或發出的telnet包,使用如下指令

tcpdump tcp port 23 and host 192.168.1.120      

對本機的udp 123 端口進行監視 123 為ntp的服務端口

tcpdump udp port 123      

五、監視指定網絡的資料包

列印本地主機與Berkeley網絡上的主機之間的所有通信資料包(nt: ucb-ether, 此處可了解為'Berkeley網絡'的網絡位址,此表達式最原始的含義可表達為: 列印網絡位址為ucb-ether的所有資料包)

tcpdump net ucb-ether      

列印所有通過網關snup的ftp資料包(注意, 表達式被單引号括起來了, 這可以防止shell對其中的括号進行錯誤解析)

tcpdump 'gateway snup and (port ftp or ftp-data)'      

列印所有源位址或目标位址是本地主機的IP資料包(如果本地網絡通過網關連到了另一網絡, 則另一網絡并不能算作本地網絡.(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網絡的名字)

tcpdump ip and not net localnet      

六、監視指定協定的資料包

列印TCP會話中的的開始和結束資料包, 并且資料包的源或目的不是本地網絡上的主機.(nt: localnet, 實際使用時要真正替換成本地網絡的名字))

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'      

列印所有源或目的端口是80, 網絡層協定為IPv4, 并且含有資料,而不是SYN,FIN以及ACK-only等不含資料的資料包.(ipv6的版本的表達式可做練習)

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'      

(nt: 可了解為, ip[2:2]表示整個ip資料包的長度, (ip[0]&0xf)<<2)表示ip資料包標頭的長度(ip[0]&0xf代表包中的IHL域, 而此域的機關為32bit, 要換算成位元組數需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp頭的長度, 此域的機關也是32bit, 換算成比特數為 ((tcp[12]&0xf0) >> 4) << 2, 即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整個ip資料包的長度減去ip頭的長度,再減去tcp頭的長度不為0, 這就意味着, ip資料包中确實是有資料.對于ipv6版本隻需考慮ipv6頭中的'Payload Length' 與 'tcp頭的長度'的內插補點, 并且其中表達方式'ip[]'需換成'ip6[]'.)

列印長度超過576位元組, 并且網關位址是snup的IP資料包

tcpdump 'gateway snup and ip[2:2] > 576'      

列印所有IP層廣播或多點傳播的資料包, 但不是實體以太網層的廣播或多點傳播資料報

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'      

列印除'echo request'或者'echo reply'類型以外的ICMP資料包( 比如,需要列印所有非ping 程式産生的資料包時可用到此表達式 .(nt: 'echo reuqest' 與 'echo reply' 這兩種類型的ICMP資料包通常由ping程式産生))

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'      

七、使用tcpdump抓取HTTP包

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854      

0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"。

tcpdump 對截獲的資料并沒有進行徹底解碼,資料包内的大部分内容是使用十六進制的形式直接列印輸出的。顯然這不利于分析網絡故障,通常的解決辦法是先使用帶-w參數的tcpdump 截獲資料并儲存到檔案中,然後再使用其他程式(如Wireshark)進行解碼分析。當然也應該定義過濾規則,以避免捕獲的資料包填滿整個硬碟。

tcpdump 與wireshark

Wireshark(以前是ethereal)是Windows下非常簡單易用的抓包工具。但在Linux下很難找到一個好用的圖形化抓包工具。還好有Tcpdump。我們可以用Tcpdump + Wireshark 的完美組合實作:在 Linux 裡抓包,然後在Windows 裡分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap      

1、tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾資料報的類型

2、-i eth1 : 隻抓經過接口eth1的包

3、-t : 不顯示時間戳

4、-s 0 : 抓取資料包時預設抓取長度為68位元組。加上-S 0 後可以抓到完整的資料包

5、-c 100 : 隻抓取100個資料包

6、dst port ! 22 : 不抓取目标端口是22的資料包

7、src net 192.168.1.0/24 : 資料包的源網絡位址為192.168.1.0/24

8、-w ./target.cap : 儲存成cap檔案,友善用wireshark分析

輸出格式

tcpdump的輸出是依賴于協定的。以下給出了大多數格式的簡要說明和示例。

連結級别Headers

如果給出'-e'選項,則連結級别标題被列印出來。在以太網上,列印源和目标位址,協定和資料包長度。

在FDDI網絡上,“-e”選項使tcpdump列印“幀控制”字段,源位址和目标位址以及資料包長度。(“幀控制”字段管理對資料包其餘部分的解釋,普通資料包(如包含IP資料報的資料包)是'異步'資料包,優先級值在0到7之間;例如' async4 '。假設資料包包含802.2邏輯鍊路控制(LLC)資料包;如果LLC資料包不是 ISO資料報或所謂的SNAP資料包,則會列印LLC标頭。

在令牌環網絡上,“-e”選項使tcpdump列印“通路控制”和“幀控制”字段,源位址和目标位址以及資料包長度。與在FDDI網絡上一樣,假設資料包含有LLC資料包。無論指定了“-e”選項,源路由資訊都将列印為源路由資料包。

在802.11網絡上,“-e”選項使tcpdump列印出“幀控制”字段,802.11報頭中的所有位址和資料包長度。與在FDDI網絡上一樣,假設資料包含有LLC資料包。

(注意:以下描述假定熟悉RFC-1144中描述的SLIP壓縮算法。)

在SLIP連結上,列印出一個方向訓示符(“入站”I“,出站”O“),資料包類型和壓縮資訊。資料包類型是首先列印的。這三種類型是ip,utcp和ctcp。沒有進一步的連結資訊列印ip資料包。對于TCP資料包,連接配接辨別符将按照類型列印。如果資料包是壓縮的,它的編碼頭被列印出來。特殊情況列印為 * S + n和* SA + n,其中n是序列号(或序列号和ack)已經改變的量。如果不是特例,則列印零個或多個更改。W(視窗),A(ack),S(序列号)和I(分組ID)訓示改變,接着是增量(+ n或-n)或新值(= N)。最後列印資料包中的資料量和壓縮的标題長度。

例如,下面的行顯示了一個帶有隐式連接配接辨別符的出站壓縮TCP資料包; ack改變了6,序列号改變了49,資料包ID減少了6; 有3個位元組的資料和6個位元組的壓縮報頭:

O ctcp * A+6 S+49 I+6 3 (6)

ARP / RARP包

Arp / rarp輸出顯示請求的類型及其參數。格式的目的是自我解釋。以下是從主機rtsg到主機csam的“rlogin”開始的簡短示例:

arp who-has csam tell rtsg

arp reply csam is-at CSAM

第一行說rtsg發送一個arp包,請求網際網路主機csam的以太網位址。Csam以其以太網位址回複(在這個例子中,以太網位址在大寫字母和網際網路位址小寫)。

如果我們已經完成了tcpdump -n,這看起來不會多餘:

arp who-has 128.3.254.6 tell 128.3.254.68

arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

如果我們已經完成了tcpdump -e,第一個資料包被廣播,第二個資料包是點對點的事實将是可見的:

RTSG Broadcast 0806 64: arp who-has csam tell rtsg

CSAM RTSG 0806 64: arp reply csam is-at CSAM

對于第一個資料包來說,以太網源位址是RTSG,目的地是以太網廣播位址,類型字段包含十六進制0806(類型ETHER_ARP),總長度是64位元組。

TCP資料包

(注意:下面的描述假定你熟悉RFC-793中描述的TCP協定,如果你不熟悉協定,這個描述和tcpdump都不會對你有太大的用處。

一個tcp協定的一般格式是:

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

Src和dst是源和目标IP位址和端口。标志是S(SYN),F(FIN),P(PUSH),R(RST),W(ECN CWR)或E(ECN-Echo)的一些組合,或者一個單獨的'。(沒有标志)。Data-seqno描述了資料包中資料覆寫的部分序列空間(見下面的例子)。确認是在該連接配接上期望的另一個方向的下一個資料的序列号。Window是在此連接配接上可用的接收緩沖區空間的另一個方向的位元組數。Urg表示資料包中有“緊急”資料。選項是用尖括号括起來的tcp選項(例如,<mss 1024>)。

Src,dst和标志總是存在。其他字段取決于資料包的TCP協定頭的内容,隻在适當時輸出。

這是從主機rtsg到主機csam的rlogin的開頭部分。

rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>

csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>

rtsg.1023 > csam.login: . ack 1 win 4096

rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096

csam.login > rtsg.1023: . ack 2 win 4096

rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096

csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077

csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1

csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

第一行表示rtsg上的tcp端口1023向csam上的端口登入發送了一個包。在小号表明SYN标志設定。資料包序号為768512,不包含資料。(這個符号是“first:last(nbytes)”,意思是“序列号首先到最後一個是使用者資料的nbytes位元組”)。沒有捎帶的ack,可用的接收視窗是4096位元組,有一個最大段大小選項請求1024個位元組的MSS。

Csam回複一個類似的資料包,除了包含rtsg的SYN的背馱式。Rtsg然後aks csam的SYN。'。' 意味着沒有設定标志。資料包不包含資料,是以沒有資料序列号。請注意,确認序号是一個小整數(1)。tcpdump第一次看到一個tcp“對話”,它列印出來的資料包的序列号。在會話的後續資料包中,列印目前資料包序列号與此初始序列号之間的差異。這意味着在第一個資料流之後的序列号可以被解釋為對話資料流中的相對位元組位置(每個方向的第一個資料位元組是'1')。“-S”将覆寫此功能,

在第6行,rtsg發送csam 19個位元組的資料(在對話的rtsg→csam側的位元組2到20)。PUSH标志被設定在資料包中。在第七行,csam表示它收到了由rtsg發送的資料,但不包括位元組21.大部分資料顯然都在套接字緩沖區,因為csam的接收視窗已經減少了19個位元組。Csam在這個包中也發送一個位元組的資料給rtsg。在第8行和第9行,csam發送緊急的兩個位元組的資料到rtsg。

如果快照足夠小以至于tcpdump沒有捕獲到完整的TCP報頭,它會盡可能多地解釋報頭,然後報告“[| tcp ]“來表示餘數不能被解釋。如果報頭包含一個僞造的選項(一個帶的長度是太小或超過頭的末尾),tcpdump的報告為“” [ 壞選擇 ]“”并沒有解釋任何進一步的選項(因為它是不可能告訴他們在哪裡開始)。如果頭部長度訓示存在選項,但IP資料報長度不足以使選項實際存在,則 tcpdump将其報告為“[ bad hdr length ]”。

捕獲特定标志組合的TCP資料包(SYN-ACK,URG-ACK等)

TCP報頭的控制位部分有8位:

CWR | ECE | URG | ACK | PSH | RST | SYN | FIN

假設我們想要觀察建立TCP連接配接所使用的資料包。回想一下,當TCP初始化一個新的連接配接時,它使用3-way握手協定; 關于TCP控制位的連接配接順序是

1)調用者發送SYN

2)收件人用SYN,ACK進行響應

3)主叫發送确認

現在我們有興趣捕獲隻包含SYN位的資料包(步驟1)。請注意,我們不希望步驟2(SYN-ACK)的資料包,隻是一個普通的初始SYN。我們需要的是一個正确的tcpdump過濾器表達式。

回想一下沒有選項的TCP頭的結構:

​除非有選項,否則TCP頭通常儲存20個八位位元組的資料。圖的第一行包含八位位元組0 - 3,第二行顯示八位位元組4-7等。

以0開始計數,相關的TCP控制位包含在八位組13中:讓我們仔細看看八位位元組号。這些是我們感興趣的TCP控制位。我們對這個八位位組中的位從0到7,從右到左編号,是以PSH位是位編号3,而URG位是編号5。

回想一下,我們想要捕獲隻有SYN集的資料包。讓我們來看看如果一個TCP資料報到達,并且在它的頭部設定了SYN位,會發生什麼情況?看看控制位部分,我們看到隻有位1(SYN)被設定。

假定八位位元組編号13是網絡位元組順序中的8位無符号整數,則該八位位元組的二進制值是

00000010

其十進制表示是

    7        6        5        4        3        2        1        0

0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2

我們已經差不多完成了,因為現在我們知道如果隻設定了SYN,TCP頭中的第13個八位位元組的值在網絡位元組順序中解釋為8位無符号整數時,必須是2。

這種關系可以表示為

tcp[13] == 2

我們可以使用這個表達式作為tcpdump的過濾器來觀察隻有SYN集的資料包:

tcpdump -i xl0 tcp [13] == 2

表達式“讓TCP資料報的第13個八位位元組具有十進制值2”,這正是我們想要的。

現在假設我們需要捕獲SYN資料包,但是我們并不在乎是否同時設定了ACK或其他TCP控制位。讓我們來看看當SYN-ACK集合的TCP資料報到達時,發生什麼事情的八位組13:現在bits 1和4被設定在第13個八位位元組中。八位組13的二進制值是

00010010

這轉換成十進制

     7       6        5        4        3         2        1        0

0*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18

現在我們不能僅僅在tcpdump過濾器表達式中使用'tcp [13] == 18' ,因為那樣隻會選擇那些設定了SYN-ACK的資料包,而不是那些隻有SYN設定的資料包。請記住,隻要設定了SYN,我們就不在乎是否設定了ACK或任何其他控制位。

為了實作我們的目标,我們需要将八位位元組13的二進制值與其他值進行邏輯與,以保留SYN位。我們知道我們希望在任何情況下都要設定SYN,是以我們将第13個八位位元組的值與SYN的二進制值進行邏輯與:我們看到,無論是否設定了ACK或另一個TCP控制位,該AND操作都可以提供相同的結果。AND值的十進制表示以及此操作的結果是2(二進制00000010),是以我們知道對于設定了SYN的資料包,以下關系必須為真:

((八位位元組13的值)AND(2))==(2)

這指向了tcpdump過濾器表達式

tcpdump -i xl0'tcp [13]&2 == 2'

請注意,您應該在表達式中使用單引号或反斜杠來從shell中隐藏AND('&')特殊字元。

UDP資料包

UDP格式由這個rwho資料包說明:

actinide.who> broadcast.who:udp 84

這就是說端口誰主機锕發送一個UDP資料報給端口誰主機廣播,網際網路廣播位址。資料包包含84個位元組的使用者資料。

某些UDP服務被識别(從源端口号或目标端口号)和列印更進階别的協定資訊。特别是域名服務請求(RFC-1034/1035)和Sun RPC調用(RFC-1050)到NFS。

UDP名稱伺服器請求

(注意:下面的描述假設你熟悉RFC-1035中描述的域服務協定,如果你不熟悉協定,下面的描述将會寫成希臘文。)

名稱伺服器請求格式為

src > dst: id op? flags qtype qclass name (len)

h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

主機h2opolo向helios的域名伺服器詢問與名稱ucbvax.berkeley.edu相關的位址記錄(qtype = A)。查詢ID是“3”。“+”表示已設定遞歸期望标志。查詢長度為37個位元組,不包括UDP和IP協定頭。查詢操作是正常的,查詢,是以操作字段被省略。如果操作是其他任何東西,它将被列印在“3”和“+”之間。類似地,qclass是正常的,C_IN,并被省略。任何其他qclass将在“A”之後立即列印。

檢查了一些異常,并可能導緻在方括号内包含額外的字段:如果查詢包含答案,授權記錄或附加記錄部分,則将ancount,nscount或arcount列印為“[ n a]”,[ n n ]'或'[ n au]',其中n是合适的數量。如果設定了任何響應位(AA,RA或rcode)或任何“必須為零”位以位元組2和3設定,則列印“[b2&3 = x ]”,其中x是十六進制值标題位元組二和三。

UDP名稱伺服器響應

名稱伺服器響應格式為

src > dst: id op rcode flags a/n/au type class data (len)

helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)

helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

在第一個例子中,helios響應來自h2opolo的3個答案記錄,3個名稱伺服器記錄和7個附加記錄的查詢ID3。第一個答案記錄是A型(位址),其資料是網際網路位址128.32.137.3。響應的總大小為273位元組,不包括UDP和IP标頭。op(查詢)和響應代碼(NoError)與A記錄的類(C_IN)一樣被省略。

在第二個例子中,helios以不存在答案的不存在域(NXDomain)的響應代碼對一個查詢2作出響應,一個名稱伺服器和沒有權限記錄。'*'表示權威答案位已設定。由于沒有答案,沒有列印任何類型,類别或資料。

其他可能出現的标志字元是' - '(遞歸可用,RA,未設定)和'|' (截斷消息,TC,集合)。如果“問題”部分不包含一個條目,則會列印“[ n q]”。

SMB / CIFS解碼

tcpdump現在包括對UDP / 137,UDP / 138和TCP / 139資料的相當廣泛的SMB / CIFS / NBT解碼。IPX和NetBEUI SMB資料的一些原始解碼也完成了。

預設情況下,進行相當小的解碼,如果使用-v,則執行更詳細的解碼。被警告說,使用-va單個SMB資料包可能會占用一個或多個頁面,是以隻有使用-v時,如果你真的想要所有的細節。

有關SMB資料包格式的資訊以及所有te字段的含義,請參閱www.cifs.org或您最喜愛的samba.org鏡像站點上的pub / samba / specs /目錄。SMB更新檔由Andrew Tridgell編寫。

NFS請求和回複

Sun NFS(網絡檔案系統)請求和答複列印為:

src.xid > dst.nfs: len op args

src.nfs > dst.xid: reply stat len op results

sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165

wrl.nfs > sushi.6709: reply ok 40 readlink "../var"

sushi.201b > wrl.nfs:

144 lookup fh 9,74/4096.6878 "xcolors"

wrl.nfs > sushi.201b:

reply ok 128 lookup fh 9,74/4134.3150

在第一行中,主持人sushi發送一個id為6709的事務給wrl(注意src主機後面的數字是一個事務id, 而不是源端口)。請求是112個位元組,不包括UDP和IP頭。該操作是檔案句柄(fh)21,24 / 10.731657119 上的readlink(讀取符号連結)。(如果幸運的話,在這種情況下,檔案句柄可以被解釋為一個主要的,次要的裝置号碼對,接着是inode号碼和世代号碼。)Wrl用連結的内容回答“ok”。

在第三行,壽司問WRL查找名稱“ xcolors ”在目錄檔案9,74 / 4096.6878。請注意,列印的資料取決于操作類型。如果與NFS協定規範一起閱讀,格式的目的是自我解釋。

如果給出-v(詳細)标志,則會列印附加資訊。例如:

sushi.1372a > wrl.nfs:

148 read fh 21,11/12.195 8192 bytes @ 24576

wrl.nfs > sushi.1372a:

reply ok 1472 read REG 100664 ids 417/0 sz 29388

(-v也列印IP頭TTL,ID,長度和分段字段,在這個例子中已經省略了)。在第一行中,壽司要求 wrl從檔案21,11 / 12.195讀取8192個位元組,位元組偏移量24576. WRL回複'OK'; 在第二行顯示的資料包是答複的第一個片段,是以隻有1472位元組長(其他位元組将在随後的片段中,但這些片段沒有NFS甚至UDP頭,是以可能不會被列印,取決于所使用的過濾表達式)。由于給出了-v标志,是以将列印一些檔案屬性(除檔案資料外還傳回):檔案類型(正常檔案的“REG”),檔案模式(八進制) uid和gid以及檔案大小。

如果-v标志被給出不止一次,則會列印更多的細節。

請注意,NFS請求非常大,除非增加snaplen,否則不會列印大部分細節。嘗試使用' -s 192 '來觀察NFS流量。

NFS回複資料包不顯式辨別RPC操作。相反,tcpdump會跟蹤“最近”的請求,并将它們與使用事務ID的回複進行比對。如果答複沒有嚴格遵循相應的請求,則可能無法解析。

AFS請求和答複

Transarc AFS(Andrew檔案系統)請求和答複列印為:

src.sport > dst.dport: rx packet-type

src.sport > dst.dport: rx packet-type service call call-name args

src.sport > dst.dport: rx packet-type service reply call-name args

elvis.7001 > pike.afsfs:

rx data fs call rename old fid 536876964/1/1 ".newsrc.new"

new fid 536876964/1/1 ".newsrc"

pike.afsfs > elvis.7001: rx data fs reply rename

在第一行中,主機elvis發送一個RX資料包給派克。這是一個到fs(fileserver)服務的RX資料包,并且是RPC調用的開始。RPC調用是重命名,舊的目錄檔案ID為536876964/1/1,舊的檔案名為“.newsrc.new”,新的目錄檔案ID為536876964/1/1,新的檔案名為“。 newsrc”。主機pike響應重命名調用的RPC回複(這是成功的,因為它是一個資料包,而不是一個中止包)。

一般來說,所有的AFS RPC至少被RPC調用名稱解碼。大多數AFS RPC至少有一些解碼的參數(通常隻有“有趣的”參數,對某些有趣的定義)。

該格式旨在自我描述,但對于不熟悉AFS和RX工作的人可能不會有用。

如果-v(詳細)标志被賦予兩次,則會列印确認包和附加标題資訊,例如RX呼叫ID,呼叫号碼,序列号,序列号和RX包标志。

如果給出-v标志兩次,則會列印附加資訊,例如RX呼叫ID,序列号和RX包标志。MTU協商資訊也從RX ack資料包列印。

如果-v标志被給出三次,則列印安全索引和服務辨別。

錯誤代碼被列印用于中止資料包,除了Ubik信标資料包外(因為中止資料包用于表示對Ubik協定是肯定的投票)。

請注意,AFS請求非常大,除非增加snaplen,否則許多參數将不會被列印。嘗試使用“ -s 256 ”來觀看AFS流量。

AFS應答包不明确地辨別RPC操作。相反,tcpdump跟蹤“最近”的請求,并使用電話号碼和服務ID将它們與答複進行比對。如果答複沒有嚴格遵循相應的請求,則可能無法解析。

KIP AppleTalk(UDP中的DDP)

将封裝在UDP資料報中的AppleTalk DDP資料包解封裝并作為DDP資料包轉儲(即丢棄所有的UDP報頭資訊)。檔案/etc/atalk.names用于将AppleTalk網絡和節點号碼轉換為名稱。這個檔案中的行有表格

number       name

1.254            ether

16.1              icsd-net

1.254.110      ace

前兩行給出了AppleTalk網絡的名稱。第三行給出了一個特定主機的名稱(主機與網絡中的第三個八位位元組相差別 - 網絡号必須有兩個八位位元組,而主機号必須有三個八位位元組)。數字和名稱應該分開由空白(空格或制表符)。該/etc/atalk.names檔案可能包含空行或注釋行(開始用“#”)。

AppleTalk位址列印在窗體中

net.host.port

144.1.209.2 > icsd-net.112.220

office.2 > icsd-net.112.220

jssmag.149.235 > icsd-net.2

(如果/etc/atalk.names不存在或不包含某個AppleTalk主機/網絡号的條目,則以數字形式列印位址。)在第一個示例中,網絡上的NBP(DDP端口2)144.1節點209正在向正在監聽網絡icsd節點112的端口220上的任何節點發送資訊。第二行是相同的,除了源節點的全名是已知的(“辦公室”)。第三行是從網絡jssmag節點149上的端口235發送到icsd-net NBP端口上的廣播(注意,廣播位址(255)由沒有主機号碼的網絡名稱訓示 - 是以,這是一個好主意保持/etc/atalk.names中的節點名和網名不同)。

NBP(名稱綁定協定)和ATP(AppleTalk事務協定)資料包解釋了其内容。其他協定隻是轉儲協定名稱(或數字,如果沒有名稱是協定注冊)和資料包大小。

NBP資料包的格式如下例所示:

icsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*"

jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250

techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186

第一行是由網絡主機112發送的在網絡jssmag上廣播的雷射寫入器的名稱查詢請求。查找的nbp id是190.第二行顯示來自主機jssmag.209的這個請求(注意它具有相同的id)的回複,表示它具有在端口250上注冊的名為“RM1140”的laserwriter資源。第三行是另一個答複相同的請求說,主機techpit有雷射寫作“techpit”186端口注冊。

ATP資料包格式化由以下示例示範:

jsmag.209.165> helios.132:atp-req 12266 <0-7> 0xae030001

helios.132> jssmag.209.165:atp-resp 12266:0(512)0xae040000

helios.132> jssmag.209.165:atp-resp 12266:1 (512)0xae040000

helios.132> jssmag.209.165:atp-resp 12266:2(512)0xae040000

helios.132> jssmag.209.165:atp-resp 12266:3(512)0xae040000

helios.132> jssmag.209.165:atp- (512)0xae040000

helios.132> jssmag.209.165:atp-resp 12266:5(512)0xae040000

helios.132> jssmag.209.165:atp-resp 12266:6(512)0xae040000

helios.132> jssmag。 209 512:atp-resp * 12266:7(512)0xae040000

jssmag.209.165> helios.132:atp-req 12266 <3,5> 0xae030001

helios.132> jssmag.209.165:atp-resp 12266:3(512)0xae040000

helios.132> jssmag.209.165:atp-resp 12266:5(512)0xae040000

jssmag.209.165> helios.132:atp-rel 12266 <0-7> 0xae030001

jssmag.209.133> helios.132:atp-req * 12267 < 0-7> 0xae030002

Jssmag.209通過請求多達8個資料包('<0-7>')來啟動與主機helios的事務ID 12266。行尾的十六進制數字是請求中'userdata'字段的值。

Helios響應8個512位元組的資料包。交易ID後面的“:digit”給出了交易中的分組序列号,parens中的數字是分組中的資料量,不包括atp頭。資料包7上的“*”表示EOM位已設定。

然後Jssmag.209請求重傳分組3和5。Helios重新發送它們,然後jssmag.209釋放事務。最後,jssmag.209發起下一個請求。請求中的“*”表示XO('剛好一次')未被設定。

IP碎片

碎片化的Internet資料報被列印為

(frag id:size@offset+)

(frag id:size@offset)

(第一種形式表示有更多的片段,第二種表示這是最後一個片段。)

Id是片段ID。大小是不包括IP頭的片段大小(以位元組為機關)。偏移量是原始資料報中該片段的偏移量(以位元組為機關)。

片段資訊為每個片段輸出。第一個片段包含更進階别的協定頭,并且在協定資訊之後列印片段資訊。第一個片段之後的碎片不包含更進階别的協定頭,并且在源位址和目的位址之後列印碎片資訊。例如,這裡是一個從arizona.edu到lbl-rtsg.arpa的ftp的一部分,通過一個CSNET連接配接,看起來不處理576位元組的資料報:

arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)

arizona > rtsg: (frag 595a:204@328)

rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560

這裡有幾點需要注意:首先,第二行的位址不包含端口号。這是因為TCP協定資訊全部在第一個片段中,我們不知道列印後面的片段時端口或序列号是什麼。其次,列印第一行的tcp序列資訊時,如果有308位元組的使用者資料,實際上有512位元組(第一個碎片308,第二個碎片204)。如果您正在尋找序列空間中的空洞,或試圖将資料與資料包進行比對,這可能會欺騙您。

具有IP 不分段标志的分組标記有尾随(DF)。

時間戳

預設情況下,所有輸出行都有一個時間戳記。時間戳是表單中的目前時鐘時間

繼續閱讀