天天看點

tcpdump重要筆記

無關痛癢的參數就不寫了。隻說一些我認為值得注意的。

1 tcpdump參數

    -s 最早在公司舊機器上截包時發現總是不完整,于是知道了這個參數,之後就一直用-s0了。最近一次在家裡,忘記輸入-s發現包竟然還是完整的,趕緊用man查詢了下,人家說的很明白預設值是“65535 bytes”,這下把我搞蒙了。最終才發現,原來至少在4.1之後的tcpdump使用的預設值都是65535了,公司的tcpdump是3.9預設值是96位元組。是以現在網上資料裡普遍提到的"預設tcpdump抓包大小限制在96個byte"是很古老的說法了,至少在2012年的版本裡,其預設值已經變成65535。

    -l 隻有在使用管道或者輸出重定向會用到它,在這種情況下必須加上這個參數,它能保每行内容都會被及時輸出給後端。

    -w 儲存成檔案,雖然直接使用輸出重定向">"也可以輸出到檔案,但是要注意,-w才能正确的儲存成二進制格式,也就是wireshark可以檢視的格式,而輸出重定向隻是儲存了16進制的文本。

    -X 要看每個包的16進制内容就必須使用這個參數,多數時候我都需要這個參數。

    -i 指定網絡接口,也就是ifconfig看到的最左面的名字“eth0, eth1, lo”,注意這個參數如果不加不代表抓取所有的接口,而是使用清單裡最小的那個,最小的往往都不是我們希望使用的那個,是以這個參數幾乎也是必須的。

2 tcpdump表達式

    這種表達式過濾資料非常友善,可以通過頭部内容過濾,基本上是使用這樣的格式 proto[index:length] (proto是協定名不限于ip/tcp,index是以0為開頭的位元組數,length是從開頭往後跨越的位元組數),通過簡單的算術運算和布爾運算,幾乎可以對任何條件進行篩選了。雖然可以用tcp[tcpflags] & tcp-push這樣的命名式寫法,但個人覺得還是數字然後配合ip/tcp結構圖更友善,因為我如何在不查資料的情況下知道應該寫成“tcp[tcpflags] & tcp-push”還是"tcp[tcpflags] & push"呢?多了個命名就多了一個查詢的步驟。附帶幾個例子:

//隻顯示目的端口是20835的push包
tcpdump 'tcp[13] & 8 != 0 && dst prot 20835' -i eth1 -nn -X

//0x4745 為字母"GE"(GET),0x4854 為字母"HT"(HTTP),這種方式隻顯示HTTP相關的包(某部落格學來)
tcpdump "tcp[20:2]=0x4745 or tcp[20:2]=0x4854" -i eth1 -nn -X

//隻顯示有資料的包,SYN,FIN和純粹的ACK會被過濾掉(man學來的)
tcpdump "tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" -i eth1 -nn -X
           

3 定位應用層資料

    這塊内容在之前的文章"給tcpdump加點顔色"已經提及,要找到應用層資料的開頭,注意下面3點

    1 IP頭和TCP頭都是可變長度,實際使用中來說,我很少遇到IP頭的選項部分,但TCP可選項經常使用。

    2 IP頭的長度位于第一個位元組的高位址部分,TCP頭的長度位于第13個位元組的低位址部分

    3 表示長度的機關都是4位元組。

tcpdump重要筆記

附圖:wikipedia IPv4 TCP

tcpdump重要筆記
tcpdump重要筆記

繼續閱讀