天天看點

Linux 抓包工具 tcpdump 用法

大家好,又見面了,我是你們的朋友全棧君。

Linux 抓包工具 tcpdump 用法

tcpdump采用指令行方式對接口的資料包進行篩選抓取,其豐富特性表現在靈活的表達式上。

不帶任何選項的tcpdump,預設會抓取第一個網絡接口,且隻有将tcpdump程序終止才會停止抓包。

例如:

tcpdump -nn -i eth0 icmp

下面是詳細的tcpdump用法

tcpdump選項

它的指令格式為:

tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]

[ -s snaplen ] [ -w file ] [ expression ]

抓包選項:

-c:指定要抓取的包數量。注意,是最終要擷取這麼多個包。例如,指定”-c 10″将擷取10個包,但可能已經處理了100個包,隻不過隻有10個包是滿足條件的包。

-i interface:指定tcpdump需要監聽的接口。若未指定該選項,将從系統接口清單中搜尋編号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),

:一旦找到第一個符合條件的接口,搜尋馬上結束。可以使用’any’關鍵字表示所有網絡接口。

-n:對位址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。

-nn:除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名。

-N:不列印出host的域名部分。例如tcpdump将會列印’nic’而不是’nic.ddn.mil’。

-P:指定要抓取的包是流入還是流出的包。可以給定的值為”in”、“out”和”inout”,預設為”inout”。

-s len:設定tcpdump的資料包抓取長度為len,如果不設定預設将會是65535位元組。對于要抓取的資料包較大時,長度設定不夠可能會産生包截斷,若出現包截斷,

:輸出行中會出現”[|proto]”的标志(proto實際會顯示為協定名)。但是抓取len越長,包的處理時間越長,并且會減少tcpdump可緩存的資料包的數量,

:進而會導緻資料包的丢失,是以在能抓取我們想要的包的前提下,抓取長度越小越好。

輸出選項:

-e:輸出的每行中都将包括資料鍊路層頭部資訊,例如源MAC和目标MAC。

-q:快速列印輸出。即列印很少的協定相關資訊,進而輸出行都比較簡短。

-X:輸出包的頭部資料,會以16進制和ASCII兩種方式同時輸出。

-XX:輸出包的頭部資料,會以16進制和ASCII兩種方式同時輸出,更詳細。

-v:當分析和列印的時候,産生詳細的輸出。

-vv:産生比-v更詳細的輸出。

-vvv:産生比-vv更詳細的輸出。

其他功能性選項:

-D:列出可用于抓包的接口。将會列出接口的數值編号和接口名,它們都可以用于”-i”後。

-F:從檔案中讀取抓包的表達式。若使用該選項,則指令行中給定的其他表達式都将失效。

-w:将抓包資料輸出到檔案中而不是标準輸出。可以同時配合”-G time”選項使得輸出檔案每time秒就自動切換到另一個檔案。可通過”-r”選項載入這些檔案以進行分析和列印。

-r:從給定的資料封包件中讀取資料。使用”-“表示從标準輸入中讀取。

是以常用的選項也就這幾個:

tcpdump -D

tcpdump -c num -i int -nn -XX -vvv

tcpdump表達式

表達式用于篩選輸出哪些類型的資料包,如果沒有給定表達式,所有的資料包都将輸出,否則隻輸出表達式為true的包。在表達式中出現的shell元字元建議使用單引号包圍。

tcpdump的表達式由一個或多個”單元”組成,每個單元一般包含ID的修飾符和一個ID(數字或名稱)。有三種修飾符:

type:指定ID的類型。

可以給定的值有host/net/port/portrange。例如”host foo”,“net 128.3”,“port 20”,“portrange 6000-6008”。預設的type為host。

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的資料包。

proto:通過給定協定限定比對的資料包類型。

常用的協定有tcp/udp/arp/ip/ether/icmp等,若未給定協定類型,則比對所有可能的類型。例如”tcp port 21″,“udp portrange 7000-7009”。

是以,一個基本的表達式單元格式為”proto dir type ID”

除了使用修飾符和ID組成的表達式單元,還有關鍵字表達式單元:gateway,broadcast,less,greater以及算術表達式。

表達式單元之間可以使用操作符” and / && / or / || / not / ! “進行連接配接,進而組成複雜的條件表達式。如”host foo and not port ftp and not port ftp-data”,這表示篩選的資料包要滿足”主機為foo且端口不是ftp(端口21)和ftp-data(端口20)的包”,常用端口和名字的對應關系可在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”意義相同,都表示包的協定為tcp且目的端口為ftp或ftp-data或domain(端口53)。

使用括号”()“可以改變表達式的優先級,但需要注意的是括号會被shell解釋,是以應該使用反斜線”\“轉義為”()”,在需要的時候,還需要包圍在引号中。

tcpdump示例

tcpdump隻能抓取流經本機的資料包

預設啟動

tcpdump

預設情況下,直接啟動tcpdump将監視第一個網絡接口(非lo口)上所有流通的資料包。這樣抓取的結果會非常多,滾動非常快

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

tcpdump -i ens32

如果不指定網卡,預設tcpdump隻會監視第一個網絡接口,如ens32

監視指定主機的資料包,例如所有進入或離開主機server1的資料包

tcpdump host server1

列印helios<–>hot或helios<–>ace之間通信的資料包

tcpdump host helios and ( hot or ace )

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

tcpdump ip host ace and not helios

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

tcpdump src host hostname

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

tcpdump dst host hostname

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

tcpdump tcp port 22 and host hostname

對本機的udp 53端口進行監視(53為dns的服務端口)

tcpdump udp port 53

監視指定網段的資料包,如本機與172.16網段通信的資料包,”-c 8″表示隻抓取10個包

tcpdump -c 8 net 172.16

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

tcpdump ‘gateway snup and (port ftp or ftp-data)’

抓取ping包

tcpdump -c 5 -nn -i ens32 icmp

如果明确要抓取主機為192.168.10.7對本機的ping,則使用and操作符

tcpdump -c 5 -nn -i ens32 icmp and src 172.16.100.35

不能直接寫icmp src 172.16.10.7,因為icmp協定不支援直接應用host這個type

抓取到本機22端口的包

tcpdump -c 10 -nn -i ens32 tcp dst port 22

解析包資料

tcpdump -c 2 -q -XX -vvv -nn -i ens32 tcp dst port 22

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/171382.html原文連結:https://javaforall.cn