tcpdump原理,命令

tcpdump( dump the traffic on a network) 

熟練使用tcpdump需要對tcp頭部和原理有較深的理解。

原理

底層是通過libpcap庫來實現的,tcpdump調用libpcap的api函數,由libpcap進入到內核態到鏈路層來抓包,如下圖。圖中的BPF是過濾器,可以根據用戶設置用於數據包過濾減少應用程序的數據包的包數和字節數從而提高性能。BufferQ是緩存供應用程序讀取的數據包。我們可以說tcpdump底層原理其實就是libpcap的實現原理。

而libpcap在linux系統鏈路層中抓包是通過PF_PACKET套接字來實現的(不同的系統其實現機制有差異)。更具體的細節一般人就沒必要了解的太深了。。

https://blog.csdn.net/notbaron/article/details/79735414

參數

有很多參數,沒必要全部記住,熟練其中5個就滿足大部分工作需要了,其他的用到再查不遲。

-i: 指定網卡

-n : 不解析主機名

-nn : 不解析主機名和端口名

-s: 指定包的大小。-s 0指定數據包大小爲262144字節,可以使得抓到的數據包不被截斷,保證完整性

-c: 指定抓包數量

-w:保存到文件,以便後續在windows上使用Wireshark詳細分析

-v -vv -vvv: 輸出的詳細級別

-X: 以十六進制和 ASCII 顯示

-G: -G 60 每60秒循環使用-w指定的文件。比如-w %Y%m%d-%H%M%S.pcap,那每60秒就會生成一個以當前時間命名的文件。 另外如果命令中有-c選項,當文件大小達到size變量的值,文件名格式則會以file<count>的形式變化。

-Z: 指定具有root權限的用戶。

-tttt: 在每行打印的時間戳之前添加日期的打印

例子

參考: http://www.cnblogs.com/starlion/p/9017495.html

1、抓取HTTP包

tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

[20:2]意思是 過濾從20字節開始的2個字節,也就是第20和第21字節。

對照tcp頭部,一行是4字節,可以算出來第六行的的字節是20-23。(因爲字節是從0開始編號的)

也就是說,如果有選項,那麼[20:2]對應選項部分的第1個字節和第2個字節。

如果沒有選項,對應的是tcp報文中數據部分 開頭的兩個字節。

tcp報文的數據部分是http報文。http報文分爲http頭部和數據部分,所以[20:2]實際上是http頭部的前兩個字節

0x4745 爲"GET"前兩個字母"GE"的16進制,   0x4854 爲"HTTP"前兩個字母"HT"的16進制

2、抓取源端口大於1024的TCP數據包

tcpdump 'tcp[0:2] > 1024'

如果你看懂了上面的,這個肯定也懂

3、過濾帶有選項的IPv4包或者IPv6包

tcpdump 'ip[0] > 69'

IP頭部格式如下 

è¿éåå¾çæè¿°

ip[0]表示ip頭部中編號爲0的字節,也就是第一行的第一字節,即,沒有選項的時候,第一個字節的二進制值通常爲:01000101,分成兩個部分:
0100 = 4 表示IP版本  0101 = 5 表示頭部長度(單位是4字節),將這個值轉換爲10進制就是69,如果大於69,就說明有選項或者是IPv6包

4、抓不分片的IP包

tcpdump 'ip[6] = 64'

從上圖中可以看出,分片信息在IP頭的第七和第八字節(即編號爲6和7):

Bit 0: 保留,必須是0
Bit 1: (DF) 0 = 可能分片, 1 = 不分片
Bit 2: (MF) 0 = 最後的分片, 1 = 還有分片
Fragment Offset字段只有在分片的時候才使用。
要抓帶DF位標記的不分片的包,第七字節的值應該是:
01000000= 64

5、抓icmp包

tcpdump -i eth1 -c 5 -nn icmp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章