在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進制。