網絡基本功(十八):細說tcpdump的妙用(下)

網絡基本功(十八):細說tcpdump的妙用(下)安全

 

轉載請在文首保留原文出處:EMC中文支持論壇https://community.emc.com/go/chinese p_w_picpath001.gif網絡

 

 

更多信息

 

(承接上文)less

 

過濾:dom

 

要有效地使用tcpdump,掌握過濾器很是必要的。過濾容許用戶指定想要抓取的數據流,從而用戶能夠專一於感興趣的數據。此外,ethereal這樣的工具使用tcpdump過濾語法來抓取數據流。tcp

若是用戶很清楚對何種數據流不感興趣,能夠將這部分數據排除在外。若是用戶不肯定須要什麼數據,能夠將源數據收集到文件以後在讀取時應用過濾器。實際應用中,須要常常在兩種方式之間轉換。ide

簡單的過濾器是加在命令行以後的關鍵字。可是,複雜的命令是由邏輯和關係運算符構成的。對於這樣的狀況,一般最好用-F選項將過濾器存儲在文件中。例如,假設testfilter 是一個包含過濾主機205.153.63.30的文本文件,以後輸入tcpdump –Ftestfilter等效於輸入命令tcpdump host 205.153.63.30。一般,這一功能只在複雜過濾器時使用。可是,同一命令中命令行過濾器和文件過濾器不能混用。工具

 

地址過濾:spa

 

過濾器能夠按照地址選擇數據流。例如,考慮以下命令:命令行

bsd1# tcpdump host 205.153.63.30blog

該命令抓取全部來自以及發往IP地址205.153.63.30的主機。主機能夠經過名稱或IP地址來選定。雖然指定的是IP地址,但抓取數據流並不限於IP數據流,實際上,過濾器也會抓到ARP數據流。限定僅抓取特定協議的數據流要求更復雜的過濾器。

 

有若干種方式能夠指定和限制地址,下例是經過機器的以太網地址來選擇數據流:

bsd1# tcpdump ether host 0:10:5a:e3:37:c

 

數據流可進一步限制爲單向,分別用src或dst指定數據流的來源或目的地。下例顯示了發送到主機205.153.63.30的數據流:

bsd1# tcpdump dst 205.153.63.30

注意到本例中host被省略了。在某些例子中省略是沒問題的,但添加這些關鍵字一般更安全些。


廣播和多播數據相應可使用broadcast和multicast。因爲多播和廣播數據流在鏈路層和網絡層所指定的數據流是不一樣的,因此這兩種過濾器各有兩種形式。過濾器ether multicast抓取以太網多播地址的數據流,ip multicast抓取IP多播地址數據流。廣播數據流也是相似的使用方法。注意多播過濾器也會抓到廣播數據流。


除了抓取特定主機之外,還能夠抓取特定網絡。例如,如下命令限制抓取來自或發往205.153.60.0的報文:

bsd1# tcpdump net 205.153.60


如下命令也能夠作一樣的事情:

bsd1# tcpdump net 205.153.60.0 mask 255.255.255.0

而如下命令因爲最後的.0就沒法正常工做:

bsd1# tcpdump net 205.153.60.0

 

協議及端口過濾:

 

限制抓取指定協議如IP,Appletalk或TCP。還能夠限制創建在這些協議之上的服務,如DNS或RIP。這類抓取能夠經過三種方式進行:使用tcpdump關鍵字,經過協議關鍵字proto,或經過服務使用port關鍵字。

 

一些協議名可以被tcpdump識別到所以可經過關鍵字來指定。如下命令限制抓取IP數據流:

bsd1# tcpdump ip

固然,IP數據流包括TCP數據流,UDP數據流,等等。

 

若是僅抓取TCP數據流,可使用:

bsd1# tcpdump tcp

tcpdump可識別的關鍵字包括ip, igmp, tcp, udp, and icmp。

 

有不少傳輸層服務沒有能夠識別的關鍵字。在這種狀況下,可使用關鍵字proto或ip proto加上/etc/protocols可以找到的協議名或相應的協議編號。例如,如下兩種方式都會查找OSPF報文:

bsd1# tcpdump ip proto ospf

bsd1# tcpdump ip proto 89

 

內嵌的關鍵字可能會形成問題。下面的例子中,沒法使用tcp關鍵字,或必須使用數字。例如,下面的例子是正常工做的:

bsd#1 tcpdump ip proto 6

另外一方面,不能使用proto加上tcp:

bsd#1 tcpdump ip proto tcp

會產生問題。

 

對於更高層級的創建於底層協議之上的服務,必須使用關鍵字port。如下二者會採集DNS數據流:

bsd#1 tcpdump port domain

bds#1 tcpdump port 53

 

第一條命令中,關鍵字domain可以經過查找/etc/services來解析。在傳輸層協議有歧義的狀況下,能夠將端口限制爲指定協議。考慮以下命令:

bsd#1 tcpdump udp port domain

這會抓取使用UDP的DNS名查找但不包括使用TCP的DNS zone傳輸數據。而以前的兩條命令會同時抓取這兩種數據。

 

報文特徵:

 

過濾器也能夠基於報文特徵好比報文長度或特定字段的內容,過濾器必須包含關係運算符。要指定長度,使用關鍵字less或greater。以下例所示:

bsd1# tcpdump greater 200

該命令收集長度大於200字節的報文。

 

根據報文內容過濾更加複雜,由於用戶必須理解報文頭的結構。可是儘管如此,或者說正因如此,這一方式可以使用戶最大限度的控制抓取的數據。

通常使用語法 proto [ expr : size ]。字段proto指定要查看的報文頭——ip則查看IP頭,tcp則查看TCP頭,以此類推。expr字段給出從報文頭索引0開始的位移。即:報文頭的第一個字節爲0,第二字節爲1,以此類推。size字段是可選的,指定須要使用的字節數,1,2或4。

bsd1# tcpdump "ip[9] = 6"

查看第十字節的IP頭,協議值爲6。注意這裏必須使用引號。撇號或引號均可以,但反引號將沒法正常工做。


bsd1# tcpdump tcp

也是等效的,由於TCP協議編號爲6。


這一方式經常做爲掩碼來選擇特定比特位。值能夠是十六進制。可經過語法&加上比特掩碼來指定。下例提取從以太網頭第一字節開始(即目的地址第一字節),提取低階比特位,並確保該位不爲0:

bsd1# tcpdump 'ether[0] & 1 != 0'

該條件會選取廣播和多播報文。

 

以上兩個例子都有更好的方法來匹配報文。做爲一個更實際的例子,考慮如下命令:

bsd1# tcpdump "tcp[13] & 0x03 != 0"

該過濾器跳過TCP頭的13個字節,提取flag字節。掩碼0x03選擇第一和第二比特位,即FIN和SYN位。若是其中一位不爲0則報文被抓取。此命令會抓取TCP鏈接創建及關閉報文。

 

不要將邏輯運算符與關係運算符混淆。好比想tcp src port > 23這樣的表達式就沒法正常工做。由於tcp src port表達式返回值爲true或false,而不是一個數值,因此沒法與數值進行比較。若是須要查找端口號大於23的全部TCP數據流,必須從報文頭提取端口字段,使用表達式「tcp[0:2] & 0xffff > 0x0017」。

相關文章
相關標籤/搜索