目錄:
-
命令格式
-
選項
-
expression表達式
- 示例
【命令格式】
man手冊顯示如下
1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ] 2 [ -c count ] 3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ] 4 [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] 5 [ --number ] [ -Q|-P in|out|inout ] 6 [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ] 7 [ -W filecount ] 8 [ -E spi@ipaddr algo:secret,... ] 9 [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] 10 [ --time-stamp-precision=tstamp_precision ] 11 [ --immediate-mode ] [ --version ] 12 [ expression ]
【選項】
-A 以ASCII碼打印報文(不包括鏈路層的頭),方便分析網頁-c 抓取多少數據包后退出-C 用於判斷-w選項寫入將報文寫入的文件大小是否超過此值,如果超過就新建文件(文件名后綴1、2、3遞增)-d 將匹配信息包的編譯代碼以人類易讀的方式輸出至stdout-dd 將匹配信息包的代碼作為C語言程序段格式給出-ddd 將匹配信息包的代碼以十進制格式給出-D 列出當前可用於抓包的網卡名稱和對應編號。網卡名稱和對應編號可用於-i選項-e 打印鏈路層的頭部信息,如MAC地址-f 以數字形式打印外部ip地址-F 從文件中讀取過濾表達式,忽略命令行上的其它表達式-G 每隔多少秒重新存儲數據包至文件(-w選項指定的文件,需帶時間),用法如tcpdump -i ens35 -G 3 -w packets_%H%M%S.pcap-i 抓取指定網卡的數據流。若不指定,則使用最小編號(-D)的網卡;any參數抓取所有網卡的數據流-K 不嘗試計算IP、TCP、UDP校驗和-l 使標准輸出變為緩沖形式(小寫L);tcpdump -l | tee dat或者tcpdump -l > dat & tail -f dat,實現邊寫入文件邊標准輸出-L 列出數據連接類型-n 顯示ip而不是主機名-nn 顯示端口號,而不是端口名-N 不列出全域名-# 打印數據包的行號-p 非混雜模式,不能與host或broadcast一起使用-q 快速輸出,顯示較少信息-Q|-P 選擇抓取某個方向的數據包,參數可以是in、out、inout(默認)-r 從文件中讀取數據包-S 使用絕對值,而非相對值,打印tcp序列號-s 抓到每一個數據包的截取字節數,默認68字節。參數0表示不截斷,抓取完整數據包。-T 將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議)-t 不打印時間戳-tt 打印時間戳秒數,自1970/0/0 00:00:00開始-ttt 打印當前行和上一行的時間差-tttt 打印標准時間戳格式,如2019-06-21 14:10:49.314665-ttttt 打印當前行和第一行的時間差-v 打印比較詳細的信息-vv 打印更加詳細的信息-vvv 打印非常詳細的信息-w 將數據包寫入文件中,同時能使用-r選項恢復打印-X 輸出包的頭部信息,以16進制和ASCII兩種方式同時輸出-XX 詳細輸出包的頭部信息,以16進制和ASCII兩種方式同時輸出expression 過濾表達式,篩選輸出的數據包
【expression表達式】
tcpdump表達式由一個或多個"單元"組成,每個單元一般包含ID的修飾符和一個ID(數字或名稱)
基本格式為:proto dir type
三種修飾符:
proto:協議類型
常用的協議有tcp/udp/arp/ip/ether/icmp等。
若未給定協議類型,則匹配所有可能的類型。例如"tcp port 21","udp portrange 7000-7009";
dir:指定ID的方向
可以給定的值包括src/dst/src or dst/src and dst,默認為src or dst。
例如,"src foo"表示源主機為foo的數據包,"dst net 128.3"表示目標網絡為128.3的數據包,"src or dst port 22"表示源或目的端口為22的數據包;
type:指定ID的類型
可以給定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默認的type為host;
除了修飾符和ID組成表達式單元,還有關鍵字表達式單元(gateway,broadcast,less,greater)和算術表達式
表達式單元之間可以使用操作符" and / && / or / || / not / ! "進行連接,如"host foo and not port ftp and not port ftp-data"
同樣的修飾符可省略,"tcp dst port ftp or ftp-data or domain"與"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意義相同
使用括號"()"可以改變表達式的優先級,但需要注意的是括號會被shell解釋,所以應該使用反斜線"\"轉義為"\(\)",在需要的時候,還需要包圍在引號中。
常用端口和名字的對應關系可在linux系統中的/etc/services文件中找到
【示例】
查詢端口ens32的數據包
# tcpdump -i ens32 -w ens32.pcap
查詢所有端口數據包,並寫入文件
# tcpdump -i any -w any.pcap
邊顯示邊寫入文件
# tcpdump -i ens32 -l |tee ens32.pcap
抓取與132服務器交互的數據包
# tcpdump -i ens35 -q -n -nn net 192.168.237.132
抓取來自132的數據包(默認會抓取src or dst)
# tcpdump -i ens35 -q -n -nn src host 192.168.237.132 # tcpdump -i ens35 -q -n -nn src net 192.168.237.132
抓取與132服務器交互的數據包,但排除22端口
# tcpdump -i ens35 -q -n -nn net 192.168.237.132 and not port 22
抓取端口80上與132服務器交互的數據包
# tcpdump -i ens35 -q -n -nn -tttt net 192.168.237.132 and tcp port 80
抓取端口范圍10-80上來自132的數據包,同時排除22端口
# tcpdump -i ens35 -q -n -nn src net 192.168.237.132 and tcp portrange 10-80 and not port 22
Tips:proto協議不能修飾host和net,只能修飾port或portrange