轉(zhuǎn)載請(qǐng)?jiān)谖氖妆A粼某鎏帲?/span>EMC中文支持論壇https://community./go/chinese
更多信息
(承接上文)
過(guò)濾:
要有效地使用tcpdump,掌握過(guò)濾器非常必要的。過(guò)濾允許用戶(hù)指定想要抓取的數(shù)據(jù)流,從而用戶(hù)可以專(zhuān)注于感興趣的數(shù)據(jù)。此外,ethereal這樣的工具使用tcpdump過(guò)濾語(yǔ)法來(lái)抓取數(shù)據(jù)流。 如果用戶(hù)很清楚對(duì)何種數(shù)據(jù)流不感興趣,可以將這部分?jǐn)?shù)據(jù)排除在外。如果用戶(hù)不確定需要什么數(shù)據(jù),可以將源數(shù)據(jù)收集到文件之后在讀取時(shí)應(yīng)用過(guò)濾器。實(shí)際應(yīng)用中,需要經(jīng)常在兩種方式之間轉(zhuǎn)換。 簡(jiǎn)單的過(guò)濾器是加在命令行之后的關(guān)鍵字。但是,復(fù)雜的命令是由邏輯和關(guān)系運(yùn)算符構(gòu)成的。對(duì)于這樣的情況,通常最好用-F選項(xiàng)將過(guò)濾器存儲(chǔ)在文件中。例如,假設(shè)testfilter 是一個(gè)包含過(guò)濾主機(jī)205.153.63.30的文本文件,之后輸入tcpdump –Ftestfilter等效于輸入命令tcpdump host 205.153.63.30。通常,這一功能只在復(fù)雜過(guò)濾器時(shí)使用。但是,同一命令中命令行過(guò)濾器和文件過(guò)濾器不能混用。
地址過(guò)濾:
過(guò)濾器可以按照地址選擇數(shù)據(jù)流。例如,考慮如下命令: bsd1# tcpdump host 205.153.63.30 該命令抓取所有來(lái)自以及發(fā)往IP地址205.153.63.30的主機(jī)。主機(jī)可以通過(guò)名稱(chēng)或IP地址來(lái)選定。雖然指定的是IP地址,但抓取數(shù)據(jù)流并不限于IP數(shù)據(jù)流,實(shí)際上,過(guò)濾器也會(huì)抓到ARP數(shù)據(jù)流。限定僅抓取特定協(xié)議的數(shù)據(jù)流要求更復(fù)雜的過(guò)濾器。
有若干種方式可以指定和限制地址,下例是通過(guò)機(jī)器的以太網(wǎng)地址來(lái)選擇數(shù)據(jù)流: bsd1# tcpdump ether host 0:10:5a:e3:37:c
數(shù)據(jù)流可進(jìn)一步限制為單向,分別用src或dst指定數(shù)據(jù)流的來(lái)源或目的地。下例顯示了發(fā)送到主機(jī)205.153.63.30 的數(shù)據(jù)流: bsd1# tcpdump dst 205.153.63.30 注意到本例中host被省略了。在某些例子中省略是沒(méi)問(wèn)題的,但添加這些關(guān)鍵字通常更安全些。 廣播和多播數(shù)據(jù)相應(yīng)可以使用broadcast和multicast。由于多播和廣播數(shù)據(jù)流在鏈路層和網(wǎng)絡(luò)層所指定的數(shù)據(jù)流是不同的,所以這兩種過(guò)濾器各有兩種形式。過(guò)濾器ether multicast抓取以太網(wǎng)多播地址的數(shù)據(jù)流,ip multicast抓取IP多播地址數(shù)據(jù)流。廣播數(shù)據(jù)流也是類(lèi)似的使用方法。注意多播過(guò)濾器也會(huì)抓到廣播數(shù)據(jù)流。 除了抓取特定主機(jī)以外,還可以抓取特定網(wǎng)絡(luò)。例如,以下命令限制抓取來(lái)自或發(fā)往205.153.60.0的報(bào)文: bsd1# tcpdump net 205.153.60 以下命令也可以做同樣的事情: bsd1# tcpdump net 205.153.60.0 mask 255.255.255.0 而以下命令由于最后的.0就無(wú)法正常工作: bsd1# tcpdump net 205.153.60.0
協(xié)議及端口過(guò)濾:
限制抓取指定協(xié)議如IP,Appletalk或TCP。還可以限制建立在這些協(xié)議之上的服務(wù),如DNS或RIP。這類(lèi)抓取可以通過(guò)三種方式進(jìn)行:使用tcpdump關(guān)鍵字,通過(guò)協(xié)議關(guān)鍵字proto,或通過(guò)服務(wù)使用port關(guān)鍵字。
一些協(xié)議名能夠被tcpdump識(shí)別到因此可通過(guò)關(guān)鍵字來(lái)指定。以下命令限制抓取IP數(shù)據(jù)流: bsd1# tcpdump ip 當(dāng)然,IP數(shù)據(jù)流包括TCP數(shù)據(jù)流,UDP數(shù)據(jù)流,等等。
如果僅抓取TCP數(shù)據(jù)流,可以使用: bsd1# tcpdump tcp tcpdump可識(shí)別的關(guān)鍵字包括ip, igmp, tcp, udp, and icmp。
有很多傳輸層服務(wù)沒(méi)有可以識(shí)別的關(guān)鍵字。在這種情況下,可以使用關(guān)鍵字proto或ip proto加上/etc/protocols能夠找到的協(xié)議名或相應(yīng)的協(xié)議編號(hào)。例如,以下兩種方式都會(huì)查找OSPF報(bào)文: bsd1# tcpdump ip proto ospf bsd1# tcpdump ip proto 89
內(nèi)嵌的關(guān)鍵字可能會(huì)造成問(wèn)題。下面的例子中,無(wú)法使用tcp關(guān)鍵字,或必須使用數(shù)字。例如,下面的例子是正常工作的: bsd#1 tcpdump ip proto 6 另一方面,不能使用proto加上tcp: bsd#1 tcpdump ip proto tcp 會(huì)產(chǎn)生問(wèn)題。
對(duì)于更高層級(jí)的建立于底層協(xié)議之上的服務(wù),必須使用關(guān)鍵字port。以下兩者會(huì)采集DNS數(shù)據(jù)流: bsd#1 tcpdump port domain bds#1 tcpdump port 53
第一條命令中,關(guān)鍵字domain能夠通過(guò)查找/etc/services來(lái)解析。在傳輸層協(xié)議有歧義的情況下,可以將端口限制為指定協(xié)議。考慮如下命令: bsd#1 tcpdump udp port domain 這會(huì)抓取使用UDP的DNS名查找但不包括使用TCP的DNS zone傳輸數(shù)據(jù)。而之前的兩條命令會(huì)同時(shí)抓取這兩種數(shù)據(jù)。
報(bào)文特征:
過(guò)濾器也可以基于報(bào)文特征比如報(bào)文長(zhǎng)度或特定字段的內(nèi)容,過(guò)濾器必須包含關(guān)系運(yùn)算符。要指定長(zhǎng)度,使用關(guān)鍵字less或greater。如下例所示: bsd1# tcpdump greater 200 該命令收集長(zhǎng)度大于200字節(jié)的報(bào)文。
根據(jù)報(bào)文內(nèi)容過(guò)濾更加復(fù)雜,因?yàn)橛脩?hù)必須理解報(bào)文頭的結(jié)構(gòu)。但是盡管如此,或者說(shuō)正因如此,這一方式能夠使用戶(hù)最大限度的控制抓取的數(shù)據(jù)。 一般使用語(yǔ)法 proto [ expr : size ]。字段proto指定要查看的報(bào)文頭——ip則查看IP頭,tcp則查看TCP頭,以此類(lèi)推。expr字段給出從報(bào)文頭索引0開(kāi)始的位移。即:報(bào)文頭的第一個(gè)字節(jié)為0,第二字節(jié)為1,以此類(lèi)推。size字段是可選的,指定需要使用的字節(jié)數(shù),1,2或4。 bsd1# tcpdump "ip[9] = 6" 查看第十字節(jié)的IP頭,協(xié)議值為6。注意這里必須使用引號(hào)。撇號(hào)或引號(hào)都可以,但反引號(hào)將無(wú)法正常工作。 bsd1# tcpdump tcp 也是等效的,因?yàn)?/span>TCP協(xié)議編號(hào)為6。 這一方式常常作為掩碼來(lái)選擇特定比特位。值可以是十六進(jìn)制。可通過(guò)語(yǔ)法&加上比特掩碼來(lái)指定。下例提取從以太網(wǎng)頭第一字節(jié)開(kāi)始(即目的地址第一字節(jié)),提取低階比特位,并確保該位不為0: bsd1# tcpdump 'ether[0] & 1 != 0' 該條件會(huì)選取廣播和多播報(bào)文。
以上兩個(gè)例子都有更好的方法來(lái)匹配報(bào)文。作為一個(gè)更實(shí)際的例子,考慮以下命令: bsd1# tcpdump "tcp[13] & 0x03 != 0" 該過(guò)濾器跳過(guò)TCP頭的13個(gè)字節(jié),提取flag字節(jié)。掩碼0x03選擇第一和第二比特位,即FIN和SYN位。如果其中一位不為0則報(bào)文被抓取。此命令會(huì)抓取TCP連接建立及關(guān)閉報(bào)文。
不要將邏輯運(yùn)算符與關(guān)系運(yùn)算符混淆。比如想tcp src port > 23這樣的表達(dá)式就無(wú)法正常工作。因?yàn)?/span>tcp src port表達(dá)式返回值為true或false,而不是一個(gè)數(shù)值,所以無(wú)法與數(shù)值進(jìn)行比較。如果需要查找端口號(hào)大于23的所有TCP數(shù)據(jù)流,必須從報(bào)文頭提取端口字段,使用表達(dá)式“tcp[0:2] & 0xffff > 0x0017”。 為了便于理解,我再用簡(jiǎn)單的語(yǔ)句表述一下:
Seq:數(shù)據(jù)段的序號(hào),當(dāng)TCP收到亂序報(bào)文時(shí),可供重新排序。
Ack:接收方向發(fā)送方確認(rèn)已接收到哪些字節(jié)。
SYN:發(fā)起連接請(qǐng)求的標(biāo)志位。
FIN:請(qǐng)求終止連接的標(biāo)志位。 |
|
來(lái)自: icecity1306 > 《通信知識(shí)》