(承接上文)
過濾:
要有效地使用tcpdump,掌握過濾器非常必要的。過濾允許使用者指定想要抓取的資料流,從而使用者可以專注於感興趣的資料。此外,ethereal這樣的工具使用tcpdump過濾語法來抓取資料流。
如果使用者很清楚對何種資料流不感興趣,可以將這部分資料排除在外。如果使用者不確定需要什麼資料,可以將源資料收集到檔案之後在讀取時應用過濾器。實際應用中,需要經常在兩種方式之間轉換。
簡單的過濾器是加在命令列之後的關鍵字。但是,複雜的命令是由邏輯和關係運算子構成的。對於這樣的情況,通常最好用-f選項將過濾器儲存在檔案中。例如,假設testfilter 是乙個包含過濾主機205.153.63.30的文字檔案,之後輸入tcpdump –ftestfilter等效於輸入命令tcpdump host 205.153.63.30。通常,這一功能只在複雜過濾器時使用。但是,同一命令中命令列過濾器和檔案過濾器不能混用。
bsd1# tcpdump host 205.153.63.30
該命令抓取所有來自以及發往ip位址205.153.63.30的主機。主機可以通過名稱或ip位址來選定。雖然指定的是ip位址,但抓取資料流並不限於ip資料流,實際上,過濾器也會抓到arp資料流。限定僅抓取特定協議的資料流要求更複雜的過濾器。
bsd1# tcpdump ether host 0:10:5a:e3:37:c
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
協議及埠過濾:
一些協議名能夠被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」。
網路基本功(十八) 細說tcpdump的妙用(下)
網路基本功 十八 細說tcpdump的妙用 下 承接上文 過濾 要有效地使用tcpdump,掌握過濾器非常必要的。過濾允許使用者指定想要抓取的資料流,從而使用者可以專注於感興趣的資料。此外,ethereal這樣的工具使用tcpdump過濾語法來抓取資料流。如果使用者很清楚對何種資料流不感興趣,可以將...
網路基本功一 細說網路傳輸
常言道 欲練神功,必先練好基本功。之前做了乙個關於ip路由,預設閘道器和掩碼的問答貼,做完這個帖子覺得如果對網路知識點做乙個系統的闡述,應該會很有幫助。本系列文章著重於講解網路管理實際應用中常常涉及的重要知識點,盡量以實用為主。準備寫的幾個章節暫時有 可能會有增減 首先來看乙個例子 示例 網路伺服器...
網路基本功(九) 細說TCP重傳
emc中文支援論壇 tcp的主要任務是很簡單 打包和傳送資料。tcp與其他協議的不同之處在於使用滑動視窗來管理基本資料收發過程,同時確保資料流的有效及可靠傳輸,從而不致傳送速率明顯快於接收速率。本文將描述tcp是如何確保裝置可靠 有效地進行傳輸的。首先闡述tcp檢測丟失片段以及重傳的基本方法,之後介...