在linux中使用tcpdump抓包的方法:
1,運行下面命令來從所有網卡中捕獲資料包:
tcpdump -i any
2,從指定網卡中捕獲資料包
tcpdump -i eth0
3,指定網卡,IP地址,寫入檔案
tcpdump -i eth0 host 10.19.150.242 -w ./datdump.cap
4,指定網卡,源ip 且 目的ip,寫入檔案
tcpdump -i eth0 src host 10.10.100.19 and dst host 10.10.100.153 -w ./datdump1.cap
5,指定網卡,源ip 或 目的ip,寫入檔案
tcpdump -i eth0 src host 10.10.100.19 or dst host 10.10.100.153 -w ./datdump1.cap
6,指定網卡,tcp埠 且 源ip 且 目的ip,寫入檔案
tcpdump -i eth0 tcp port 52312 and src host 10.10.100.19 and dst host 10.10.100.153 -w ./datdump3.cap
7,指定網卡,tcp埠 且 源ip 且 目的ip,寫入檔案
tcpdump -i eth0 host ! 10.10.100.19 and ! 10.10.100.153 -w ./datdump4.cap
8,只抓取sync的資料包 具體什么意思,詳見
tcpdump -i eth0 tcp[13] == 2 -w ./datdump5.cap
9,只抓取HTTP包
tcpdump -i eth0 'tcp[(tcp[12]>>2):4] = 0x48545450' -w ./datdump5.cap
10,只抓取ip資料幀中沒有資料的包,詳見
tcpdump -i eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0' -w ./datdump6.cap
tcpdump [ 選項 ] [ -c 數量 ] [ -i 網路介面 ] [ -w 檔案名 ] [ 運算式 ]
man tcpdump
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
? [ -c count ]
? [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
? [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
? [ --number ] [ -Q in|out|inout ]
? [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
? [ -W filecount ]
? [ -E spi@ipaddr algo:secret,... ]
? [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
? [ --time-stamp-precision=tstamp_precision ]
? [ --immediate-mode ] [ --version ]
? [ expression ]
選項翻譯如下:
-l:使標準輸出變為緩沖行形式;
-c:抓包次數;
-nn:直接以 IP 及 Port Number 顯示,而非主機名與服務名稱;
-s :<資料包大小> 設定每個資料包的大小;
-i:指定監聽的網路介面;
-r:從指定的檔案中讀取包;
-w:輸出資訊保存到指定檔案;
-a:將網路地址和廣播地址轉變成名字;
-d:將匹配資訊包的代碼以人們能夠理解的匯編格式給出;
-e:在輸出行列印出資料鏈路層的頭部資訊;
-f:將外部的Internet地址以數字的形式列印出來;
-t:在輸出的每一行不列印時間戳;
-v :輸出稍微詳細的報文資訊;--vv則輸出更詳細資訊,
抓取帶有特殊標記的資料包
https://www.jb51.net/LINUXjishu/118388.html?pc
示例:抓取只包含SYN位的資料包
1.客戶端發送SYN
2.服務端回應SYN和ACK
3.客戶端發送ACK
現在我們僅捕獲包含SYN位的資料包, 注意,不希望步驟2(SYN-ACK)的資料包,只是一個普通的初始SYN,
tcp頭的結構

TCP頭包含20個位元組固定長度的資料(上圖中的前4行),而控制位位于第13個位元組(位元組計算從0開始)

只看我們感興趣的控制位:

這些是我們感興趣的TCP控制位,我們對這個八位組中的位進行了編號,從0到7,從右到左,所以PSH位是位編號3,而URG位是編號5,SYN位是2,

如果只包含 SYN 位,那就是 tcp頭的第13個位元組(0開始)的值為2,即tcp[13] == 2,
tcpdump -i eth0 tcp[13] == 2 -w ./datdump5.cap
如果抓取包含SYN位的資料包
tcpdump -i eth0 'tcp[13] & 2 == 2' -w ./datdump5.cap
示例:只抓取ip資料包沒有資料的包
tcpdump -i eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) == 0' -w ./datdump6.cap
ip[2:2]
表示整個ip資料包總長度,即ip頭的第2個位元組(0開始)開始的兩個位元組(2,3)的值,
(ip[0]&0xf)<<2
ip頭的第0個位元組取低4位,然后左移兩位(乘4),即ip頭的長度,乘4的原因是首部長度表示有多少個32位的資料,
(tcp[12]&0xf0)>>2)
表示tcp頭的長度,
示例:只抓取http資料包
tcpdump -i eth0 'tcp[(tcp[12]>>2):4] = 0x47455420' -w ./datdump5.cap
tcp[(tcp[12]>>2):4] 表示tcp頭部之后的4個位元組的值,0x47455420 就是HTTP的16進制,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394901.html
標籤:Linux
