tcpdump抓包命令


目錄:

  • 命令格式
  • 選項
  • 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM