基礎命令學習目錄首頁 php
http://starsliao.blog.163.com/blog/static/89048201062333032563/html
TCPdump抓包命令
tcpdump是一個用於截取網絡分組,並輸出分組內容的工具。tcpdump憑藉強大的功能和靈活的截取策略,使其成爲類UNIX系統下用於網絡分析和問題排查的首選工具。
tcpdump提供了源代碼,公開了接口,所以具有很強的可擴展性,對於網絡維護和入侵者都是很是有用的工具。tcpdump存在於基本的Linux系統中,因爲它須要將網絡界面設置爲混雜模式,普通用戶不能正常執行,但具有root權限的用戶能夠直接執行它來獲取網絡上的信息。所以系統中存在網絡分析工具主要不是對本機安全的威脅,而是對網絡上的其餘計算機的安全存在威脅。linux
1、概述
顧名思義,tcpdump能夠將網絡中傳送的數據包的「頭」徹底截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。
引用
# tcpdump -vv
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:53:21.444591 IP (tos 0x10, ttl 64, id 19324, offset 0, flags [DF], proto 6, length: 92) asptest.localdomain.ssh > 192.168.228.244.1858: P 3962132600:3962132652(52) ack 2726525936 win 1266
asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!] 325+ PTR? 244.228.168.192.in-addr.arpa. (46)
11:53:21.446929 IP (tos 0x0, ttl 64, id 42911, offset 0, flags [DF], proto 17, length: 151) 192.168.228.153.domain > asptest.localdomain.1077: 325 NXDomain q: PTR? 244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)
11:53:21.447408 IP (tos 0x10, ttl 64, id 19328, offset 0, flags [DF], proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858: P 168:300(132) ack 1 win 1266
347 packets captured
1474 packets received by filter
745 packets dropped by kernel
不帶參數的tcpdump會收集網絡中全部的信息包頭,數據量巨大,必須過濾。ios
2、選項介紹
引用
-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)。
-b 在數據-鏈路層上選擇協議,包括ip、arp、rarp、ipx都是這一層的。
-n 不把網絡地址轉換成名字。
-nn 不進行端口名稱的轉換。
-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 直接將分組寫入文件中,而不是不分析並打印出來。git
3、tcpdump的表達式介紹
表達式是一個正則表達式,tcpdump利用它做爲過濾報文的條件,若是一個報文知足表 達式的條件,則這個報文將會被捕獲。若是沒有給出任何條件,則網絡上全部的信息包 將會被截獲。
在表達式中通常以下幾種類型的關鍵字:
引用
第一種是關於類型的關鍵字,主要包括host,net,port,例如 host 210.27.48.2, 指明 210.27.48.2是一臺主機,net 202.0.0.0指明202.0.0.0是一個網絡地址,port 23 指明端口號是23。若是沒有指定類型,缺省的類型是host。
第二種是肯定傳輸方向的關鍵字,主要包括src,dst,dst or src,dst and src, 這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是 210.27.48.2 , dst net 202.0.0.0 指明目的網絡地址是202.0.0.0。若是沒有指明 方向關鍵字,則缺省是src or dst關鍵字。
第三種是協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI (分佈式光纖數據接口網絡)上的特定的網絡協議,實際上它是」ether」的別名,fddi和ether 具備相似的源地址和目的地址,因此能夠將fddi協議包看成ether的包進行處理和分析。 其餘的幾個關鍵字就是指明瞭監聽的包的協議內容。若是沒有指定任何協議,則tcpdump 將會 監聽全部協議的信息包。web
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less, greater, 還有三種邏輯運算,取非運算是 ‘not ' '! ‘, 與運算是’and’,’&&';或運算是’or’ ,’||’; 這些關鍵字能夠組合起來構成強大的組合條件來知足人們的須要。正則表達式
4、輸出結果介紹
下面咱們介紹幾種典型的tcpdump命令的輸出信息
(1) 數據鏈路層頭信息
使用命令:
#tcpdump --e host ICE
ICE 是一臺裝有linux的主機。它的MAC地址是0:90:27:58:AF:1A H219是一臺裝有Solaris的SUN工做站。它的MAC地址是8:0:20:79:5B:46; 上一條命令的輸出結果以下所示:
引用
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF)
21:50:12是顯示的時間, 847509是ID號,eth0 <表示從網絡接口eth0接收該分組, eth0 >表示從網絡接口設備發送分組, 8:0:20:79:5b:46是主機H219的MAC地址, 它代表是從源地址H219發來的分組. 0:90:27:58:af:1a是主機ICE的MAC地址, 表示該分組的目的地址是ICE。 ip 是代表該分組是IP分組,60 是分組的長度, h219.33357 > ICE. telnet 代表該分組是從主機H219的33357端口發往主機ICE的 TELNET(23)端口。 ack 22535 代表對序列號是222535的包進行響應。 win 8760代表發 送窗口的大小是8760。
(2) ARP包的tcpdump輸出信息
使用命令:
#tcpdump arp
獲得的輸出結果是:
引用
22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
22:32:42是時間戳, 802509是ID號, eth0 >代表從主機發出該分組,arp代表是ARP請求包, who-has route tell ICE代表是主機ICE請求主機route的MAC地址。 0:90:27:58:af:1a是主機 ICE的MAC地址。
(3) TCP包的輸出信息
用tcpdump捕獲的TCP包的通常輸出信息是:
引用
src > dst: flags data-seqno ack window urgent options
src > dst:代表從源地址到目的地址, flags是TCP報文中的標誌信息,S 是SYN標誌, F (FIN), P (PUSH) , R (RST) "." (沒有標記); data-seqno是報文中的數據 的順序號, ack是下次指望的順序號, window是接收緩存的窗口大小, urgent代表 報文中是否有緊急指針。 Options是選項。
(4) UDP包的輸出信息
用tcpdump捕獲的UDP包的通常輸出信息是:
引用
route.port1 > ICE.port2: udp lenth
UDP十分簡單,上面的輸出行代表從主機route的port1端口發出的一個UDP報文 到主機ICE的port2端口,類型是UDP, 包的長度是lenth。 算法
5、舉例
(1) 想要截獲全部210.27.48.1 的主機收到的和發出的全部的分組:
#tcpdump host 210.27.48.1
(2) 想要截獲主機210.27.48.1 和主機210.27.48.2或210.27.48.3的通訊,使用命令(注意:括號前的反斜槓是必須的):
#tcpdump host 210.27.48.1 and 210.27.48.2or210.27.48.3
(3) 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
(4) 若是想要獲取主機192.168.228.246接收或發出的ssh包,而且不轉換主機名使用以下命令:
#tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp
(5) 獲取主機192.168.228.246接收或發出的ssh包,並把mac地址也一同顯示:
# tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn
(6) 過濾的是源主機爲192.168.0.1與目的網絡爲192.168.0.0的報頭:
tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24
(7) 過濾源主機物理地址爲XXX的報頭:
tcpdump ether src 00:50:04:BA:9B and dst……
(爲何ether src後面沒有host或者net?物理地址固然不可能有網絡嘍)。
(8) 過濾源主機192.168.0.1和目的端口不是telnet的報頭,並導入到tes.t.txt文件中:
Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt
ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型。shell
tcpdump採用命令行方式,它的命令格式爲:
tcpdump [-nn] [-i 接口] [-w 儲存檔名] [-c 次數] [-Ae]
[-qX] [-r 文件] [所欲捕獲的數據內容]
參數:
-nn,直接以 IP 及 Port Number 顯示,而非主機名與服務名稱。
-i,後面接要「監聽」的網絡接口,例如 eth0, lo, ppp0 等等的接口。
-w,若是你要將監聽所得的數據包數據儲存下來,用這個參數就對了。後面接文件名。
-c,監聽的數據包數,若是沒有這個參數, tcpdump 會持續不斷的監聽,
直到用戶輸入 [ctrl]-c 爲止。
-A,數據包的內容以 ASCII 顯示,一般用來捉取 WWW 的網頁數據包資料。
-e,使用資料鏈接層 (OSI 第二層) 的 MAC 數據包數據來顯示。
-q,僅列出較爲簡短的數據包信息,每一行的內容比較精簡。
-X,能夠列出十六進制 (hex) 以及 ASCII 的數據包內容,對於監聽數據包內容頗有用。
-r,從後面接的文件將數據包數據讀出來。那個「文件」是已經存在的文件,
而且這個「文件」是由 -w 所製做出來的。
所欲捕獲的數據內容:咱們能夠專門針對某些通訊協議或者是 IP 來源進行數據包捕獲。
那就能夠簡化輸出的結果,並取得最有用的信息。常見的表示方法有。
'host foo', 'host 127.0.0.1' :針對單臺主機來進行數據包捕獲。
'net 192.168' :針對某個網段來進行數據包的捕獲。
'src host 127.0.0.1' 'dst net 192.168':同時加上來源(src)或目標(dst)限制。
'tcp port 21':還能夠針對通訊協議檢測,如tcp、udp、arp、ether 等。
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,
greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'o
r' ,'||';數據庫
範例一:以 IP 與 Port Number 捉下 eth0 這個網卡上的數據包,持續 3 秒
[root@linux ~]# tcpdump -i eth0 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win
9648
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win
9648
<==按下 [ctrl]-c 以後結束
6680 packets captured <==捉取下來的數據包數量
14250 packets received by filter <==由過濾所得的總數據包數量
7512 packets dropped by kernel <==被核心所丟棄的數據包
至於那個在範例一所產生的輸出中,咱們能夠大概區分爲幾個字段,現以範例一當中那行特殊字體行來講明一下:
· 01:33:40.41:這個是此數據包被捕獲的時間,「時:分:秒」的單位。
· IP:經過的通訊協議是IP。
· 192.168.1.100.22>:傳送端是192.168.1.100這個IP,而傳送的Port Number爲22,那個大於(>)的符號指的是數據包的傳輸方向。
· 192.168.1.11.1190:接收端的IP是192.168.1.11,且該主機開啓port 1190來接收。
· P 116:232(116):這個數據包帶有PUSH的數據傳輸標誌,且傳輸的數據爲總體數據的116~232 Byte,因此這個數據包帶有116 Bytes的數據量。
· ack 1 win 9648:ACK與Window size的相關資料。
最簡單的說法,就是該數據包是由192.168.1.100傳到192.168.1.11,經過的port是由22到1190,且帶有116 Bytes的數據量,使用的是PUSH的標記,而不是SYN之類的主動聯機標誌。
接下來,在一個網絡狀態很忙的主機上面,你想要取得某臺主機對你聯機的數據包數據時,使用tcpdump配合管線命令與正則表達式也能夠,不過,畢竟很差捕獲。咱們能夠經過tcpdump的表達式功能,就可以輕易地將所須要的數據獨立的取出來。在上面的範例一當中,咱們僅針對eth0作監聽,因此整個eth0接口上面的數據都會被顯示到屏幕上,但這樣很差分析,能夠簡化嗎?例如,只取出port 21的聯機數據包,能夠這樣作:
[root@linux ~]# tcpdump -i eth0 -nn port 21 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 65535 01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 5840 01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 65515 01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 65515 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840 |
看!這樣就僅取出port 21的信息,若是仔細看的話,你會發現數據包的傳遞都是雙向的,Client端發出請求而Server端則予以響應,因此,固然是有去有回了。而咱們也就能夠通過這個數據包的流向來了解到數據包運動的過程了。例如:
· 咱們先在一個終端機窗口輸入「tcpdump-i lo-nn」的監聽。
· 再另開一個終端機窗口來對本機(127.0.0.1)登陸「ssh localhost」,那麼輸出的結果會是如何?
[root@linux ~]# tcpdump -i lo -nn 1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0) win 32767 4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0) ack 933696133 win 32767 5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192 7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 |
代碼顯示的頭兩行是tcpdump的基本說明,而後:
· 第3行顯示的是來自Client端帶有SYN主動聯機的數據包。
· 第4行顯示的是來自Server端,除了響應Client端以外(ACK),還帶有SYN主動聯機的標誌。
· 第5行則顯示Client端響應Server肯定聯機創建(ACK)。
· 第6行之後則開始進入數據傳輸的步驟。
從第3~5行的流程來看,熟不熟悉啊?沒錯。那就是3次握手的基礎流程,有趣吧。不過tcpdump之因此被稱爲黑客軟件之一遠不止上面介紹的功能。上面介紹的功能能夠用來做爲咱們主機的數據包聯機與傳輸的流程分析,這將有助於咱們瞭解到數據包的運做,同時瞭解到主機的防火牆設置規則是否有須要修訂的地方。
還有更神奇的用法。當咱們使用tcpdump在Router上面監聽明文的傳輸數據時,例如FTP傳輸協議,你以爲會發生什麼問題呢?咱們先在主機端執行「tcpdump -i lo port 21 -nn –X」,而後再以FTP登陸本機,並輸入帳號與密碼,結果你就能夠發現以下的情況:
[root@linux ~]# tcpdump -i lo -nn -X 'port 21' 0x0000: 4500 0048 2a28 4000 4006 1286 7f00 0001 E..H*(@.@....... 0x0010: 7f00 0001 0015 80ab 8355 2149 835c d825 .........U!I.\.% 0x0020: 8018 2000 fe3c 0000 0101 080a 0e2e 0b67 .....<.........g 0x0030: 0e2e 0b61 3232 3020 2876 7346 5450 6420 ...a220.(vsFTPd. 0x0040: 322e 302e 3129 0d0a 2.0.1).. 0x0000: 4510 0041 d34b 4000 4006 6959 7f00 0001 E..A.K@.@.iY.... 0x0010: 7f00 0001 80ab 0015 835c d825 8355 215d .........\.%.U!] 0x0020: 8018 2000 fe35 0000 0101 080a 0e2e 1b37 .....5.........7 0x0030: 0e2e 0b67 5553 4552 2064 6d74 7361 690d ...gUSER.dmtsai. 0x0040: 0a . 0x0000: 4510 004a d34f 4000 4006 694c 7f00 0001 E..J.O@.@.iL.... 0x0010: 7f00 0001 80ab 0015 835c d832 8355 217f .........\.2.U!. 0x0020: 8018 2000 fe3e 0000 0101 080a 0e2e 3227 .....>........2' 0x0030: 0e2e 1b38 5041 5353 206d 7970 6173 7377 ...8PASS.mypassw 0x0040: 6f72 6469 7379 6f75 0d0a ordisyou.. |
上面的輸出結果已經被簡化過了,你須要自行在你的輸出結果中搜索相關的字符串才行。從上面輸出結果的特殊字體中,咱們能夠發現該FTP軟件使用的是 vsFTPd,而且用戶輸入dmtsai這個帳號名稱,且密碼是mypasswordisyou。若是使用的是明文方式來傳輸你的網絡數據呢?
另外你得了解,爲了讓網絡接口可讓tcpdump監聽,因此執行tcpdump時網絡接口會啓動在「混雜模式(promiscuous)」,因此你會在 /var/log/messages裏面看到不少的警告信息,通知你說你的網卡被設置成爲混雜模式。別擔憂,那是正常的。至於更多的應用,請參考man tcpdump了。
例題:如何使用tcpdump監聽來自eth0適配卡且通訊協議爲port 22,目標來源爲192.168.1.100的數據包資料? 答:tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'。 |
##############例子2#######################################
普通狀況下,直接啓動tcpdump將監視第一個網絡界面上全部流過的數據包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
使用-i參數指定tcpdump監聽的網絡界面,這在計算機具備多個網絡界面時很是有用,
使用-c參數指定要監聽的數據包數量,
使用-w參數指定將監聽到的數據包寫入文件中保存
A想要截獲全部210.27.48.1 的主機收到的和發出的全部的數據包:
#tcpdump host 210.27.48.1
B想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊,使用命令:(在命令行中適用 括號時,必定要
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
C若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#tcpdump tcp port 23 host 210.27.48.1
E 對本機的udp 123 端口進行監視 123 爲ntp的服務端口
# tcpdump udp port 123
F 系統將只對名爲hostname的主機的通訊數據包進行監視。主機名能夠是本地主機,也能夠是網絡上的任何一臺計算機。下面的命令能夠讀取主機hostname發送的全部數據:
#tcpdump -i eth0 src host hostname
G 下面的命令能夠監視全部送到主機hostname的數據包:
#tcpdump -i eth0 dst host hostname
H 咱們還能夠監視經過指定網關的數據包:
#tcpdump -i eth0 gateway Gatewayname
I 若是你還想監視編址到指定端口的TCP或UDP數據包,那麼執行如下命令:
#tcpdump -i eth0 host hostname and port 80
J 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
K 想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊,使用命令
:(在命令行中適用 括號時,必定要
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
L 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
M 若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#tcpdump tcp port 23 host 210.27.48.1
第三種是協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,
greater,還有三種邏輯運算,取非運算是 ‘not ‘ ‘! ‘, 與運算是‘and‘,‘&&‘;或運算 是‘o
r‘ ,‘||‘;
第二種是肯定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,
若是咱們只須要列出送到80端口的數據包,用dst port;若是咱們只但願看到返回80端口的數據包,用src port。
#tcpdump –i eth0 host hostname and dst port 80 目的端口是80
或者
#tcpdump –i eth0 host hostname and src port 80 源端口是80 通常是提供http的服務的主機
若是條件不少的話 要在條件以前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
若是在ethernet 使用混雜模式 系統的日誌將會記錄
May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump對截獲的數據並無進行完全解碼,數據包內的大部份內容是使用十六進制的形式直接打印輸出的。顯然這不利於分析網絡故障,一般的解決辦法是先使用帶-w參數的tcpdump 截獲數據並保存到文件中,而後再使用其餘程序進行解碼分析。固然也應該定義過濾規則,以免捕獲的數據包填滿整個硬盤。
除了過濾語句,還有一個很重要的參數,也就是說,若是這個參數不設置正確,會致使包數據的丟失!
它就是-s 參數,snaplen, 也就是數據包的截取長度,仔細看man就會明白的!默認截取長度爲60個字節,但通常ethernet MTU都是1500字節。因此,要抓取大於60字節的包時,使用默認參數就會致使包數據丟失!
只要使用-s 0就能夠按包長,截取數據!
tcpdump 是一個運行在命令行下的抓包工具。它容許用戶攔截和顯示發送或收到過網絡鏈接到該計算機的TCP/IP和其餘數據包。tcpdump 適用於
大多數的類Unix系統操做系統(如linux,BSD等)。類Unix系統的 tcpdump 須要使用libpcap這個捕捉數據的庫就像 windows下的WinPcap。
在學習tcpdump前最好對基本網絡的網絡知識有必定的認識。
tcpdump命令格式及經常使用參數
Tcpdump的大概形式以下:
例:tcpdump –i eth0 ’port 1111‘ -X -c 3
-X告訴tcpdump命令,須要把協議頭和包內容都原本來本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。
tcpdump採用命令行方式,它的命令格式爲:
tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]
[ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 類型 ] [ -w 文件名 ] [表達式 ]
tcpdump的選項介紹
-a 將網絡地址和廣播地址轉變成名字;
-d 將匹配信息包的代碼以人們可以理解的彙編格式給出;
-dd 將匹配信息包的代碼以c語言程序段的格式給出;
-ddd 將匹配信息包的代碼以十進制的形式給出;
-e 在輸出行打印出數據鏈路層的頭部信息,包括源mac和目的mac,以及網絡層的協議;
-f 將外部的Internet地址以數字的形式打印出來;
-l 使標準輸出變爲緩衝行形式;
-n 指定將每一個監聽到數據包中的域名轉換成IP地址後顯示,不把網絡地址轉換成名字;
-nn: 指定將每一個監聽到的數據包中的域名轉換成IP、端口從應用名稱轉換成端口號後顯示
-t 在輸出的每一行不打印時間戳;
-v 輸出一個稍微詳細的信息,例如在ip包中能夠包括ttl和服務類型的信息;
-vv 輸出詳細的報文信息;
-c 在收到指定的包的數目後,tcpdump就會中止;
-F 從指定的文件中讀取表達式,忽略其它的表達式;
-i 指定監聽的網絡接口;
-p: 將網卡設置爲非混雜模式,不能與host或broadcast一塊兒使用
-r 從指定的文件中讀取包(這些包通常經過-w選項產生);
-w 直接將包寫入文件中,並不分析和打印出來;
-s snaplen snaplen表示從一個包中截取的字節數。0表示包不截斷,抓完整的數據包。默認的話 tcpdump 只顯示部分數據包,默認68字節。
-T 將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議;)
-X 告訴tcpdump命令,須要把協議頭和包內容都原本來本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。
------------------------------------------------
一、抓取回環網口的包:tcpdump -i lo
二、防止包截斷:tcpdump -s0
三、以數字顯示主機及端口:tcpdump -n
如鍵入命令: tcpdump –i eth0 ‘port 1111’ -X -c 3
-i 是interface的含義,是指咱們有義務告訴tcpdump但願他去監聽哪個網卡,
-X告訴tcpdump命令,須要把協議頭和包內容都原本來本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。
port 1111咱們只關心源端口或目的端口是1111的數據包.
-c 是Count的含義,這設置了咱們但願tcpdump幫咱們抓幾個包。
其中還有另一個比較重要的參數– l 使得輸出變爲行緩衝
-l選項的做用就是將tcpdump的輸出變爲「行緩衝」方式,這樣能夠確保tcpdump遇到的內容一旦是換行符即將緩衝的內容輸出到標準輸出,以便於利用管道
或重定向方式來進行後續處理。
Linux/UNIX的標準I/O提供了全緩衝、行緩衝和無緩衝三種緩衝方式。
標準錯誤是不帶緩衝的,終端設備常爲行緩衝,而其餘狀況默認都是全緩衝的。
例如咱們只想提取包的每一行的第一個域(時間域),這種狀況下咱們就須要-l將默認的全緩衝變爲行緩衝了。
tcpdump -i eth0 port 1111 -l | awk '{print $1}'
參數–w -r
-w 直接將包寫入文件中(即原始包,若是使用 重定向 > 則只是保存顯示的結果,而不是原始文件),即所謂的「流量保存」---就是把抓到的網絡包能存儲到磁盤上,
保存下來,爲後續使用。參數-r 達到「流量回放」---就是把歷史上的某一時間段的流量,從新模擬回放出來,用於流量分析。
經過-w選項將流量都存儲在cp.pcap(二進制格式)文件中了.能夠經過 –r 讀取raw packets文件 cp.pcap.
如:sudo tcpdump i- eth0 'port 1111' -c 3 -r cp.pcap 便可進行流量回放。
問:流量回放又有啥子用?
鍵入命令:sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111' 所截獲包內容以下:
-n 不把網絡地址轉換成名字;
sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111'
第一行:「tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode」
提示使用選項-v和-vv,能夠看到更全的輸出內容。
第二行「listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes」
咱們監聽的是經過eth0這個NIC設備的網絡包,且它的鏈路層是基於以太網的,要抓的包大小限制是65535字節。包大小限制值能夠經過-s選項來設置。
第三行」12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),」
12:40:33.569037 分別對應着這個包被抓到的「時」、「分」、「秒」、「微妙」。
00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址00:19:e0:b5:10:94發送到MAC地址爲00:1a:a0:31:39:d4的主機,ethertype IPv4 (0x0800)表示
Ethernet幀的協議類型爲ipv4(即代碼爲0x0800)。
第四行」length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808,
length 66表示以太幀長度爲66。 210.45.123.249.27236表示這個包的源IP爲210.45.123.249,源端口爲27236,’>’表示數據包的傳輸方向, 172.16.0.11.1111,
表示這個數據包的目的端ip爲172.16.0.11,目標端口爲1111,1111端口是個人一個web服務器監聽端口。Flags是[S],代表是syn創建鏈接包(即三次握手的第一次
握手),seq1624463808 序號爲1624463808,這個其實就是TCP三次握手的第一次握手:client(210.45.123.249)發送syn請求創建鏈接包。
第五行」 win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0」
win 8192 表示窗口大小爲8192字節。options[mss 1460,nop,wscale 2,nop,nop,sackOK]爲tcp首部可選字段mss 1460表示mss是發送端(客戶端)通告的最大
報文段長度,發送端將不接收超過這個長度的TCP報文段(這個值和MTU有必定關係)。nop是一個空操做選項, wscale指出發送端使用的窗口擴大因子爲2, sackOK
表示發送端支持並贊成使用SACK選。
下面幾行分別是IP,TCP首部 ,這裏再也不敷述。
能夠給tcpdump傳送「過濾表達式」來起到網絡包過濾的做用,並且能夠支持傳入單個或多個過濾表達式。
能夠經過命令 man pcap-filter 來參考過濾表達式的幫助文檔
過濾表達式大致能夠分紅三種過濾條件,「類型」、「方向」和「協議」,這三種條件的搭配組合就構成了咱們的過濾表達式。
關於類型的關鍵字,主要包括host,net,port, 例如 host 210.45.114.211,指定主機 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一個網絡地址,port 21 指明
端口號是21。若是沒有指定類型,缺省的類型是host.
關於傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,
這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的網絡地址是210.11.0.0 。若是沒有指明
方向關鍵字,則缺省是srcor dst關鍵字。
關於協議的關鍵字,主要包括 ether,ip,ip6,arp,rarp,tcp,udp等類型。這幾個的包的協議內容。若是沒有指定任何協議,則tcpdump將會監聽全部協議的
信息包。
如咱們只想抓tcp的包命令爲: sudo tcpdump -i eth0 -nn -c1 'tcp'
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:
gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算是'or' ,'||';
能夠利用這些關鍵字進行組合,從而組合爲比較強大的過濾條件。下面舉例說明
(1)只想查目標機器端口是21或80的網絡包,其餘端口的我不關注:
sudo tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
(2) 想要截獲主機172.16.0.11 和主機210.45.123.249或 210.45.123.248的通訊,使用命令(注意括號的使用):
sudo tcpdump -i eth0 -c 3 'host 172.16.0.11 and (210.45.123.249 or210.45.123.248)'
(3)想獲取使用ftp端口和ftp數據端口的網絡包
sudo tcpdump 'port ftp or ftp-data'
這裏 ftp、ftp-data到底對應哪一個端口? linux系統下 /etc/services這個文件裏面,就存儲着全部知名服務和傳輸層端口的對應關係。若是你直接把/etc/services裏
的ftp對應的端口值從21改成了3333,那麼tcpdump就會去抓端口含有3333的網絡包了。
(4) 若是想要獲取主機172.16.0.11除了和主機210.45.123.249以外全部主機通訊的ip包,使用命令:
sudo tcpdump ip ‘host 172.16.0.11 and ! 210.45.123.249’
(5) 抓172.16.0.11的80端口和110和25之外的其餘端口的包
sudo tcpdump -i eth0 ‘host 172.16.0.11 and! port 80 and ! port 25 and ! port 110’
下面介紹一些tcpdump中過濾語句比較高級的用法
想獲取172.16.10.11和google.com之間創建TCP三次握手中帶有SYN標記位的網絡包.
命令爲:sudo tcpdump -i eth0 'host 172.16.0.11 andhost google.com and tcp[tcpflags]&tcp-syn!=0' -c 3 -nn
上面的命令是否是看着有點暈的感受。 是的。
下面詳細介相關知識。
其實咱們理解這種語法: proto [ expr : size] ,就不難理解上面的語句了。
下面詳細介紹proto [ expr : size]
Proto即protocol的縮寫,它表示這裏要指定的是某種協議名稱,如ip,tcp,udp等。總之能夠指定的協議有十多種,如鏈路層協議 ether,fddi,tr,wlan,ppp,slip,link,
網絡層協議ip,ip6,arp,rarp,icmp傳輸層協議tcp,udp等。
expr用來指定數據報字節單位的偏移量,該偏移量相對於指定的協議層,默認的起始位置是0;而size表示從偏移量的位置開始提取多少個字節,能夠設置爲
一、二、4,默認爲1字節。若是隻設置了expr,而沒有設置size,則默認提取1個字節。好比ip[2:2],就表示提取出第三、4個字節;而ip[0]則表示提取ip協議頭的
第一個字節。在咱們提取了特定內容以後,咱們就須要設置咱們的過濾條件了,咱們可用的「比較操做符」包括:>,<,>=,<=,=,!=,總共有6個。
舉例:想截取每一個TCP會話的起始和結束報文(SYN 和 FIN 報文), 並且會話方中有一個遠程主機.
sudo tcpdump 'tcp[13] & 3 != 0 and not(src and dst net 172.16.0.0)' -nn
若是熟悉tcp首部報文格式能夠比較容易理解這句話,由於tcp便宜13字節的位置爲2位保留位和6位標誌位(URG,ACK,PSH,RST,SYN,FIN), 因此與3相與就能夠得出
SYN,FIN其中是否一個置位1.
從上面能夠看到在寫過濾表達式時,須要咱們對協議格式比較理解才能把表達式寫對。這個比較有難度的..。爲了讓tcpdump工具更人性化一些,有一些經常使用的偏移量,
能夠經過一些名稱來代替,好比icmptype表示ICMP協議的類型域、icmpcode表示ICMP的code域,tcpflags 則表示TCP協議的標誌字段域。
更進一步的,對於ICMP的類型域,能夠用這些名稱具體指代:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect,icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob,icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq,icmp-maskreply。
而對於TCP協議的標誌字段域,則能夠細分爲tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg。
對於tcpdump 只能經過常常操做來熟練這些語句了。也能夠把網絡包用tcpdump截獲保存到指定文件,而後用wireshark等可視化軟件分析網絡包。
參考:
http://network.51cto.com/art/200512/15473.htm
http://fanqiang.chinaunix.net/app/other/2006-07-14/4833.shtml
http://hi.baidu.com/sxq5858/item/af17d7bf0397ca77244b0953
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
轉載自:https://blog.csdn.net/hzhsan/article/details/43445787
用簡單的話來定義tcpdump,就是:dump the traffic on a network,依據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump可以將網絡中傳送的數據包的「頭」全然截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或port的過濾。並提供and、or、not等邏輯語句來幫助你去掉沒用的信息。
默認啓動
tcpdump
通常狀況下,直接啓動tcpdump將監視第一個網絡接口上所有流過的數據包。
監視指定網絡接口的數據包
tcpdump -i eth1
假設不指定網卡,默認tcpdump僅僅會監視第一個網絡接口,一般是eth0,如下的樣例都沒有指定網絡接口。
監視指定主機的數據包
打印所有進入或離開sundown的數據包.
tcpdump host sundown
也可以指定ip,好比截獲所有210.27.48.1 的主機收到的和發出的所有的數據包
tcpdump host 210.27.48.1
打印helios 與 hot 或者與 ace 之間通訊的數據包
tcpdump host helios and \( hot or ace \)
截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
打印ace與不論什麼其它主機之間通訊的IP 數據包, 但不包含與helios之間的數據包.
tcpdump ip host ace and not helios
假設想要獲取主機210.27.48.1除了和主機210.27.48.2以外所有主機通訊的ip包。使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截獲主機hostname發送的所有數據
tcpdump -i eth0 src host hostname
監視所有送到主機hostname的數據包
tcpdump -i eth0 dst host hostname
監視指定主機和port的數據包
假設想要獲取主機210.27.48.1接收或發出的telnet包,使用例如如下命令
tcpdump tcp port 23 and host 210.27.48.1
對本機的udp 123 port進行監視 123 爲ntp的服務port
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'
打印所有源或目的port是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 與wireshark
Wireshark(曾經是ethereal)是Windows下很是easy易用的抓包工具。但在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文件,方便用ethereal(即wireshark)分析
使用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總的的輸出格式爲:系統時間 來源主機.port > 目標主機.port 數據包參數
tcpdump 的輸出格式與協議有關.下面簡要描寫敘述了大部分常用的格式及相關樣例.
對於FDDI網絡, '-e' 使tcpdump打印出指定數據包的'frame control' 域, 源和目的地址, 以及包的長度.(frame control域
控制對包中其它域的解析). 通常的包(比方那些IP datagrams)都是帶有'async'(異步標誌)的數據包,並且有取值0到7的優先級;
比方 'async4'就表明此包爲異步數據包。並且優先級別爲4. 一般以爲,這些包們會內含一個 LLC包(邏輯鏈路控制包); 這時,假設此包
不是一個ISO datagram或所謂的SNAP包。其LLC頭部將會被打印(nt:應該是指此包內含的 LLC包的包頭).
對於Token Ring網絡(令牌環網絡), '-e' 使tcpdump打印出指定數據包的'frame control'和'access control'域, 以及源和目的地址,
外加包的長度. 與FDDI網絡相似, 此數據包一般內含LLC數據包. 不管 是否有'-e'選項.對於此網絡上的'source-routed'類型數據包(nt:
意譯爲:源地址被追蹤的數據包,詳細含義未知,需補充), 其包的源路由信息總會被打印.
對於802.11網絡(WLAN,即wireless local area network), '-e' 使tcpdump打印出指定數據包的'frame control域,
包頭中包括的所有地址, 以及包的長度.與FDDI網絡相似, 此數據包一般內含LLC數據包.
(注意: 下面的描寫敘述會若是你熟悉SLIP壓縮算法 (nt:SLIP爲Serial Line Internet Protocol.), 這個算法可以在
RFC-1144中找到相關的蛛絲馬跡.)
對於SLIP網絡(nt:SLIP links, 可理解爲一個網絡, 即經過串行線路創建的鏈接, 而一個簡單的鏈接也可當作一個網絡),
數據包的'direction indicator'('方向指示標誌')("I"表示入, "O"表示出), 類型以及壓縮信息將會被打印. 包類型會被首先打印.
類型分爲ip, utcp以及ctcp(nt:未知, 需補充). 對於ip包,鏈接信息將不被打印(nt:SLIP鏈接上,ip包的鏈接信息可能無用或未定義.
reconfirm).對於TCP數據包, 鏈接標識緊接着類型表示被打印. 假設此包被壓縮, 其被編碼過的頭部將被打印.
此時對於特殊的壓縮包,會例如如下顯示:
*S+n 或者 *SA+n, 當中n表明包的(順序號或(順序號和應答號))添加或下降的數目(nt | rt:S,SA拗口, 需再譯).
對於非特殊的壓縮包,0個或不少其它的'改變'將會被打印.'改變'被打印時格式例如如下:
'標誌'+/-/=n 包數據的長度 壓縮的頭部長度.
當中'標誌'可以取下面值:
U(表明緊急指針), W(指緩衝窗體), A(應答), S(序列號), I(包ID),而增量表達'=n'表示被賦予新的值, +/-表示添加或下降.
比方, 下面顯示了對一個外發壓縮TCP數據包的打印, 這個數據包隱含一個鏈接標識(connection identifier); 應答號添加了6,
順序號添加了49, 包ID號添加了6; 包數據長度爲3字節(octect), 壓縮頭部爲6字節.(nt:如此看來這應該不是一個特殊的壓縮數據包).
ARP/RARP 數據包
tcpdump對Arp/rarp包的輸出信息中會包括請求類型及該請求相應的參數. 顯示格式簡潔明瞭. 下面是從主機rtsg到主機csam的'rlogin'
(遠程登陸)過程開始階段的數據包例子:
arp who-has csam tell rtsg
arp reply csam is-at CSAM
第一行表示:rtsg發送了一個arp數據包(nt:向全網段發送,arp數據包)以詢問csam的以太網地址
Csam(nt:可從下文看出來, 是Csam)以她本身的以太網地址作了迴應(在這個樣例中, 以太網地址以大寫的名字標識, 而internet
地址(即ip地址)以全部的小寫名字標識).
假設使用tcpdump -n, 可以清晰看到以太網以及ip地址而不是名字標識:
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
第一個數據包代表:以arp包的源以太地址是RTSG, 目標地址是全以太網段, type域的值爲16進制0806(表示ETHER_ARP(nt:arp包的類型標識)),
包的總長度爲64字節.
(注意:下面將會假定你對 RFC-793所描寫敘述的TCP熟悉. 假設不熟, 下面描寫敘述以及tcpdump程序可能對你幫助不大.(nt:警告可忽略,
僅僅需繼續看, 不熟悉的地方可回頭再看.).
一般tcpdump對tcp數據包的顯示格式例如如下:
src > dst: flags data-seqno ack window urgent options
src 和 dst 是源和目的IP地址以及對應的port. flags 標誌由S(SYN), F(FIN), P(PUSH, R(RST),
W(ECN CWT(nt | rep:未知, 需補充))或者 E(ECN-Echo(nt | rep:未知, 需補充))組成,
單獨一個'.'表示沒有flags標識. 數據段順序號(Data-seqno)描寫敘述了此包中數據所相應序列號空間中的一個位置(nt:整個數據被分段,
每段有一個順序號, 所有的順序號構成一個序列號空間)(可參考下面樣例). Ack 描寫敘述的是同一個鏈接,同一個方向,下一個本端應該接收的
(對方應該發送的)數據片斷的順序號. Window是本端可用的數據接收緩衝區的大小(也是對方發送數據時需依據這個大小來組織數據).
Urg(urgent) 表示數據包中有緊急的數據. options 描寫敘述了tcp的一些選項, 這些選項都用尖括號來表示(如 <mss 1024>).
src, dst 和 flags 這三個域老是會被顯示. 其它域的顯示與否依賴於tcp協議頭裏的信息.
這是一個從trsg到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主機的tcpport1023發送到了csam主機的tcpportlogin上(nt:udp協議的port和tcp協議的端
口是分別的兩個空間, 儘管取值範圍一致). S表示設置了SYN標誌. 包的順序號是768512, 並且沒有包括數據.(表示格式
爲:'first:last(nbytes)', 其含義是'此包中數據的順序號從first開始直到last結束。不包括last. 並且總共包括nbytes的
用戶數據'.) 沒有捎帶應答(nt:從下文來看。第二行纔是有捎帶應答的數據包), 可用的接受窗體的大小爲4096bytes, 並且請求端(rtsg)
的最大可接受的數據段大小是1024字節(nt:這個信息做爲請求發向應答端csam, 以便兩方進一步的協商).
Csam 向rtsg 回覆了基本一樣的SYN數據包, 其差異僅僅是多了一個' piggy-backed ack'(nt:捎帶回的ack應答, 針對rtsg的SYN數據包).
rtsg 相同針對csam的SYN數據包回覆了一ACK數據包做爲應答. '.'的含義就是此包中沒有標誌被設置. 由於此應答包中不含有數據, 因此
包中也沒有數據段序列號. 提醒! 此ACK數據包的順序號僅僅是一個小整數1. 有例如如下解釋:tcpdump對於一個tcp鏈接上的會話, 僅僅打印會話兩端的
初始數據包的序列號,其後對應數據包僅僅打印出與初始包序列號的差別.即初始序列號以後的序列號, 可被看做此會話上當前所傳數據片斷在整個
要傳輸的數據中的'相對字節'位置(nt:兩方的第一個位置都是1, 即'相對字節'的開始編號). '-S'將覆蓋這個功能,
使數據包的原始順序號被打印出來.
第六行的含義爲:rtsg 向 csam發送了19字節的數據(字節的編號爲2到20,傳送方向爲rtsg到csam). 包中設置了PUSH標誌. 在第7行,
csam 喊到, 她已經從rtsg中收到了21下面的字節, 但不包含21編號的字節. 這些字節存放在csam的socket的接收緩衝中, 對應地,
csam的接收緩衝窗體大小會下降19字節(nt:可以從第5行和第7行win屬性值的變化看出來). csam在第7行這個包中也向rtsg發送了一個
字節. 在第8行和第9行, csam 繼續向rtsg 分別發送了兩個僅僅包括一個字節的數據包, 並且這個數據包帶PUSH標誌.
假設所抓到的tcp包(nt:即這裏的snapshot)過小了,以致tcpdump沒法完整獲得其頭部數據, 這時, tcpdump會盡可能解析這個不完整的頭,
並把剩下不能解析的部分顯示爲'[|tcp]'. 假設頭部含有虛假的屬性信息(比方其長度屬性事實上比頭部實際長度長或短), tcpdump會爲該頭部
顯示'[bad opt]'. 假設頭部的長度告訴咱們某些選項(nt | rt:從下文來看, 指tcp包的頭部中針對ip包的一些選項, 回頭再翻)會在此包中,
而真正的IP(數據包的長度又不夠容納這些選項, tcpdump會顯示'[bad hdr length]'.
抓取帶有特殊標誌的的TCP包(如SYN-ACK標誌, URG-ACK標誌等).
在TCP的頭部中, 有8比特(bit)用做控制位區域, 其取值爲:
CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
(nt | rt:從表達方式上可判斷:這8個位是用或的方式來組合的, 可回頭再翻)
現若是咱們想要監控創建一個TCP鏈接整個過程當中所產生的數據包. 可回顧例如如下:TCP使用3次握手協議來創建一個新的鏈接; 其與此三次握手
鏈接順序相應,並帶有相應TCP控制標誌的數據包例如如下:
1) 鏈接發起方(nt:Caller)發送SYN標誌的數據包
2) 接收方(nt:Recipient)用帶有SYN和ACK標誌的數據包進行迴應
3) 發起方收到接收方迴應後再發送帶有ACK標誌的數據包進行迴應
0 15 31
-----------------------------------------------------------------
| source port | destination port |
-----------------------------------------------------------------
| sequence number |
-----------------------------------------------------------------
| acknowledgment number |
-----------------------------------------------------------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
-----------------------------------------------------------------
| TCP checksum | urgent pointer |
-----------------------------------------------------------------
一個TCP頭部,在不包括選項數據的狀況下一般佔用20個字節(nt | rt:options 理解爲選項數據。需回譯). 第一行包括0到3編號的字節,
第二行包括編號4-7的字節.
假設編號從0開始算, TCP控制標誌位於13字節(nt:第四行左半部分).
0 7| 15| 23| 31
----------------|---------------|---------------|----------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
----------------|---------------|---------------|----------------
| | 13th octet | | |
讓咱們細緻看看編號13的字節:
| |
|---------------|
|C|E|U|A|P|R|S|F|
|---------------|
|7 5 3 0|
這裏有咱們感興趣的控制標誌位. 從右往左這些位被依次編號爲0到7, 從而 PSH位在3號, 而URG位在5號.
提醒一下本身, 咱們僅僅是要獲得包括SYN標誌的數據包. 讓咱們看看在一個包的包頭中, 假設SYN位被設置, 究竟
在13號字節發生了什麼:
|C|E|U|A|P|R|S|F|
|---------------|
|0 0 0 0 0 0 1 0|
|---------------|
|7 6 5 4 3 2 1 0|
在控制段的數據中, 僅僅有比特1(bit number 1)被置位.
若是編號爲13的字節是一個8位的無符號字符型,並且依照網絡字節號排序(nt:對於一個字節來講。網絡字節序等同於主機字節序), 其二進制值
例如如下所看到的:
00000010
並且其10進制值爲:
0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 2(nt: 1 * 2^6 表示1乘以2的6次方, 或許這樣更
清楚些, 即把原來表達中的指數7 6 ... 0挪到了如下來表達)
接近目標了, 因爲咱們已經知道, 假設數據包頭部中的SYN被置位, 那麼頭部中的第13個字節的值爲2(nt: 依照網絡序, 即大頭方式, 最重要的字節
在前面(在前面,即該字節實際內存地址比較小, 最重要的字節,指數學表示中數的高位, 如356中的3) ).
表達爲tcpdump能理解的關係式就是:
tcp[13] 2
從而咱們可以把此關係式看成tcpdump的過濾條件, 目標就是監控僅僅含有SYN標誌的數據包:
tcpdump -i xl0 tcp[13] 2 (nt: xl0 指網絡接口, 如eth0)
這個表達式是說"讓TCP數據包的第13個字節擁有值2吧", 這也是咱們想要的結果.
現在, 若是咱們需要抓取帶SYN標誌的數據包, 而忽略它是否包括其它標誌.(nt:僅僅要帶SYN就是咱們想要的). 讓咱們來看看當一個含有
SYN-ACK的數據包(nt:SYN 和 ACK 標誌都有), 來到時發生了什麼:
|C|E|U|A|P|R|S|F|
|---------------|
|0 0 0 1 0 0 1 0|
|---------------|
|7 6 5 4 3 2 1 0|
13號字節的1號和4號位被置位, 其二進制的值爲:
00010010
轉換成十進制就是:
0*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2 = 18(nt: 1 * 2^6 表示1乘以2的6次方, 或許這樣更
清楚些, 即把原來表達中的指數7 6 ... 0挪到了如下來表達)
現在, 卻不能僅僅用'tcp[13] 18'做爲tcpdump的過濾表達式, 因爲這將致使僅僅選擇含有SYN-ACK標誌的數據包, 其它的都被丟棄.
提醒一下本身, 咱們的目標是: 僅僅要包的SYN標誌被設置便可, 其它的標誌咱們不理會.
爲了達到咱們的目標, 咱們需要把13號字節的二進制值與其它的一個數作AND操做(nt:邏輯與)來獲得SYN比特位的值. 目標是:僅僅要SYN 被設置
便可, 因而咱們就把她與上13號字節的SYN值(nt: 00000010).
00010010 SYN-ACK 00000010 SYN
AND 00000010 (we want SYN) AND 00000010 (we want SYN)
-------- --------
= 00000010 = 00000010
咱們可以發現, 不管包的ACK或其它標誌是否被設置, 以上的AND操做都會給咱們一樣的值, 其10進製表達就是2(2進製表達就是00000010).
從而咱們知道, 對於帶有SYN標誌的數據包, 下面的表達式的結果老是真(true):
( ( value of octet 13 ) AND ( 2 ) ) ( 2 ) (nt: value of octet 13, 即13號字節的值)
靈感隨之而來, 咱們因而獲得了例如如下的tcpdump 的過濾表達式
tcpdump -i xl0 'tcp[13] & 2 2'
注意, 單引號或反斜杆(nt: 這裏用的是單引號)不能省略, 這可以防止shell對&的解釋或替換.
UDP 數據包的顯示格式,可經過rwho這個詳細應用所產生的數據包來講明:
actinide.who > broadcast.who: udp 84
其含義爲:actinide主機上的portwho向broadcast主機上的portwho發送了一個udp數據包(nt: actinide和broadcast都是指Internet地址).
這個數據包承載的用戶數據爲84個字節.
一些UDP服務可從數據包的源或目的port來識別。也可從所顯示的更高層協議信息來識別. 比方, Domain Name service requests(DNS 請求,
在RFC-1034/1035中), 和Sun RPC calls to NFS(對NFSserver所發起的遠程調用(nt: 即Sun RPC)。在RFC-1050中有對遠程調用的描寫敘述).
UDP 名稱服務請求
(注意:下面的描寫敘述若是你對Domain Service protoco(nt:在RFC-103中有所描寫敘述), 不然你會發現下面描寫敘述就是天書(nt:希臘文天書,
沒必要理會, 嚇嚇你的, 接着看便可))
名稱服務請求有例如如下的格式:
src > dst: id op? flags qtype qclass name (len)
(nt: 從下文來看, 格式應該是src > dst: id op flags qtype qclass? name (len))
比方有一個實際顯示爲:
h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)
主機h2opolo 向helios 上執行的名稱server查詢ucbvax.berkeley.edu 的地址記錄(nt: qtype等於A). 此查詢自己的id號爲'3'. 符號
'+'意味着遞歸查詢標誌被設置(nt: dnsserver可向更高層dnsserver查詢本server不包括的地址記錄). 這個終於經過IP包發送的查詢請求
數據長度爲37字節, 當中不包含UDP和IP協議的頭數據. 因爲此查詢操做爲默認值(nt | rt: normal one的理解), op字段被省略.
假設op字段沒被省略, 會被顯示在'3' 和'+'之間. 相同, qclass也是默認值, C_IN, 從而也沒被顯示, 假設沒被忽略, 她會被顯示在'A'以後.
異常檢查會在方括中顯示出附加的域: 假設一個查詢同一時候包括一個迴應(nt: 可理解爲, 對以前其它一個請求的迴應), 並且此迴應包括權威或附加記錄段,
ancount, nscout, arcount(nt: 詳細字段含義需補充) 將被顯示爲'[na]', '[nn]', '[nau]', 當中n表明合適的計數. 假設包中下面
迴應位(比方AA位, RA位, rcode位), 或者字節2或3中不論什麼一個'必須爲0'的位被置位(nt: 設置爲1), '[b2&3]=x' 將被顯示, 當中x表示
頭部字節2與字節3進行與操做後的值.
UDP 名稱服務應答
對名稱服務應答的數據包。tcpdump會有例如如下的顯示格式
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條回答記錄(nt | rt: answer records), 3條名稱server記錄,
以及7條附加的記錄. 第一個回答記錄(nt: 3個回答記錄中的第一個)類型爲A(nt: 表示地址), 其數據爲internet地址128.32.137.3.
此迴應UDP數據包, 包括273字節的數據(不包括UPD和IP的頭部數據). op字段和rcode字段被忽略(nt: op的實際值爲Query, rcode, 即
response code的實際值爲NoError), 相同被忽略的字段還有class 字段(nt | rt: 其值爲C_IN, 這也是A類型記錄默認取值)
第二行表示: helios 對h2opolo 所發送的2號查詢請求作了迴應. 迴應中, rcode編碼爲NXDomain(nt: 表示不存在的域)), 沒有回答記錄,
但包括一個名稱server記錄, 不包括權威server記錄(nt | ck: 從上文來看, 此處的authority records 就是上文中相應的additional
records). '*'表示權威server回答標誌被設置(nt: 從而additional records就表示的是authority records).
由於沒有回答記錄, type, class, data字段都被忽略.
flag字段還有可能出現其它一些字符, 比方'-'(nt: 表示可遞歸地查詢, 即RA 標誌沒有被設置), '|'(nt: 表示被截斷的消息, 即TC 標誌
被置位). 假設應答(nt | ct: 可理解爲, 包括名稱服務應答的UDP數據包, tcpdump知道這類數據包該如何解析其數據)的'question'段一個條
目(entry)都不包括(nt: 每個條目的含義, 需補充),'[nq]' 會被打印出來.
要注意的是:名稱server的請求和應答數據量比較大, 而默認的68字節的抓取長度(nt: snaplen, 可理解爲tcpdump的一個設置選項)可能不足以抓取
數據包的全部內容. 假設你真的需要細緻查看名稱server的負載, 可以經過tcpdump 的-s 選項來擴大snaplen值.
tcpdump 已可以對SMB/CIFS/NBT相關應用的數據包內容進行解碼(nt: 分別爲'Server Message Block Common', 'Internet File System'
'在TCP/IP上實現的網絡協議NETBIOS的簡稱'. 這幾個服務一般使用UDP的137/138以及TCP的139port). 原來的對IPX和NetBEUI SMB數據包的
解碼能力依舊可以被使用(nt: NetBEUI爲NETBIOS的加強版本號).
tcpdump默認僅僅依照最簡約模式對對應數據包進行解碼, 假設咱們想要詳盡的解碼信息可以使用其-v 啓動選現. 要注意的是, -v 會產生很具體的信息,
比方對單一的一個SMB數據包, 將產生一屏幕或不少其它的信息, 因此此選項, 確有需要才使用.
關於SMB數據包格式的信息, 以及每個域的含義可以參看www.cifs.org 或者samba.org 鏡像網站的pub/samba/specs/ 文件夾. linux 上的SMB 補丁
(nt | rt: patch)由 Andrew Tridgell (tridge@samba.org)提供.
NFS 請求和迴應
tcpdump對Sun NFS(網絡文件系統)請求和迴應的UDP數據包有例如如下格式的打印輸出:
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向主機wrl發送了一個'交換請求'(nt: transaction), 此請求的id爲6709(注意, 主機名字後是交換
請求id號, 而不是源port號). 此請求數據爲112字節, 當中不包含UDP和IP頭部的長度. 操做類型爲readlink(nt: 即此操做爲讀符號連接操做),
操做參數爲fh 21,24/10.73165(nt: 可按實際執行環境, 解析例如如下, fd 表示描寫敘述的爲文件句柄, 21,24 表示此句柄所相應設
備的主/從設備號對, 10表示此句柄所相應的i節點編號(nt:每個文件都會在操做系統中相應一個i節點, 限於unix類系統中),
73165是一個編號(nt: 可理解爲標識此請求的一個隨機數, 詳細含義需補充)).
第二行中, wrl 作了'ok'的迴應, 並且在results 字段中返回了sushi想要讀的符號鏈接的真實文件夾(nt: 即sushi要求讀的符號鏈接事實上是一個文件夾).
第三行代表: sushi 再次請求 wrl 在'fh 9,74/4096.6878'所描寫敘述的文件夾中查找'xcolors'文件. 需要注意的是, 每行所顯示的數據含義依賴於當中op字段的
類型(nt: 不一樣op 所相應args 含義不一樣樣), 其格式遵循NFS 協議, 追求簡潔明瞭.
假設tcpdump 的-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, length, 以及fragmentation 域, 但在此例中, 都略過了(nt: 可理解爲,簡潔起見, 作了刪減))
在第一行, sushi 請求wrl 從文件 21,11/12.195(nt: 格式在上面有描寫敘述)中, 自偏移24576字節處開始, 讀取8192字節數據.
Wrl 迴應讀取成功; 由於第二行僅僅是迴應請求的開頭片斷, 因此僅僅包括1472字節(其它的數據將在接着的reply片斷中到來, 但這些數據包不會再有NFS
頭, 甚至UDP頭信息也爲空(nt: 源和目的應該要有), 這將致使這些片斷不能知足過濾條件, 從而沒有被打印). -v 選項除了顯示文件數據信息, 還會顯示
附加顯示文件屬性信息: file type(文件類型, ''REG'' 表示普通文件), file mode(文件存取模式, 8進製表示的), uid 和gid(nt: 文件屬主和
組屬主), file size (文件大小).
假設-v 標誌被屢次反覆給出(nt: 如-vv)。 tcpdump會顯示更加具體的信息.
必須要注意的是, NFS 請求包中數據比較多, 假設tcpdump 的snaplen(nt: 抓取長度) 取過短將不能顯示其具體信息. 可以使用
'-s 192'來添加snaplen, 這可用以監測NFS應用的網絡負載(nt: traffic).
NFS 的迴應包並不嚴格的緊隨以前對應的請求包(nt: RPC operation). 從而, tcpdump 會跟蹤近期收到的一系列請求包, 再經過其
交換序號(nt: transaction ID)與對應請求包相匹配. 這可能產生一個問題, 假設迴應包來得太遲, 超出tcpdump 對對應請求包的跟蹤範圍,
該回應包將不能被分析.
AFS(nt: Andrew 文件系統, Transarc , 未知, 需補充)請求和迴應有例如如下的答應
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 向pike 發送了一個RX數據包.
這是一個對於文件服務的請求數據包(nt: RX data packet, 發送數據包 , 可理解爲發送包過去, 從而請求對方的服務), 這也是一個RPC
調用的開始(nt: RPC, remote procedure call). 此RPC 請求pike 運行rename(nt: 重命名) 操做, 並指定了相關的參數:
原文件夾描寫敘述符爲536876964/1/1, 原文件名稱爲 '.newsrc.new', 新文件夾描寫敘述符爲536876964/1/1, 新文件名稱爲 '.newsrc'.
主機pike 對此rename操做的RPC請求做了迴應(迴應表示rename操做成功, 因爲迴應的是包括數據內容的包而不是異常包).
通常來講, 所有的'AFS RPC'請求被顯示時, 會被冠以一個名字(nt: 即decode, 解碼), 這個名字每每就是RPC請求的操做名.
並且, 這些RPC請求的部分參數在顯示時, 也會被冠以一個名字(nt | rt: 即decode, 解碼, 通常來講也是取名也很是直接, 比方,
一個interesting 參數, 顯示的時候就會直接是'interesting', 含義拗口, 需再翻).
這樣的顯示格式的設計初衷爲'一看就懂', 但對於不熟悉AFS 和 RX 工做原理的人可能不是很是
實用(nt: 仍是不用管, 書面嚇嚇你的, 往下看便可).
假設 -v(具體)標誌被反覆給出(nt: 如-vv), tcpdump 會打印出確認包(nt: 可理解爲, 與應答包有差異的包)以及附加頭部信息
(nt: 可理解爲, 所有包, 而不不過確認包的附加頭部信息), 比方, RX call ID(請求包中'請求調用'的ID),
call number('請求調用'的編號), sequence number(nt: 包順序號),
serial number(nt | rt: 可理解爲與包中數據相關的還有一個順信號, 詳細含義需補充), 請求包的標識. (nt: 接下來一段爲反覆描寫敘述,
因此略去了), 此外確認包中的MTU協商信息也會被打印出來(nt: 確認包爲相對於請求包的確認包, Maximum Transmission Unit, 最大傳輸單元).
假設 -v 選項被反覆了三次(nt: 如-vvv), 那麼AFS應用類型數據包的'安全索引'('security index')以及'服務索引'('service id')將會
被打印.
對於表示異常的數據包(nt: abort packet, 可理解爲, 此包就是用來通知接受者某種異常已發生), tcpdump 會打印出錯誤號(error codes).
但對於Ubik beacon packets(nt: Ubik 燈塔指示包, Ubik可理解爲特殊的通訊協議, beacon packets, 燈塔數據包, 可理解爲指明通訊中
關鍵信息的一些數據包), 錯誤號不會被打印, 因爲對於Ubik 協議, 異常數據包不是表示錯誤, 相反倒是表示一種確定應答(nt: 即, yes vote).
AFS 請求數據量大, 參數也多, 因此要求tcpdump的 snaplen 比較大, 通常可經過啓動tcpdump時設置選項'-s 256' 來增大snaplen, 以
監測AFS 應用通訊負載.
AFS 迴應包並不顯示標識RPC 屬於何種遠程調用. 從而, tcpdump 會跟蹤近期一段時間內的請求包, 並經過call number(調用編號), service ID
(服務索引) 來匹配收到的迴應包. 假設迴應包不是針對近期一段時間內的請求包, tcpdump將沒法解析該包.
(nt | rt: DDP in UDP可理解爲, DDP, The AppleTalk Data Delivery Protocol,
至關於支持KIP AppleTalk協議棧的網絡層協議, 而DDP 自己又是經過UDP來傳輸的,
即在UDP 上實現的用於其它網絡的網絡層。KIP AppleTalk是蘋果公司開發的整套網絡協議棧).
AppleTalk DDP 數據包被封裝在UDP數據包中, 其解封裝(nt: 至關於解碼)和對應信息的轉儲也遵循DDP 包規則.
(nt:encapsulate, 封裝, 至關於編碼, de-encapsulate, 解封裝, 至關於解碼, dump, 轉儲, 一般就是指對其信息進行打印).
/etc/atalk.names 文件裏包括了AppleTalk 網絡和節點的數字標識到名稱的相應關係. 其文件格式一般例如如下所看到的:
number name
1.254 ether
16.1 icsd-net
1.254.110 ace
頭兩行表示有兩個AppleTalk 網絡. 第三行給出了特定網絡上的主機(一個主機會用3個字節來標識,
而一個網絡的標識一般僅僅有兩個字節, 這也是二者標識的主要差異)(nt: 1.254.110 可理解爲ether網絡上的ace主機).
標識與其相應的名字之間必須要用空白分開. 除了以上內容, /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 主機/網絡的條目, 數據包的網絡地址將以數字形式顯示).
在第一行中, 網絡144.1上的節點209經過2port,向網絡icsd-net上監聽在220port的112節點發送了一個NBP應用數據包
(nt | rt: NBP, name binding protocol, 名稱綁定協議, 從數據來看, NBPserver會在port2提供此服務.
'DDP port 2' 可理解爲'DDP 相應傳輸層的port2', DDP自己沒有port的概念, 這點未肯定, 需補充).
第二行與第一行相似, 僅僅是源的全部地址可用'office'進行標識.
第三行表示: jssmag網絡上的149節點經過235向icsd-net網絡上的所有節點的2port(NBPport)發送了數據包.(需要注意的是,
在AppleTalk 網絡中假設地址中沒有節點, 則表示廣播地址, 從而節點標識和網絡標識最好在/etc/atalk.names有所差異.
nt: 不然一個標識x.port 沒法肯定x是指一個網絡上所有主機的port口仍是指定主機x的port口).
tcpdump 可解析NBP (名稱綁定協議) and 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
第一行表示: 網絡icsd-net 中的節點112 經過220port向網絡jssmag 中所有節點的port2發送了對'LaserWriter'的名稱查詢請求(nt:
此處名稱可理解爲一個資源的名稱, 比方打印機). 此查詢請求的序列號爲190.
第二行表示: 網絡jssmag 中的節點209 經過2port向icsd-net.112節點的port220進行了迴應: 我有'LaserWriter'資源, 其資源名稱
爲'RM1140', 並且在port250上提供改資源的服務. 此迴應的序列號爲190, 相應以前查詢的序列號.
第三行也是對第一行請求的迴應: 節點techpit 經過2port向icsd-net.112節點的port220進行了迴應:我有'LaserWriter'資源, 其資源名稱
爲'techpit', 並且在port186上提供改資源的服務. 此迴應的序列號爲190, 相應以前查詢的序列號.
ATP 數據包的顯示格式例如如下:
jssmag.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-resp 12266:5 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000
helios.132 > jssmag.209.165: 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 向節點helios 發送了一個會話編號爲12266的請求包, 請求helios
迴應8個數據包(這8個數據包的順序號爲0-7(nt: 順序號與會話編號不一樣, 後者爲一次完整傳輸的編號,
前者爲該傳輸中每個數據包的編號. transaction, 會話, 一般也被叫作傳輸)). 行尾的16進制數字表示
該請求包中'userdata'域的值(nt: 從下文來看, 這並無把所有用戶數據都打印出來 ).
Helios 迴應了8個512字節的數據包. 跟在會話編號(nt: 12266)後的數字表示該數據包在該會話中的順序號.
括號裏的數字表示該數據包中數據的大小, 這不包含atp 的頭部. 在順序號爲7數據包(第8行)外帶了一個'*'號,
表示該數據包的EOM 標誌被設置了.(nt: EOM, End Of Media, 可理解爲, 表示一次會話的數據迴應完成).
接下來的第9行表示, Jssmag.209 又向helios 提出了請求: 順序號爲3以及5的數據包請又一次傳送. Helios 收到這個
請求後又一次發送了這個兩個數據包, jssmag.209 再次收到這兩個數據包以後, 主動結束(release)了此會話.
在最後一行, jssmag.209 向helios 發送了開始下一次會話的請求包. 請求包中的'*'表示該包的XO 標誌沒有被設置.
(nt: XO, exactly once, 可理解爲在該會話中, 數據包在接受方僅僅被精確地處理一次, 就算對方反覆傳送了該數據包,
接收方也僅僅會處理一次, 這需要用到特別設計的數據包接收和處理機制).
(nt: 指把一個IP數據包分紅多個IP數據包)
碎片IP數據包(nt: 即一個大的IP數據包破碎後生成的小IP數據包)有例如如下兩種顯示格式.
(frag id:size@offset+)
(frag id:size@offset)
(第一種格式表示, 此碎片以後還有興許碎片. 另一種格式表示, 此碎片爲最後一個碎片.)
id 表示破碎編號(nt: 從下文來看, 會爲每個要破碎的大IP包分配一個破碎編號, 以便區分每個小碎片是否由同一數據包破碎而來).
size 表示此碎片的大小 , 不包括碎片頭部數據. offset表示此碎片所含數據在原始整個IP包中的偏移((nt: 從下文來看,
一個IP數據包是做爲一個整體被破碎的, 包含頭和數據, 而不只僅是數據被切割).
每個碎片都會使tcpdump產生對應的輸出打印. 第一個碎片包括了高層協議的頭數據(nt:從下文來看, 被破碎IP數據包中對應tcp頭以及
IP頭都放在了第一個碎片中 ), 從而tcpdump會針對第一個碎片顯示這些信息, 並接着顯示此碎片自己的信息. 其後的一些碎片並不包括
高層協議頭信息, 從而僅僅會在顯示源和目的以後顯示碎片自己的信息. 下面有一個樣例: 這是一個從arizona.edu 到lbl-rtsg.arpa
途經CSNET網絡(nt: CSNET connection 可理解爲創建在CSNET 網絡上的鏈接)的ftp應用通訊片斷:
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
有幾點值得注意:
第一, 第二行的打印中, 地址後面沒有port號.
這是因爲TCP協議信息都放到了第一個碎片中, 當顯示第二個碎片時, 咱們沒法知道此碎片所相應TCP包的順序號.
第二, 從第一行的信息中, 可以發現arizona需要向rtsg發送308字節的用戶數據, 而事實是, 對應IP包經破碎後會總共產生512字節
數據(第一個碎片包括308字節的數據, 第二個碎片包括204個字節的數據, 這超過了308字節). 假設你在查找數據包的順序號空間中的
一些空洞(nt: hole,空洞, 指數據包之間的順序號沒有上下銜接上), 512這個數據就足夠使你迷茫一陣(nt: 事實上僅僅要關注308便可,
沒必要關注破碎後的數據總量).
一個數據包(nt | rt: 指IP數據包)假設帶有非IP破碎標誌, 則顯示時會在最後顯示'(DF)'.(nt: 意味着此IP包沒有被破碎過).
tcpdump的所有輸出打印行中都會默認包括時間戳信息.
時間戳信息的顯示格式例如如下
hh:mm:ss.frac (nt: 小時:分鐘:秒.(nt: frac未知, 需補充))
此時間戳的精度與內核時間精度一致, 反映的是內核第一次看到相應數據包的時間(nt: saw, 就能夠對該數據包進行操做).
而數據包從物理線路傳遞到內核的時間, 以及內核花費在此包上的中斷處理時間都沒有算進來.
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碼方式顯示每個數據包(不會顯示數據包中鏈路層頭部信息). 在抓取包含網頁數據的數據包時, 可方便查看數據(nt: 即Handy for capturing web pages). -c count tcpdump將在接受到count個數據包後退出. -C file-size (nt: 此選項用於配合-w file 選項使用) 該選項使得tcpdump 在把原始數據包直接保存到文件裏以前, 檢查此文件大小是否超過file-size. 假設超過了, 將關閉此文件,另創一個文件繼續用於原始數據包的記錄. 新建立的文件名稱與-w 選項指定的文件名稱一致, 但文件名稱後多了一個數字.該數字會從1開始隨着新建立文件的增多而添加. file-size的單位是百萬字節(nt: 這裏指1,000,000個字節,並非1,048,576個字節, 後者是以1024字節爲1k, 1024k字節爲1M計算所得, 即1M=1024 * 1024 = 1,048,576) -d 以easy閱讀的形式,在標準輸出上打印出編排過的包匹配碼, 隨後tcpdump中止.(nt | rt: human readable, easy閱讀的,通常是指以ascii碼來打印一些信息. compiled, 編排過的. packet-matching code, 包匹配碼,含義未知, 需補充) -dd 以C語言的形式打印出包匹配碼. -ddd 以十進制數的形式打印出包匹配碼(會在包匹配碼以前有一個附加的'count'前綴). -D 打印系統中所有tcpdump可以在其上進行抓包的網絡接口. 每個接口會打印出數字編號, 對應的接口名字, 以及可能的一個網絡接口描寫敘述. 當中網絡接口名字和數字編號可以用在tcpdump 的-i flag 選項(nt: 把名字或數字取代flag), 來指定要在其上抓包的網絡接口. 此選項在不支持接口列表命令的系統上很是實用(nt: 比方, Windows 系統, 或缺少 ifconfig -a 的UNIX系統); 接口的數字編號在windows 2000 或其後的系統中很是實用, 因爲這些系統上的接口名字比較複雜, 而不易使用. 假設tcpdump編譯時所依賴的libpcap庫太老,-D 選項不會被支持, 因爲當中缺少 pcap_findalldevs()函數. -e 每行的打印輸出中將包含數據包的數據鏈路層頭部信息 -E spi@ipaddr algo:secret,... 可經過spi@ipaddr algo:secret 來解密IPsec ESP包(nt | rt:IPsec Encapsulating Security Payload,IPsec 封裝安全負載, IPsec可理解爲, 一整套對ip數據包的加密協議, ESP 爲整個IP 數據包或當中上層協議部分被加密後的數據,前者的工做模式稱爲隧道模式; 後者的工做模式稱爲傳輸模式 . 工做原理, 另需補充). 需要注意的是, 在終端啓動tcpdump 時, 可以爲IPv4 ESP packets 設置密鑰(secret). 可用於加密的算法包含des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者沒有(none).默認的是des-cbc(nt: des, Data Encryption Standard, 數據加密標準, 加密算法未知, 另需補充).secret 爲用於ESP 的密鑰, 使用ASCII 字符串方式表達. 假設以 0x 開頭, 該密鑰將以16進制方式讀入. 該選項中ESP 的定義遵循RFC2406, 而不是 RFC1827. 並且, 此選項僅僅是用來調試的, 不推薦以真實密鑰(secret)來使用該選項, 因爲這樣不安全: 在命令行中輸入的secret 可以被其它人經過ps 等命令查看到. 除了以上的語法格式(nt: 指spi@ipaddr algo:secret), 還可以在後面加入一個語法輸入文件名稱字供tcpdump 使用(nt:即把spi@ipaddr algo:secret,... 中...換成一個語法文件名稱). 此文件在接受到第一個ESP 包時會打開此文件, 因此最好此時把賦予tcpdump 的一些特權取消(nt: 可理解爲, 這樣防範以後, 當該文件爲惡意編寫時,不至於形成過大損害). -f 顯示外部的IPv4 地址時(nt: foreign IPv4 addresses, 可理解爲, 非本機ip地址), 採用數字方式而不是名字.(此選項是用來對付Sun公司的NISserver的缺陷(nt: NIS, 網絡信息服務, tcpdump 顯示外部地址的名字時會用到她提供的名稱服務): 此NISserver在查詢非本地地址名字時,常常會陷入無盡的查詢循環). 因爲對外部(foreign)IPv4地址的測試需要用到本地網絡接口(nt: tcpdump 抓包時用到的接口)及其IPv4 地址和網絡掩碼. 假設此地址或網絡掩碼不可用, 或者此接口根本就沒有設置對應網絡地址和網絡掩碼(nt: linux 下的 'any' 網絡接口就不需要設置地址和掩碼, 只是此'any'接口可以收到系統中所有接口的數據包), 該選項不能正常工做. -F file 使用file 文件做爲過濾條件表達式的輸入, 此時命令行上的輸入將被忽略. -i interface 指定tcpdump 需要監聽的接口. 假設沒有指定, tcpdump 會從系統接口列表中搜尋編號最小的已配置好的接口(不包含 loopback 接口).一但找到第一個符合條件的接口, 搜尋當即結束. 在採用2.2版本號或以後版本號內核的Linux 操做系統上, 'any' 這個虛擬網絡接口可被用來接收所有網絡接口上的數據包(nt: 這會包含目的是該網絡接口的, 也包含目的不是該網絡接口的). 需要注意的是假設真實網絡接口不能工做在'混雜'模式(promiscuous)下,則沒法在'any'這個虛擬的網絡接口上抓取其數據包. 假設 -D 標誌被指定, tcpdump會打印系統中的接口編號。而該編號就可用於此處的interface 參數. -l 對標準輸出進行行緩衝(nt: 使標準輸出設備遇到一個換行符就當即把這行的內容打印出來).在需要同一時候觀察抓包打印以及保存抓包記錄的時候很是實用. 比方, 可經過下面命令組合來達到此目的: ``tcpdump -l | tee dat'' 或者 ``tcpdump -l > dat & tail -f dat''.(nt: 前者使用tee來把tcpdump 的輸出同一時候放到文件dat和標準輸出中, 然後者經過重定向操做'>', 把tcpdump的輸出放到dat 文件裏, 同一時候經過tail把dat文件裏的內容放到標準輸出中) -L 列出指定網絡接口所支持的數據鏈路層的類型後退出.(nt: 指定接口經過-i 來指定) -m module 經過module 指定的file 裝載SMI MIB 模塊(nt: SMI,Structure of Management Information, 管理信息結構MIB, Management Information Base, 管理信息庫. 可理解爲, 這二者用於SNMP(Simple Network Management Protoco)協議數據包的抓取. 具體SNMP 的工做原理未知, 另需補充). 此選項可屢次使用, 從而爲tcpdump 裝載不一樣的MIB 模塊. -M secret 假設TCP 數據包(TCP segments)有TCP-MD5選項(在RFC 2385有相關描寫敘述), 則爲其摘要的驗證指定一個公共的密鑰secret. -n 不正確地址(比方, 主機地址, port號)進行數字表示到名字表示的轉換. -N 不打印出host 的域名部分. 比方, 假設設置了此選現, tcpdump 將會打印'nic' 而不是 'nic.ddn.mil'. -O 不啓用進行包匹配時所用的優化代碼. 當懷疑某些bug是由優化代碼引發的, 此選項將很是實用. -p 普通狀況下, 把網絡接口設置爲非'混雜'模式. 但必須注意 , 在特殊狀況下此網絡接口仍是會以'混雜'模式來工做; 從而, '-p' 的設與不設, 不能當作下面選現的代名詞:'ether host {local-hw-add}' 或 'ether broadcast'(nt: 前者表示僅僅匹配以太網地址爲host 的包, 後者表示匹配以太網地址爲廣播地址的數據包). -q 高速(或許用'安靜'更好?)打印輸出. 即打印很是少的協議相關信息, 從而輸出行都比較簡短. -R 設定tcpdump 對 ESP/AH 數據包的解析依照 RFC1825而不是RFC1829(nt: AH, 認證頭, ESP, 安全負載封裝, 這二者會用在IP包的安全傳輸機制中). 假設此選項被設置, tcpdump 將不會打印出'禁止中繼'域(nt: relay prevention field). 另外,因爲ESP/AH規範中沒有規定ESP/AH數據包必須擁有協議版本號號域,因此tcpdump不能從收到的ESP/AH數據包中推導出協議版本號號. -r file 從文件file 中讀取包數據. 假設file 字段爲 '-' 符號, 則tcpdump 會從標準輸入中讀取包數據. -S 打印TCP 數據包的順序號時, 使用絕對的順序號, 而不是相對的順序號.(nt: 相對順序號可理解爲, 相對第一個TCP 包順序號的差距,比方, 接受方收到第一個數據包的絕對順序號爲232323, 對於後來接收到的第2個,第3個數據包, tcpdump會打印其序列號爲1, 2分別表示與第一個數據包的差距爲1 和 2. 而假設此時-S 選項被設置, 對於後來接收到的第2個, 第3個數據包會打印出其絕對順序號:232324, 232325). -s snaplen 設置tcpdump的數據包抓取長度爲snaplen, 假設不設置默認將會是68字節(而支持網絡接口分接頭(nt: NIT, 上文已有描寫敘述,可搜索'網絡接口分接頭'keyword找到那裏)的SunOS系列操做系統中默認的也是最小值是96).68字節對於IP, ICMP(nt: Internet Control Message Protocol,因特網控制報文協議), TCP 以及 UDP 協議的報文已足夠, 但對於名稱服務(nt: 可理解爲dns, nis等服務), NFS服務相關的數據包會產生包截短. 假設產生包截短這樣的狀況, tcpdump的對應打印輸出行中會出現''[|proto]''的標誌(proto 實際會顯示爲被截短的數據包的相關協議層次). 需要注意的是, 採用長的抓取長度(nt: snaplen比較大), 會添加包的處理時間, 並且會下降tcpdump 可緩存的數據包的數量。 從而會致使數據包的丟失. 因此, 在能抓取咱們想要的包的前提下, 抓取長度越小越好.把snaplen 設置爲0 意味着讓tcpdump本身主動選擇合適的長度來抓取數據包. -T type 強制tcpdump按type指定的協議所描寫敘述的包結構來分析收到的數據包. 眼下已知的type 可取的協議爲: aodv (Ad-hoc On-demand Distance Vector protocol, 按需距離向量路由協議, 在Ad hoc(點對點模式)網絡中使用), cnfp (Cisco NetFlow protocol), rpc(Remote Procedure Call), rtp (Real-Time Applications protocol), rtcp (Real-Time Applications con-trol protocol), snmp (Simple Network Management Protocol), tftp (Trivial File Transfer Protocol, 碎文件協議), vat (Visual Audio Tool, 可用於在internet 上進行電 視電話會議的應用層協議), 以及wb (distributed White Board, 可用於網絡會議的應用層協議). -t 在每行輸出中不打印時間戳 -tt 不正確每行輸出的時間進行格式處理(nt: 這樣的格式一眼可能看不出其含義, 如時間戳打印成1261798315) -ttt tcpdump 輸出時, 每兩行打印之間會延遲一個段時間(以毫秒爲單位) -tttt 在每行打印的時間戳以前加入日期的打印 -u 打印出未加密的NFS 句柄(nt: handle可理解爲NFS 中使用的文件句柄, 這將包含目錄和目錄中的文件) -U 使得當tcpdump在使用-w 選項時, 其文件寫入與包的保存同步.(nt: 即, 當每個數據包被保存時, 它將及時被寫入文件裏,而不是等文件的輸出緩衝已滿時才真正寫入此文件) -U 標誌在老版本號的libcap庫(nt: tcpdump 所依賴的報文捕獲庫)上不起做用, 因爲當中缺少pcap_cump_flush()函數. -v 當分析和打印的時候, 產生具體的輸出. 比方, 包的生存時間, 標識, 總長度以及IP包的一些選項. 這也會打開一些附加的包完整性檢測, 比方對IP或ICMP包頭部的校驗和. -vv 產生比-v更具體的輸出. 比方, NFS迴應包中的附加域將會被打印, SMB數據包也會被全然解碼. -vvv 產生比-vv更具體的輸出. 比方, telent 時所使用的SB, SE 選項將會被打印, 假設telnet同一時候使用的是圖形界面, 其對應的圖形選項將會以16進制的方式打印出來(nt: telnet 的SB,SE選項含義未知, 另需補充). -w 把包數據直接寫入文件而不進行分析和打印輸出. 這些包數據可在隨後經過-r 選項來又一次讀入並進行分析和打印. -W filecount 此選項與-C 選項配合使用, 這將限制可打開的文件數目, 並且當文件數據超過這裏設置的限制時, 依次循環替代以前的文件, 這至關於一個擁有filecount 個文件的文件緩衝池. 同一時候, 該選項會使得每個文件名稱的開頭會出現足夠多並用來佔位的0, 這可以方便這些文件被正確的排序. -x 當分析和打印時, tcpdump 會打印每個包的頭部數據, 同一時候會以16進制打印出每個包的數據(但不包含鏈接層的頭部).總共打印的數據大小不會超過整個數據包的大小與snaplen 中的最小值. 必需要注意的是, 假設高層協議數據沒有snaplen 這麼長,並且數據鏈路層(比方, Ethernet層)有填充數據, 則這些填充數據也會被打印.(nt: so for link layers that pad, 未能銜接理解和翻譯, 需補充 ) -xx tcpdump 會打印每個包的頭部數據, 同一時候會以16進制打印出每個包的數據, 當中包含數據鏈路層的頭部. -X 當分析和打印時, tcpdump 會打印每個包的頭部數據, 同一時候會以16進制和ASCII碼形式打印出每個包的數據(但不包含鏈接層的頭部).這對於分析一些新協議的數據包很是方便. -XX 當分析和打印時, tcpdump 會打印每個包的頭部數據, 同一時候會以16進制和ASCII碼形式打印出每個包的數據, 當中包含數據鏈路層的頭部.這對於分析一些新協議的數據包很是方便. -y datalinktype 設置tcpdump 僅僅捕獲數據鏈路層協議類型是datalinktype的數據包 -Z user 使tcpdump 放棄本身的超級權限(假設以root用戶啓動tcpdump, tcpdump將會有超級用戶權限), 並把當前tcpdump的用戶ID設置爲user, 組ID設置爲user首要所屬組的ID(nt: tcpdump 此處可理解爲tcpdump 執行以後對應的進程) 此選項也可在編譯的時候被設置爲默認打開.(nt: 此時user 的取值未知, 需補充)
該表達式用於決定哪些數據包將被打印. 假設不給定條件表達式, 網絡上所有被捕獲的包都會被打印,不然, 僅僅有知足條件表達式的數據包被打印.(nt: all packets, 可理解爲, 所有被指定接口捕獲的數據包).
表達式由一個或多個'表達元'組成(nt: primitive, 表達元, 可理解爲組成表達式的基本元素). 一個表達元一般由一個或多個修飾符(qualifiers)後跟一個名字或數字表示的id組成(nt: 即, 'qualifiers id').有三種不一樣類型的修飾符:type, dir以及 proto.
type 修飾符指定id 所表明的對象類型, id可以是名字也可以是數字. 可選的對象類型有: host, net, port 以及portrange(nt: host 代表id表示主機, net 代表id是網絡, port 代表id是端而portrange 代表id 是一個端口範圍). 如, 'host foo', 'net 128.3', 'port 20', 'portrange 6000-6008'(nt: 分別表示主機 foo,網絡 128.3, 端口 20, 端口範圍 6000-6008). 假設不指定type 修飾符, id默認的修飾符爲host. dir 修飾符描寫敘述id 所相應的傳輸方向, 即發往id 仍是從id 接收(nt: 而id 究竟指什麼需要看其前面的type 修飾符).可取的方向爲: src, dst, src 或 dst, src並且dst.(nt:分別表示, id是傳輸源, id是傳輸目的, id是傳輸源或者傳輸目的, id是傳輸源並且是傳輸目的). 好比, 'src foo','dst net 128.3', 'src or dst port ftp-data'.(nt: 分別表示符合條件的數據包中, 源主機是foo, 目的網絡是128.3, 源或目的端口爲 ftp-data).假設不指定dir修飾符, id 默認的修飾符爲src 或 dst.對於鏈路層的協議,比方SLIP(nt: Serial Line InternetProtocol, 串聯線路網際網絡協議), 以及linux下指定'any' 設備, 並指定'cooked'(nt | rt: cooked 含義未知, 需補充) 抓取類型, 或其它設備類型,可以用'inbound' 和 'outbount' 修飾符來指定想要的傳輸方向. proto 修飾符描寫敘述id 所屬的協議. 可選的協議有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp以及 upd.(nt | rt: ether, fddi, tr, 詳細含義未知, 需補充. 可理解爲物理以太網傳輸協議, 光纖分佈數據網傳輸協議,以及用於路由跟蹤的協議. wlan, 無線局域網協議; ip,ip6 即一般的TCP/IP協議棧中所使用的ipv4以及ipv6網絡層協議;arp, rarp 即地址解析協議,反向地址解析協議; decnet, Digital Equipment Corporation開發的, 最先用於PDP-11 機器互聯的網絡協議; tcp and udp, 即一般TCP/IP協議棧中的兩個傳輸層協議). 好比, `ether src foo', `arp net 128.3', `tcp port 21', `udp portrange 7000-7009'分別表示 '從以太網地址foo 來的數據包','發往或來自128.3網絡的arp協議數據包', '發送或接收端口爲21的tcp協議數據包', '發送或接收端口範圍爲7000-7009的udp協議數據包'. 假設不指定proto 修飾符, 則默以爲與相應type匹配的修飾符. 好比, 'src foo' 含義是 '(ip or arp or rarp) src foo' (nt: 即, 來自主機foo的ip/arp/rarp協議數據包, 默認type爲host),`net bar' 含義是`(ip or arp or rarp) net bar'(nt: 即, 來自或發往bar網絡的ip/arp/rarp協議數據包),`port 53' 含義是 `(tcp or udp) port 53'(nt: 即, 發送或接收端口爲53的tcp/udp協議數據包).(nt: 由於tcpdump 直接經過數據鏈路層的 BSD 數據包過濾器或 DLPI(datalink provider interface, 數據鏈層提供者接口)來直接得到網絡數據包, 其可抓取的數據包可涵蓋上層的各類協議, 包含arp, rarp, icmp(因特網控制報文協議),ip, ip6, tcp, udp, sctp(流控制傳輸協議). 對於修飾符後跟id 的格式,可理解爲, type id 是對包最主要的過濾條件: 即對包相關的主機, 網絡, 端口的限制;dir 表示對包的傳送方向的限制; proto表示對包相關的協議限制) 'fddi'(nt: Fiber Distributed Data Interface) 實際上與'ether' 含義同樣: tcpdump 會把他們看成一種''指定網絡接口上的數據鏈路層協議''. 如同ehter網(以太網), FDDI 的頭部一般也會有源, 目的, 以及包類型, 從而可以像ether網數據包同樣對這些域進行過濾. 此外, FDDI 頭部還有其它的域, 但不能被放到表達式中用來過濾 相同, 'tr' 和 'wlan' 也和 'ether' 含義一致, 上一段對fddi 的描寫敘述相同適用於tr(Token Ring) 和wlan(802.11 wireless LAN)的頭部. 對於802.11 協議數據包的頭部, 目的域稱爲DA, 源域稱爲 SA;而當中的 BSSID, RA, TA 域(nt | rt: 詳細含義需補充)不會被檢測(nt: 不能被用於包過慮表達式中).
除以上所描寫敘述的表達元('primitive'), 還有其它形式的表達元, 並且與上述表達元格式不一樣. 比方: gateway, broadcast, less, greater以及算術表達式(nt: 當中每一個都算一種新的表達元). 如下將會對這些表達元進行說明.
表達元之間還可以經過keywordand, or 以及 not 進行鏈接, 從而可組成比較複雜的條件表達式. 比方,`host foo and not port ftp and not port ftp-data'(nt: 其過濾條件可理解爲, 數據包的主機爲foo,並且port不是ftp(port21) 和ftp-data(port20, 常用port和名字的相應可在linux 系統中的/etc/service 文件裏找到)).
爲了表示方便, 相同的修飾符可以被省略, 如'tcp dst port ftp or ftp-data or domain' 與下面的表達式含義相同'tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.(nt: 其過濾條件可理解爲,包的協議爲tcp, 目的端口爲ftp 或 ftp-data 或 domain(端口53) ).
藉助括號以及對應操做符,可把表達元組合在一塊兒使用(由於括號是shell的特殊字符, 因此在shell腳本或終端中使用時必須對括號進行轉義, 即'(' 與')'需要分別表達成'\(' 與 '\)').
有效的操做符有:
否認操做 (`!' 或 `not') 與操做(`&&' 或 `and') 或操做(`||' 或 `or')
否認操做符的優先級別最高. 與操做和或操做優先級別一樣, 並且兩者的結合順序是從左到右. 要注意的是, 表達'與操做'時,
需要顯式寫出'and'操做符, 而不只僅是把先後表達元並列放置(nt: 兩者中間的'and' 操做符不可省略).
假設一個標識符前沒有keyword, 則表達式的解析過程當中近期用過的keyword(每每也是從左往右距離標識符近期的keyword)將被使用.比方,
not host vs and ace
是下面表達的精簡:
not host vs and host ace
而不是not (host vs or ace).(nt: 前二者表示, 所需數據包不是來自或發往host vs, 而是來自或發往ace.然後者表示數據包僅僅要不是來自或發往vs或ac都符合要求)
整個條件表達式可以被看成一個單獨的字符串參數也可以被看成空格切割的多個參數傳入tcpdump, 後者更方便些. 一般, 假設表達式中包括元字符(nt: 如正則表達式中的'*', '.'以及shell中的'('等字符), 不妨使用單獨字符串的方式傳入. 這時,整個表達式需要被單引號括起來. 多參數的傳入方式中, 所有參數終於仍是被空格串聯在一塊兒, 做爲一個字符串被解析.
(nt: True 在下面的描寫敘述中含義爲: 對應條件表達式中僅僅含有下面所列的一個特定表達元, 此時表達式爲真, 即條件獲得知足)
dst host host
假設IPv4/v6 數據包的目的域是host, 則與此相應的條件表達式爲真.host 可以是一個ip地址, 也可以是一個主機名.
src host host
假設IPv4/v6 數據包的源域是host, 則與此相應的條件表達式爲真.
host 可以是一個ip地址, 也可以是一個主機名.
host host
假設IPv4/v6數據包的源或目的地址是 host, 則與此相應的條件表達式爲真.以上的幾個host 表達式以前可以加入下面keyword:ip, arp, rarp, 以及 ip6.比方:
ip host host
也可以表達爲:
ether proto \ip and host host(nt: 這樣的表達方式在如下有說明, 當中ip以前需要有\來轉義,因爲ip 對tcpdump 來講已是一個keyword了.)
假設host 是一個擁有多個IP 的主機, 那麼不論什麼一個地址都會用於包的匹配(nt: 即發向host 的數據包的目的地址可以是這幾個IP中的不論什麼一個, 從host 接收的數據包的源地址也可以是這幾個IP中的不論什麼一個).
ether dst ehost
假設數據包(nt: 指tcpdump 可抓取的數據包, 包含ip 數據包, tcp數據包)的以太網目標地址是ehost,則與此相應的條件表達式爲真. Ehost 可以是/etc/ethers 文件裏的名字或一個數字地址(nt: 可經過 man ethers 看到對/etc/ethers 文件的描寫敘述, 例子中用的是數字地址)
ether src ehost
假設數據包的以太網源地址是ehost, 則與此相應的條件表達式爲真.
ether host ehost
假設數據包的以太網源地址或目標地址是ehost, 則與此相應的條件表達式爲真.
gateway host
假設數據包的網關地址是host, 則與此相應的條件表達式爲真. 需要注意的是, 這裏的網關地址是指以太網地址, 而不是IP 地址(nt | rt: I.e., 好比, 可理解爲'注意'.the Ethernet source or destination address, 以太網源和目標地址, 可理解爲, 指代上句中的'網關地址' ).host 必須是名字而不是數字, 並且必須在機器的'主機名-ip地址'以及'主機名-以太地址'兩大映射關係中 有其條目(前一映射關係可經過/etc/hosts文件, DNS 或 NIS獲得, 然後一映射關係可經過/etc/ethers 文件獲得. nt: /etc/ethers並不必定存在 , 可經過man ethers 看到其數據格式, 怎樣建立該文件, 未知,需補充).也就是說host 的含義是 ether host ehost 而不是 host host, 並且ehost必須是名字而不是數字.
眼下, 該選項在支持IPv6地址格式的配置環境中不起做用(nt: configuration, 配置環境, 可理解爲,通訊兩方的網絡配置).
dst net net
假設數據包的目標地址(IPv4或IPv6格式)的網絡號字段爲 net, 則與此相應的條件表達式爲真.
net 可以是從網絡數據庫文件/etc/networks 中的名字, 也可以是一個數字形式的網絡編號.
一個數字IPv4 網絡編號將以點分四元組(比方, 192.168.1.0), 或點分三元組(比方, 192.168.1 ), 或點分二元組(比方, 172.16), 或單一單元組(比方, 10)來表達;
相應於這四種狀況的網絡掩碼各自是:四元組:255.255.255.255(這也意味着對net 的匹配如同對主機地址(host)的匹配:地址的四個部分都用到了),三元組:255.255.255.0, 二元組: 255.255.0.0, 一元組:255.0.0.0.
對於IPv6 的地址格式, 網絡編號必須全部寫出來(8個部分必須全部寫出來); 對應網絡掩碼爲:
ff:ff:ff:ff:ff:ff:ff:ff, 因此IPv6 的網絡匹配是真正的'host'方式的匹配(nt | rt | rc:地址的8個部分都會用到,是否不屬於網絡的字節填寫0, 需接下來補充), 但同一時候需要一個網絡掩碼長度參數來詳細指定前面多少字節爲網絡掩碼(nt: 可經過如下的net net/len 來指定)
src net net
假設數據包的源地址(IPv4或IPv6格式)的網絡號字段爲 net, 則與此相應的條件表達式爲真.
net net
假設數據包的源或目的地址(IPv4或IPv6格式)的網絡號字段爲 net, 則與此相應的條件表達式爲真.
net net mask netmask
假設數據包的源或目的地址(IPv4或IPv6格式)的網絡掩碼與netmask 匹配, 則與此相應的條件表達式爲真.此選項以前還可以配合src和dst來匹配源網絡地址或目標網絡地址(nt: 比方 src net net mask 255.255.255.0).該選項對於ipv6 網絡地址無效.
net net/len
假設數據包的源或目的地址(IPv4或IPv6格式)的網絡編號字段的比特數與len一樣, 則與此相應的條件表達式爲真.此選項以前還可以配合src和dst來匹配源網絡地址或目標網絡地址(nt | rt | tt: src net net/24, 表示需要匹配源地址的網絡編號有24位的數據包).
dst port port
假設數據包(包含ip/tcp, ip/udp, ip6/tcp or ip6/udp協議)的目的port爲port, 則與此對應的條件表達式爲真.port 可以是一個數字也可以是一個名字(對應名字可以在/etc/services 中找到該名字, 也可以經過man tcp 和man udp來獲得相關描寫敘述信息 ). 假設使用名字, 則該名字對應的port號和對應使用的協議都會被檢查. 假設僅僅是使用一個數字port號,則僅僅有對應port號被檢查(比方, dst port 513 將會使tcpdump抓取tcp協議的login 服務和udp協議的who 服務數據包, 而port domain 將會使tcpdump 抓取tcp協議的domain 服務數據包, 以及udp 協議的domain 數據包)(nt | rt: ambiguous name is used 不可理解, 需補充).
src port port
假設數據包的源端口爲port, 則與此相應的條件表達式爲真.
port port
假設數據包的源或目的端口爲port, 則與此相應的條件表達式爲真.
dst portrange port1-port2
假設數據包(包含ip/tcp, ip/udp, ip6/tcp or ip6/udp協議)的目的端口屬於port1到port2這個端口範圍(包含port1, port2), 則與此相應的條件表達式爲真. tcpdump 對port1 和port2 解析與對port 的解析一致(nt:在dst port port 選項的描寫敘述中有說明).
src portrange port1-port2
假設數據包的源端口屬於port1到port2這個端口範圍(包含 port1, port2), 則與此相應的條件表達式爲真.
portrange port1-port2
假設數據包的源端口或目的端口屬於port1到port2這個端口範圍(包含 port1, port2), 則與此相應的條件表達式爲真.
以上關於port 的選項都可以在其前面加入keyword:tcp 或者udp, 比方:
tcp src port port
這將使tcpdump 僅僅抓取源端口是port 的tcp數據包.
less length
假設數據包的長度比length 小或等於length, 則與此相應的條件表達式爲真. 這與'len <= length' 的含義一致.
greater length
假設數據包的長度比length 大或等於length, 則與此相應的條件表達式爲真. 這與'len >= length' 的含義一致.
ip proto protocol
假設數據包爲ipv4數據包並且其協議類型爲protocol, 則與此相應的條件表達式爲真.
Protocol 可以是一個數字也可以是名字, 比方:icmp6, igmp, igrp(nt: Interior Gateway Routing Protocol,內部網關路由協議), pim(Protocol Independent Multicast, 獨立組播協議, 應用於組播路由器),ah, esp(nt: ah, 認證頭, esp 安全負載封裝, 這二者會用在IP包的安全傳輸機制中 ), vrrp(Virtual Router Redundancy Protocol, 虛擬路由器冗餘協議), udp, or tcp. 由於tcp , udp 以及icmp是tcpdump 的keyword,因此在這些協議名字以前必須要用\來進行轉義(假設在C-shell 中須要用\\來進行轉義). 注意此表達元不會把數據包中協議頭鏈中全部協議頭內容全部打印出來(nt: 實際上僅僅會打印指定協議的一些頭部信息, 比方可以用tcpdump -i eth0 'ip proto \tcp and host 192.168.3.144', 則僅僅打印主機192.168.3.144 發出或接收的數據包中tcp 協議頭所包括的信息)
ip6 proto protocol
假設數據包爲ipv6數據包並且其協議類型爲protocol, 則與此相應的條件表達式爲真.
注意此表達元不會把數據包中協議頭鏈中全部協議頭內容全部打印出來
ip6 protochain protocol
假設數據包爲ipv6數據包並且其協議鏈中包括類型爲protocol協議頭, 則與此相應的條件表達式爲真. 比方,
ip6 protochain 6
將匹配其協議頭鏈中擁有TCP 協議頭的IPv6數據包.此數據包的IPv6頭和TCP頭之間可能還會包括驗證頭, 路由頭, 或者逐跳尋徑選項頭.
由此所觸發的對應BPF(Berkeley Packets Filter, 可理解爲, 在數據鏈路層提供數據包過濾的一種機制)代碼比較繁瑣,
並且BPF優化代碼也未能照應到此部分, 從而此選項所觸發的包匹配可能會比較慢.
ip protochain protocol
與ip6 protochain protocol 含義一樣, 但這用在IPv4數據包.
ether broadcast
假設數據包是以太網廣播數據包, 則與此相應的條件表達式爲真. ether keyword是可選的.
ip broadcast
假設數據包是IPv4廣播數據包, 則與此相應的條件表達式爲真. 這將使tcpdump 檢查廣播地址是否符合全0和全1的一些約定,並查找網絡接口的網絡掩碼(網絡接口爲當時在其上抓包的網絡接口).
假設抓包所在網絡接口的網絡掩碼不合法, 或者此接口根本就沒有設置對應網絡地址和網絡。 亦或是在linux下的'any'網絡接口上抓包(此'any'接口可以收到系統中不止一個接口的數據包(nt: 實際上, 可理解爲系統中所有可用的接口)),網絡掩碼的檢查不能正常進行.
ether multicast
假設數據包是一個以太網多點廣播數據包(nt: 多點廣播, 可理解爲把消息同一時候傳遞給一組目的地址, 而不是網絡中所有地址,後者爲可稱爲廣播(broadcast)), 則與此相應的條件表達式爲真. keywordether 可以省略. 此選項的含義與下面條件表達式含義一致:`ether[0] & 1 != 0'(nt: 可理解爲, 以太網數據包中第0個字節的最低位是1, 這意味這是一個多點廣播數據包).
ip multicast
假設數據包是ipv4多點廣播數據包, 則與此相應的條件表達式爲真.
ip6 multicast
假設數據包是ipv6多點廣播數據包, 則與此相應的條件表達式爲真.
ether proto protocol
假設數據包屬於下面以太協議類型, 則與此相應的條件表達式爲真.
協議(protocol)字段, 可以是數字或下面所列出了名字: ip, ip6, arp, rarp, atalk(AppleTalk網絡協議),
aarp(nt: AppleTalk Address Resolution Protocol, AppleTalk網絡的地址解析協議),
decnet(nt: 一個由DEC公司所提供的網絡協議棧), sca(nt: 未知, 需補充),
lat(Local Area Transport, 區域傳輸協議, 由DEC公司開發的以太網主機互聯協議),
mopdl, moprc, iso(nt: 未知, 需補充), stp(Spanning tree protocol, 生成樹協議, 可用於防止網絡中產生連接循環),
ipx(nt: Internetwork Packet Exchange, Novell 網絡中使用的網絡層協議), 或者
netbeui(nt: NetBIOS Extended User Interface。可理解爲, 網絡基本輸入輸出系統接口擴展).
protocol字段可以是一個數字或下面協議名之中的一個:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat,
mopdl, moprc, iso, stp, ipx, 或者netbeui.
必須要注意的是標識符也是keyword, 從而必須經過'\'來進行轉義.
(SNAP:子網接入協議 (SubNetwork Access Protocol))
在光纖分佈式數據網絡接口(其表達元形式可以是'fddi protocol arp'), 令牌環網(其表達元形式可以是'tr protocol arp'),
以及IEEE 802.11 無線局域網(其表達元形式可以是'wlan protocol arp')中, protocol
標識符來自802.2 邏輯鏈路控制層頭,
在FDDI, Token Ring 或 802.1頭中會包括此邏輯鏈路控制層頭.
當以這些網絡上的對應的協議標識爲過濾條件時, tcpdump僅僅是檢查LLC頭部中以0x000000爲組成單元標識符(OUI, 0x000000
標識一個內部以太網)的一段'SNAP格式結構'中的protocol ID 域, 而不會管包中是否有一段OUI爲0x000000的'SNAP格式
結構'(nt: SNAP, SubNetwork Access Protocol,子網接入協議 ). 下面例外:
iso tcpdump 會檢查LLC頭部中的DSAP域(Destination service Access Point, 目標服務接入點)和
SSAP域(源服務接入點).(nt: iso 協議未知, 需補充)
stp 以及 netbeui
tcpdump 將會檢查LLC 頭部中的目標服務接入點(Destination service Access Point);
atalk
tcpdump 將會檢查LLC 頭部中以0x080007 爲OUI標識的'SNAP格式結構', 並會檢查AppleTalk etype域.
(nt: AppleTalk etype 是否位於SNAP格式結構中, 未知, 需補充).
此外, 在以太網中, 對於ether proto protocol 選項, tcpdump 會爲 protocol 所指定的協議檢查
以太網類型域(the Ethernet type field), 但下面這些協議除外:
iso, stp, and netbeui
tcpdump 將會檢查802.3 物理幀以及LLC 頭(這兩種檢查與FDDI, TR, 802.11網絡中的對應檢查一致);
(nt: 802.3, 理解爲IEEE 802.3, 其爲一系列IEEE 標準的集合. 此集合定義了有線以太網絡中的物理層以及數據
鏈路層的媒體接入控制子層. stp 在上文已有描寫敘述)
atalk
tcpdump 將會檢查以太網物理幀中的AppleTalk etype 域 , 同一時候也會檢查數據包中LLC頭部中的'SNAP格式結構'
(這兩種檢查與FDDI, TR, 802.11網絡中的對應檢查一致)
aarp tcpdump 將會檢查AppleTalk ARP etype 域, 此域或存在於以太網物理幀中, 或存在於LLC(由802.2 所定義)的
'SNAP格式結構'中, 當爲後者時, 該'SNAP格式結構'的OUI標識爲0x000000;
(nt: 802.2, 可理解爲, IEEE802.2, 當中定義了邏輯鏈路控制層(LLC), 該層相應於OSI 網絡模型中數據鏈路層的上層部分.
LLC 層爲使用數據鏈路層的用戶提供了一個統一的接口(通常用戶是網絡層). LLC層下面是媒體接入控制層(nt: MAC層,
相應於數據鏈路層的下層部分).該層的實現以及工做方式會依據不一樣物理傳輸媒介的不一樣而有所差異(比方, 以太網, 令牌環網,
光纖分佈數據接口(nt: 實際可理解爲一種光纖網絡), 無線局域網(802.11), 等等.)
ipx tcpdump 將會檢查物理以太幀中的IPX etype域, LLC頭中的IPX DSAP域。無LLC頭並對IPX進行了封裝的802.3幀,
以及LLC 頭部'SNAP格式結構'中的IPX etype 域(nt | rt: SNAP frame, 可理解爲, LLC 頭中的'SNAP格式結構'.
該含義屬初步理解階段, 需補充).
decnet src host
假設數據包中DECNET源地址爲host, 則與此相應的條件表達式爲真.
(nt:decnet, 由Digital Equipment Corporation 開發, 最先用於PDP-11 機器互聯的網絡協議)
decnet dst host
假設數據包中DECNET目的地址爲host, 則與此相應的條件表達式爲真.
(nt: decnet 在上文已有說明)
decnet host host
假設數據包中DECNET目的地址或DECNET源地址爲host, 則與此相應的條件表達式爲真.
(nt: decnet 在上文已有說明)
ifname interface
假設數據包已被標記爲從指定的網絡接口中接收的, 則與此相應的條件表達式爲真.
(此選項僅僅適用於被OpenBSD中pf程序作過標記的包(nt: pf, packet filter, 可理解爲OpenBSD中的防火牆程序))
on interface
與 ifname interface 含義一致.
rnr num
假設數據包已被標記爲匹配PF的規則, 則與此相應的條件表達式爲真.
(此選項僅僅適用於被OpenBSD中pf程序作過標記的包(nt: pf, packet filter, 可理解爲OpenBSD中的防火牆程序))
rulenum num
與 rulenum num 含義一致.
reason code
假設數據包已被標記爲包括PF的匹配結果代碼, 則與此相應的條件表達式爲真.有效的結果代碼有: match, bad-offset,
fragment, short, normalize, 以及memory.
(此選項僅僅適用於被OpenBSD中pf程序作過標記的包(nt: pf, packet filter, 可理解爲OpenBSD中的防火牆程序))
rset name
假設數據包已被標記爲匹配指定的規則集, 則與此相應的條件表達式爲真.
(此選項僅僅適用於被OpenBSD中pf程序作過標記的包(nt: pf, packet filter, 可理解爲OpenBSD中的防火牆程序))
ruleset name
與 rset name 含義一致.
srnr num
假設數據包已被標記爲匹配指定的規則集中的特定規則(nt: specified PF rule number, 特定規則編號, 即特定規則),
則與此相應的條件表達式爲真.(此選項僅僅適用於被OpenBSD中pf程序作過標記的包(nt: pf, packet filter, 可理解爲
OpenBSD中的防火牆程序))
subrulenum num
與 srnr 含義一致.
action act
假設包被記錄時PF會運行act指定的動做, 則與此相應的條件表達式爲真. 有效的動做有: pass, block.
(此選項僅僅適用於被OpenBSD中pf程序作過標記的包(nt: pf, packet filter, 可理解爲OpenBSD中的防火牆程序))
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui
與下面表達元含義一致:
ether proto p
p是以上協議中的一個.
lat, moprc, mopdl
與下面表達元含義一致:
ether proto p
p是以上協議中的一個. 必須要注意的是tcpdump眼下還不能分析這些協議.
vlan [vlan_id]
假設數據包爲IEEE802.1Q VLAN 數據包, 則與此相應的條件表達式爲真.
(nt: IEEE802.1Q VLAN, 即IEEE802.1Q 虛擬網絡協議, 此協議用於不一樣網絡的之間的互聯).
假設[vlan_id] 被指定, 則僅僅有數據包括有指定的虛擬網絡id(vlan_id), 則與此相應的條件表達式爲真.
要注意的是, 對於VLAN數據包, 在表達式中遇到的第一個vlankeyword會改變表達式中接下來keyword所相應數據包中數據的
開始位置(即解碼偏移). 在VLAN網絡體系中過濾數據包時, vlan [vlan_id]表達式可以被屢次使用. keywordvlan每出現一次都會添加
4字節過濾偏移(nt: 過濾偏移, 可理解爲上面的解碼偏移).
好比:
vlan 100 && vlan 200
表示: 過濾封裝在VLAN100中的VLAN200網絡上的數據包
再好比:
vlan && vlan 300 && ip
表示: 過濾封裝在VLAN300 網絡中的IPv4數據包, 而VLAN300網絡又被更外層的VLAN封裝
mpls [label_num]
假設數據包爲MPLS數據包, 則與此相應的條件表達式爲真.
(nt: MPLS, Multi-Protocol Label Switch, 多協議標籤交換, 一種在開放的通訊網上利用標籤引導傳輸數據的技術).
假設[label_num] 被指定, 則僅僅有數據包括有指定的標籤id(label_num), 則與此相應的條件表達式爲真.
要注意的是, 對於內含MPLS信息的IP數據包(即MPLS數據包), 在表達式中遇到的第一個MPLSkeyword會改變表達式中接下來keyword所相應數據包中數據的
開始位置(即解碼偏移). 在MPLS網絡體系中過濾數據包時, mpls [label_num]表達式可以被屢次使用. keywordmpls每出現一次都會添加
4字節過濾偏移(nt: 過濾偏移, 可理解爲上面的解碼偏移).
好比:
mpls 100000 && mpls 1024
表示: 過濾外層標籤爲100000 而層標籤爲1024的數據包
再如:
mpls && mpls 1024 && host 192.9.200.1
表示: 過濾發往或來自192.9.200.1的數據包, 該數據包的內層標籤爲1024, 且擁有一個外層標籤.
pppoed
假設數據包爲PPP-over-Ethernet的server探尋數據包(nt: Discovery packet,
其ethernet type 爲0x8863),則與此相應的條件表達式爲真.
(nt: PPP-over-Ethernet, 點對點以太網承載協議, 其點對點的鏈接創建分爲Discovery階段(地址發現) 和
PPPoE 會話創建階段 , discovery 數據包就是第一階段發出來的包. ethernet type
是以太幀裏的一個字段,用來指明應用於幀數據字段的協議)
pppoes
假設數據包爲PPP-over-Ethernet會話數據包(nt: ethernet type 爲0x8864, PPP-over-Ethernet在上文已有說明, 可搜索
keyword'PPP-over-Ethernet'找到其描寫敘述), 則與此相應的條件表達式爲真.
要注意的是, 對於PPP-over-Ethernet會話數據包, 在表達式中遇到的第一個pppoeskeyword會改變表達式中接下來keyword所相應數據包中數據的
開始位置(即解碼偏移).
好比:
pppoes && ip
表示: 過濾嵌入在PPPoE數據包中的ipv4數據包
tcp, udp, icmp
與下面表達元含義一致:
ip proto p or ip6 proto p
當中p 是以上協議之中的一個(含義分別爲: 假設數據包爲ipv4或ipv6數據包並且其協議類型爲 tcp,udp, 或icmp則與此對
應的條件表達式爲真)
iso proto protocol
假設數據包的協議類型爲iso-osi協議棧中protocol協議, 則與此相應的條件表達式爲真.(nt: [初解]iso-osi 網絡模型中每
層的詳細協議與tcp/ip對應層採用的協議不一樣. iso-osi各層中的詳細協議另需補充 )
protocol 可以是一個數字編號, 或下面名字中之中的一個:
clnp, esis, or isis.
(nt: clnp, Connectionless Network Protocol, 這是OSI網絡模型中網絡層協議 , esis, isis 未知, 需補充)
clnp, esis, isis
是下面表達的縮寫
iso proto p
當中p 是以上協議之中的一個
l1, l2, iih, lsp, snp, csnp, psnp
爲IS-IS PDU 類型 的縮寫.
(nt: IS-IS PDU, Intermediate system to intermediate system Protocol Data Unit, 中間系統到
中間系統的協議數據單元. OSI(Open Systems Interconnection)網絡由終端系統, 中間系統構成.
終端系統指路由器, 而終端系統指用戶設備. 路由器造成的本地組稱之爲'區域'(Area)和多個區域組成一個'域'(Domain).
IS-IS 提供域內或區域內的路由. l1, l2, iih, lsp, snp, csnp, psnp 表示PDU的類型, 詳細含義另需補充)
vpi n
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 ,
假設數據包爲ATM數據包, 並且其虛擬路徑標識爲n, 則與此相應的條件表達式爲真.
(nt: ATM, Asychronous Transfer Mode, 實際上可理解爲由ITU-T(國際電信聯盟電信標準化部門)提出的一個與
TCP/IP中IP層功能等同的一系列協議, 詳細協議層次另需補充)
vci n
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 ,
假設數據包爲ATM數據包, 並且其虛擬通道標識爲n, 則與此相應的條件表達式爲真.
(nt: ATM, 在上文已有描寫敘述)
lane
假設數據包爲ATM LANE 數據包, 則與此相應的條件表達式爲真. 要注意的是, 假設是模擬以太網的LANE數據包或者
LANE邏輯單元控制包, 表達式中第一個lanekeyword會改變表達式中隨後條件的測試. 假設沒有
指定lanekeyword, 條件測試將依照數據包中內含LLC(邏輯鏈路層)的ATM包來進行.
llc
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 ,
假設數據包爲ATM數據包, 並且內含LLC則與此相應的條件表達式爲真
oamf4s
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是Segment OAM F4 信元(VPI=0 並且 VCI=3), 則與此相應的條件表達式爲真.
(nt: OAM, Operation Administration and Maintenance, 操做管理和維護,可理解爲:ATM網絡中用於網絡
管理所產生的ATM信元的分類方式.
ATM網絡中傳輸單位爲信元, 要傳輸的數據終究會被切割成固定長度(53字節)的信元,
(初理解: 一條物理線路可被複用, 造成虛擬路徑(virtual path). 而一條虛擬路徑再次被複用, 造成虛擬信道(virtual channel)).
通訊兩方的編址方式爲:虛擬路徑編號(VPI)/虛擬信道編號(VCI)).
OAM F4 flow 信元又可分爲segment 類和end-to-end 類, 其差異未知, 需補充.)
oamf4e
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是 end-to-end OAM F4 信元(VPI=0 並且 VCI=4), 則與此相應的條件表達式爲真.
(nt: OAM 與 end-to-end OAM F4 在上文已有描寫敘述, 可搜索'oamf4s'來定位)
oamf4
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是 end-to-end 或 segment OAM F4 信元(VPI=0 並且 VCI=3 或者 VCI=4), 則與此相應的條件表達式爲真.
(nt: OAM 與 end-to-end OAM F4 在上文已有描寫敘述, 可搜索'oamf4s'來定位)
oam
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是 end-to-end 或 segment OAM F4 信元(VPI=0 並且 VCI=3 或者 VCI=4), 則與此相應的條件表達式爲真.
(nt: 此選項與oamf4反覆, 需確認)
metac
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是來自'元信令線路'(nt: VPI=0 並且 VCI=1, '元信令線路', meta signaling circuit, 詳細含義未知, 需補充),
則與此相應的條件表達式爲真.
bcc
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是來自'廣播信令線路'(nt: VPI=0 並且 VCI=2, '廣播信令線路', broadcast signaling circuit, 詳細含義未知, 需補充),
則與此相應的條件表達式爲真.
sc
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是來自'信令線路'(nt: VPI=0 並且 VCI=5, '信令線路', signaling circuit, 詳細含義未知, 需補充),
則與此相應的條件表達式爲真.
ilmic
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是來自'ILMI線路'(nt: VPI=0 並且 VCI=16, 'ILMI', Interim Local Management Interface , 可理解爲
基於SNMP(簡易網絡管理協議)的用於網絡管理的接口)
則與此相應的條件表達式爲真.
connectmsg
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是來自'信令線路'並且是Q.2931協議中規定的下面幾種消息: Setup, Calling Proceeding, Connect,
Connect Ack, Release, 或者Release Done. 則與此相應的條件表達式爲真.
(nt: Q.2931 爲ITU(國際電信聯盟)制定的信令協議. 當中規定了在寬帶綜合業務數字網絡的用戶接口層創建, 維護, 取消
網絡鏈接的相關步驟.)
metaconnect
假設數據包爲ATM數據包, 則與此相應的條件表達式爲真. 對於Solaris 操做系統上的SunATM設備 , 假設數據包爲ATM數據包
並且是來自'元信令線路'並且是Q.2931協議中規定的下面幾種消息: Setup, Calling Proceeding, Connect,
Connect Ack, Release, 或者Release Done. 則與此相應的條件表達式爲真.
expr relop expr
假設relop 兩側的操做數(expr)知足relop 指定的關係, 則與此相應的條件表達式爲真.
relop 可以是下面關係操做符之中的一個: >, <, <=, =, !=.
expr 是一個算術表達式. 此表達式中可以使用整型常量(表示方式與標準C中一致), 二進制操做符(+, -, *, /, &, |,
<<, >>), 長度操做符, 以及對特定數據包中數據的引用操做符. 要注意的是, 所有的比較操做都默認操做數是無符號的,
好比, 0x80000000 和 0xffffffff 都是大於0的(nt: 對於有符號的比較, 依照補碼規則, 0xffffffff
會小於0). 假設要引用數據包中的數據, 可採用下面表達方式:
proto [expr : size]
proto 的取值可以是下面取值之中的一個:ether, fddi, tr, wlan, ppp, slip, link, ip, arp, rarp,
tcp, udp, icmp, ip6 或者 radio. 這指明瞭該引用操做所相應的協議層.(ether, fddi, wlan,
tr, ppp, slip and link 相應於數據鏈路層, radio 相應於802.11(wlan,無線局域網)某些數據包中的附帶的
"radio"頭(nt: 當中描寫敘述了波特率, 數據加密等信息)).
要注意的是, tcp, udp 等上層協議眼下僅僅能應用於網絡層採用爲IPv4或IPv6協議的網絡(此限制會在tcpdump將來版本號中
進行改動). 對於指定協議的所需數據, 其在包數據中的偏移字節由expr 來指定.
以上表達中size 是可選的, 用來指明咱們關注那部分數據段的長度(nt:一般這段數據
是數據包的一個域)。 其長度可以是1, 2, 或4個字節. 假設不給定size, 默認是1個字節. 長度操做符的keyword爲len,
這代碼整個數據包的長度.
好比, 'ether[0] & 1 != 0' 將會使tcpdump 抓取所有多點廣播數據包.(nt: ether[0]字節的最低位爲1表示
數據包目的地址是多點廣播地址). 'ip[0] & 0xf != 5' 相應抓取所有帶有選項的
IPv4數據包. 'ip[6:2] & 0x1fff = 0'相應抓取沒被破碎的IPv4數據包或者
其片斷編號爲0的已破碎的IPv4數據包. 這樣的數據檢查方式也適用於tcp和udp數據的引用,
即, tcp[0]相應於TCP 頭中第一個字節, 而不是相應不論什麼一箇中間的字節.
一些偏移以及域的取值除了可以用數字也可用名字來表達. 下面爲可用的一些域(協議頭中的域)的名字: icmptype (指ICMP 協議頭
中type域), icmpcode (指ICMP 協議頭code 域), 以及tcpflags(指TCP協議頭的flags 域)
下面爲ICMP 協議頭中type 域的可用取值:
icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert,
icmp-routersolicit, icmp-timx-ceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply,
icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.
下面爲TCP 協議頭中flags 域的可用取值:tcp-fin, tcp-syn, tcp-rst, tcp-push,
tcp-ack, tcp-urg.
一、抓取回環網口的包:tcpdump -i lo
二、防止包截斷:tcpdump -s0
三、以數字顯示主機及端口:tcpdump -n
第一種是關於類型的關鍵字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一臺主機,net 202.0.0.0 指明 202.0.0.0是一個網絡地址,port 23 指明端口號是23。若是沒有指定類型,缺省的類型是host.
第二種是肯定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的網絡地址是202.0.0.0 。若是沒有指明方向關鍵字,則缺省是src or dst關鍵字。
第三種是協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分佈式光纖數據接口網絡)上的特定 的網絡協議,實際上它是"ether"的別名,fddi和ether具備相似的源地址和目的地址,因此能夠將fddi協議包看成ether的包進行處理和 分析。其餘的幾個關鍵字就是指明瞭監聽的包的協議內容。若是沒有指定任何協議,則tcpdump將會監聽全部協議的信息包。
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&;或運算 是'or' ,'||';這些關鍵字能夠組合起來構成強大的組合條件來知足人們的須要,下面舉幾個例子來講明。
普通狀況下,直接啓動tcpdump將監視第一個網絡界面上全部流過的數據包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
使用-i參數指定tcpdump監聽的網絡界面,這在計算機具備多個網絡界面時很是有用,
使用-c參數指定要監聽的數據包數量,
使用-w參數指定將監聽到的數據包寫入文件中保存
A想要截獲全部210.27.48.1 的主機收到的和發出的全部的數據包:
#tcpdump host 210.27.48.1
B想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊,使用命令:(在命令行中適用 括號時,必定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
C若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#tcpdump tcp port 23 host 210.27.48.1
E 對本機的udp 123 端口進行監視 123 爲ntp的服務端口
# tcpdump udp port 123
F 系統將只對名爲hostname的主機的通訊數據包進行監視。主機名能夠是本地主機,也能夠是網絡上的任何一臺計算機。下面的命令能夠讀取主機hostname發送的全部數據:
#tcpdump -i eth0 src host hostname
G 下面的命令能夠監視全部送到主機hostname的數據包:
#tcpdump -i eth0 dst host hostname
H 咱們還能夠監視經過指定網關的數據包:
#tcpdump -i eth0 gateway Gatewayname
I 若是你還想監視編址到指定端口的TCP或UDP數據包,那麼執行如下命令:
#tcpdump -i eth0 host hostname and port 80
J 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
K 想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊,使用命令
:(在命令行中適用 括號時,必定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
L 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
M 若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#tcpdump tcp port 23 host 210.27.48.1
第三種是協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,
greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'o
r' ,'||';
第二種是肯定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,
若是咱們只須要列出送到80端口的數據包,用dst port;若是咱們只但願看到返回80端口的數據包,用src port。
#tcpdump –i eth0 host hostname and dst port 80 目的端口是80
或者
#tcpdump –i eth0 host hostname and src port 80 源端口是80 通常是提供http的服務的主機
若是條件不少的話 要在條件以前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
若是在ethernet 使用混雜模式 系統的日誌將會記錄
May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump對截獲的數據並無進行完全解碼,數據包內的大部份內容是使用十六進制的形式直接打印輸出的。顯然這不利於分析網絡故障,一般的解決辦法是先使用帶-w參數的tcpdump 截獲數據並保存到文件中,而後再使用其餘程序進行解碼分析。固然也應該定義過濾規則,以免捕獲的數據包填滿整個硬盤。
# tcpdump -i eth1 src host 211.167.237.199
00:02:03.096713 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010208:2010352(144) ack 33377 win 8576
00:02:03.096951 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010352:2010496(144) ack 33377 win 8576
00:02:03.100928 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010496:2010640(144) ack 33377 win 8576
00:02:03.101165 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010640:2010784(144) ack 33377 win 8576
00:02:03.102554 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010784:2010928(144) ack 33425 win 8576
代表在00:02:03點的時候,211.167.237.199經過ssh源端口鏈接到221.216.165.189的1467端口
#tcpdump -i eth1 src host 211.167.237.199 and dst port 1467
00:09:27.603075 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180400:180544(144) ack 2833 win 8576
00:09:27.605631 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180544:180688(144) ack 2881 win 8576
截獲全部由eth0進入、源地址(src)爲192.168.0.5的主機(host),而且(and)目標(dst)端口(port)爲80的數據包
觀看網卡傳送、接收數據包的狀態
$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 14639 0 0 0 5705 119 0 0 BMRU
Iface: 網卡
RX-OK RX-ERR RX-DRP RX-OVR : 網卡正確接收數據包的數量以及發生錯誤、流失、碰撞的總數
TX-OK TX-ERR TX-DRP TX-OVR : 網卡正確發送數據包的數量以及發生錯誤、流失、碰撞的總數
[root@linux ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae]
[-qX] [-r 檔案] [所欲擷取的資料內容] 參數: -nn:直接以 IP 及 port number 顯示,而非主機名與服務名稱 -i :後面接要『監聽』的網路介面,例如 eth0, lo, ppp0 等等的介面; -w :若是你要將監聽所得的封包資料儲存下來,用這個參數就對了!後面接檔名 -c :監聽的封包數,若是沒有這個參數, tcpdump 會持續不斷的監聽, 直到使用者輸入 [ctrl]-c 為止。 -A :封包的內容以 ASCII 顯示,一般用來捉取 WWW 的網頁封包資料。 -e :使用資料連接層 (OSI 第二層) 的 MAC 封包資料來顯示; -q :僅列出較為簡短的封包資訊,每一行的內容比較精簡 -X :能夠列出十六進位 (hex) 以及 ASCII 的封包內容,對於監聽封包內容頗有用 -r :從後面接的檔案將封包資料讀出來。那個『檔案』是已經存在的檔案, 並且這個『檔案』是由 -w 所製做出來的。 所欲擷取的資料內容:我們能夠專門針對某些通訊協定或者是 IP 來源進行封包擷取, 那就能夠簡化輸出的結果,並取得最有用的資訊。常見的表示方法有: 'host foo', 'host 127.0.0.1' :針對單部主機來進行封包擷取 'net 192.168' :針對某個網域來進行封包的擷取; 'src host 127.0.0.1' 'dst net 192.168':同時加上來源(src)或目標(dst)限制 'tcp port 21':還能夠針對通訊協定偵測,如 tcp, udp, arp, ether 等 還能夠利用 and 與 or 來進行封包資料的整合顯示呢! 範例一:以 IP 與 port number 捉下 eth0 這個網路卡上的封包,持續 3 秒 [root@linux ~]# tcpdump -i eth0 -nn tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648 <==按下 [ctrl]-c 之後結束 6680 packets captured <==捉下來的封包數量 14250 packets received by filter <==由過濾所得的總封包數量 7512 packets dropped by kernel <==被核心所丟棄的封包 |
[root@linux ~]# tcpdump -i eth0 -nn port 21
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 1 win 65535
01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240: P 1:21(20) ack 1 win 5840
01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 21 win 65515
01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21: P 1:17(16) ack 21 win 65515
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840
|
[root@linux ~]# tcpdump -i lo -nn
1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0) win 32767 <mss 16396,sackOK,timestamp 236681316 0,nop,wscale 2> 4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0) ack 933696133 win 32767 <mss 16396,sackOK,timestamp 236681316 236681316,nop, wscale 2> 5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 <nop, nop,timestamp 236681316 236681316> 6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192 <nop,nop,timestamp 236681334 236681316> 7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 <nop, nop,timestamp 236681334 236681334> |
[root@linux ~]# tcpdump -i lo -nn -X 'port 21'
0x0000: 4500 0048 2a28 4000 4006 1286 7f00 0001 E..H*(@.@.......
0x0010: 7f00 0001 0015 80ab 8355 2149 835c d825 .........U!I./.%
0x0020: 8018 2000 fe3c 0000 0101 080a 0e2e 0b67 .....<.........g
0x0030: 0e2e 0b61 3232 3020 2876 7346 5450 6420 ...a220.(vsFTPd. 0x0040: 322e 302e 3129 0d0a 2.0.1).. 0x0000: 4510 0041 d34b 4000 4006 6959 7f00 0001 E..A.K@.@.iY.... 0x0010: 7f00 0001 80ab 0015 835c d825 8355 215d ........./.%.U!] 0x0020: 8018 2000 fe35 0000 0101 080a 0e2e 1b37 .....5.........7 0x0030: 0e2e 0b67 5553 4552 2064 6d74 7361 690d ...gUSER.dmtsai. 0x0040: 0a . 0x0000: 4510 004a d34f 4000 4006 694c 7f00 0001 E..J.O@.@.iL.... 0x0010: 7f00 0001 80ab 0015 835c d832 8355 217f ........./.2.U!. 0x0020: 8018 2000 fe3e 0000 0101 080a 0e2e 3227 .....>........2' 0x0030: 0e2e 1b38 5041 5353 206d 7970 6173 7377 ...8PASS.mypassw 0x0040: 6f72 6469 7379 6f75 0d0a ordisyou.. |
例題:如何使用 tcpdump 監聽 (1)來自 eth0 介面卡且 (2)通訊協定為 port 22 ,(3)目標來源為 192.168.1.100 的封包資料? 答:
|
[root@linux ~]# nc [IP|host] [port]
[root@linux ~]# nc -l -p [port] 參數: -l :做為監聽之用,亦即開啟一個 port 來監聽用戶的連線; -p :開啟的這個 port number 範例一:連接本地端的 port 25 查閱相關訊息 [root@linux ~]# nc localhost 25 localhost.localdomain [127.0.0.1] 25 (smtp) open 220 pc.dm.tsai ESMTP Postfix ehlo localhost 250-pc.dm.tsai 250-PIPELINING 250-SIZE 40000000 250-ETRN quit 221 Bye |
範例二:啟動一個 port 來監聽使用者的連線要求
[root@linux ~]# nc -l -p 20000 # 啟動一個 port 20000 在主機上,若是此時使用 netstat -tlnp # 就能夠看到系統上多出來一個 port 20000 在傾聽使用者的連線喔! |
[root@linux ~]# nc localhost 20000
<==這裡能夠開始輸入字串了! |
原文連接:https://www.cnblogs.com/maifengqiang/p/3863168.html