概述
用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。
tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。
tcpdump基於底層libpcap庫開發,運行需要root權限。
一、tcpdump安裝
-
環境
虛擬機:vmware 15.5.2
os: ubuntu 12.04 -
安裝tcpdump
sudo apt-get install tcpdump
3. 版本查看
tcpdump --h
tcpdump version 4.0。
libpcap version 1.1.1 表示libpcap的版本。
二、tcpdump參數
常用參數選項說明:
參數 | 含義 |
---|---|
-a | 將網絡地址和廣播地址轉變成名字 |
-c | 在收到指定的包的數目后,tcpdump就會停止; |
-d | 將匹配信息包的代碼以人們能夠理解的匯編格式給出;以可閱讀的格式輸出。 |
-dd | 將匹配信息包的代碼以c語言程序段的格式給出; |
-ddd | 將匹配信息包的代碼以十進制的形式給出; |
-e | 在輸出行打印出數據鏈路層的頭部信息; |
-f | 將外部的Internet地址以數字的形式打印出來; |
-l | 使標准輸出變為緩沖行形式; |
-n | 直接顯示IP地址,不現實名稱; |
-nn | 端口名稱顯示為數字形式,不現實名稱; |
-t | 在輸出的每一行不打印時間戳; |
-v | 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息; |
-vv | 輸出詳細的報文信息; |
-F | 從指定的文件中讀取表達式,忽略其它的表達式; |
-i | 指定監聽的網絡接口; |
-r | 從指定的文件中讀取包(這些包一般通過-w選項產生); |
-w | 直接將包寫入文件中,並不分析和打印出來; |
-T | 將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單 網絡管理協議;) |
高階參數使用說明:
-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 以容易閱讀的形式,在標准輸出上打印出編排過的包匹配碼, 隨后tcpdump停止.(nt | rt: human readable, 容易閱讀的,通常是指以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公司的NIS服務器的缺陷(nt: NIS, 網絡信息服務, tcpdump 顯示外部地址的名字時會用到她提供的名稱服務): 此NIS服務器在查詢非本地地址名字時,常常會陷入無盡的查詢循環).
由於對外部(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 不對地址(比如, 主機地址, 端口號)進行數字表示到名字表示的轉換.
-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, 上文已有描述,可搜索'網絡接口分接頭'關鍵字找到那里)的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 的取值未知, 需補充)
三、命令選項使用舉例
1. 截獲主機收到和發出的所有數據包。
命令:
tcpdump
說明:
tcpdump截取包默認顯示數據包的頭部。
普通情況下,直接啟動tcpdump將監視第一個網絡接口上所有流過的數據包。
基礎格式:時間 數據包類型 源IP 端口/協議 > 目標IP 端口/協議 協議詳細信息
按下Ctrl+C會終止tcpdump命令。且會在結尾處生成統計信息。
2. 指定抓包數量 -c
指定抓取2個數據包。
命令:
tcpdump -c 2
說明:
最后會自動生成統計信息。
【注意,已經切換到管理員了,虛擬機中要產生數據包,可以另外開一個窗口ping baidu.com后面不再提示】
3. 將抓包信息寫入文件 -w
使用-w選項指定記錄文件。
命令:
tcpdump -c 10 -w tcpdump_test.log
說明:
保存的文件不是文本格式,不能直接查看。tcpdump保存的文件的格式是幾乎所有主流的抓包工具軟件都可以讀取。所以可以使用更易讀的圖形界面工具來查看記錄文件。
4. 讀取記錄文件 -r
使用-r選項讀取文件。
命令:
tcpdump -r tcpdump_test.log
![讀取記錄文件
5. 打印出所有可工作的接口 -D
命令:
tcpdump -D
其中網卡為eth0。
6. 指定監控的網卡 -i
命令:
tcpdump -i eth0
如果不指定網卡,默認tcpdump只會監視第一個網絡接口,一般是eth0。
7. 顯示更詳細的數據包信息 -v -vv
選項-v,-vv可以顯示更詳細的抓包信息。
8. 不使用域名反解 -n
使用-n后,tcpdump會直接顯示IP地址,不會顯示域名(與netstat命令相似)。
9. 增加抓包時間戳 -tttt選項
tcpdump的所有輸出打印行中都會默認包含時間戳信息;
時間戳信息的顯示格式如下
hh:mm:ss.frac (nt: 小時:分鍾:秒.)
此時間戳的精度與內核時間精度一致, 反映的是內核第一次看到對應數據包的時間;
而數據包從物理線路傳遞到內核的時間, 以及內核花費在此包上的中斷處理時間都沒有算進來;
使用-tttt選項,抓包結果中將包含抓包日期:
命令:
tcpdump -tttt
四、條件過濾
1. 過濾:指定需要抓取的協議
tcpdump可以只抓某種協議的包,支持指定以下協議:ip,ip6,arp,tcp,udp,wlan等。
命令:
tcpdump udp
tcpdump icmp
tcpdump tcp
tcpdump arp
2. 過濾:指定協議的端口號
使用port參數,用於指定端口號。
命令:tcpdump tcp port 80
使用portrange參數,用於指定端口范圍。
命令:tcpdump tcp portrange 1-1024
3. 過濾:指定源與目標
src 表示源。
dst 表示目標。
命令:
tcpdump src port 8080
tcpdump dst port 80
4. 過濾:指定特定主機的消息包
使用host指定需要監聽的主機。
命令:
tcpdump host 192.168.1.113
注意:若使用了host參數使用了計算機名或域名。例tcpdump host shi-pc ,則無法再使用-n選項。
5. 過濾:指定數據包大小
使用greater(大於)與less(小於)可以指定數據包大小的范圍。
例:只抓取大於1000字節的數據包。
命令:
tcpdump greater 1000
例:只抓取小於10字節的數據包。
命令:
tcpdump less 10
五、 邏輯表達式
使用基本邏輯組合拼裝出更精細的過濾條件。
1. 邏輯與
邏輯與關系,使用and。
命令:
tcpdump tcp and host 192.168.1.112
tcpdump tcp and src 192.168.1.112 and port 8080
2. 邏輯或
邏輯或關系,使用or。
命令:
tcpdump host 192.168.1.112 or 192.168.1.113
3. 邏輯非
邏輯非關系,使用not,也可以使用 ! 。
若使用 ! 必須與其后面的字符隔開一個空格。
例:當通過ssh協議遠程使用tcpdump時,為了避免ssh的數據包的輸出,所以一般需要禁止ssh數據包的輸出。
命令:
tcpdump not tcp port 22
tcpdump ! tcp port 22
4. 括號
括號需要使用在引號內,或轉意使用。否則會報錯。
例:抓取非22端口,且主機為192.168.1.112 和 192.168.1.113的TCP數據包。
命令:
tcpdump not tcp port 22 and host 192.168.1.112or192.168.1.113
tcpdump "not tcp port 22 and host (192.168.1.112 or 192.168.1.113)"
tcpdump not tcp port 22 and host "(192.168.1.112 or 192.168.1.113)"
六、其他實例
1. 打印所有進入或離開sundown的數據包.
tcpdump host sundown
2. 截獲主機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 \)
3. 如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
4. 監視所有送到主機hostname的數據包
tcpdump -i eth0 dst host hostname
5. 獲取主機210.27.48.1接收或發出的telnet包
23為telnet的端口
tcpdump tcp port 23 and host 210.27.48.1
6. 監視本機的udp 123 端口
123 為ntp的服務端口
tcpdump udp port 123
7. 使用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默認不顯示數據包的詳細內容。
方法一:
使用-A參數能以ASCII碼顯示數據包。
例:只抓取1個數據包,並顯示其內容。
命令:
tcpdump -c 1 -A
方法二:
使用-X參數能16進制數與ASCII碼共同顯示數據包。
例:只抓取1個數據包,並顯示其內容。
命令:
tcpdump -c 1 -X
七、tcpdump 與wireshark
Wireshark(以前是ethereal)是Windows下非常簡單易用的抓包工具,現在也有Linux版本。
通過Tcpdump抓取的數據包分析比較麻煩,要想很方便的分析數據包, 我們可以用Tcpdump + Wireshark 的完美組合實現:在 Linux 里抓包,然后在Windows 里分析包。
保存數據包為wireshark能識別的文件:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
參數 | 含義 |
---|---|
tcp | ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型 |
-i eth1 | 只抓經過接口eth1的包 |
-t | 不顯示時間戳 |
-s 0 | 抓取數據包時默認抓取長度為68字節。加上-S 0 后可以抓到完整的數據包 |
-c 100 | 只抓取100個數據包 |
dst port ! 22 | 不抓取目標端口是22的數據包 |
src net 192.168.1.0/24 | 數據包的源網絡地址為192.168.1.0/24 |
-w ./target.cap | 保存成cap文件,方便用ethereal(即wireshark)分析 |