-----------------------
bash-2.02# tcpdump
tcpdump: listening on eth0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
^C
------------------------
首先我們注意一下,從上面的輸出結(jié)果上可以看出來,基本上tcpdump總的的輸出格式為:系統(tǒng)時(shí)間 來源主機(jī).端口 > 目標(biāo)主機(jī).端口 數(shù)據(jù)包參數(shù)
TcpDump的參數(shù)化支持
tcpdump支持相當(dāng)多的不同參數(shù),如使用-i參數(shù)指定tcpdump監(jiān)聽的網(wǎng)絡(luò)界面,這在計(jì)算機(jī)具有多個(gè)網(wǎng)絡(luò)界面時(shí)非常有用,使用-c參數(shù)指定要監(jiān)聽的數(shù)據(jù)包數(shù)量,使用-w參數(shù)指定將監(jiān)聽到的數(shù)據(jù)包寫入文件中保存,等等。
然而更復(fù)雜的tcpdump參數(shù)是用于過濾目的,這是因?yàn)榫W(wǎng)絡(luò)中流量很大,如果不加分辨將所有的數(shù)據(jù)包都截留下來,數(shù)據(jù)量太大,反而不容易發(fā)現(xiàn)需要的數(shù)據(jù)包。使用這些參數(shù)定義的過濾規(guī)則可以截留特定的數(shù)據(jù)包,以縮小目標(biāo),才能更好的分析網(wǎng)絡(luò)中存在的問題。tcpdump使用參數(shù)指定要監(jiān)視數(shù)據(jù)包的類型、地址、端口等,根據(jù)具體的網(wǎng)絡(luò)問題,充分利用這些過濾規(guī)則就能達(dá)到迅速定位故障的目的。請使用man tcpdump查看這些過濾規(guī)則的具體用法。
顯然為了安全起見,不用作網(wǎng)絡(luò)管理用途的計(jì)算機(jī)上不應(yīng)該運(yùn)行這一類的網(wǎng)絡(luò)分析軟件,為了屏蔽它們,可以屏蔽內(nèi)核中的bpfilter偽設(shè)備。一般情況下網(wǎng)絡(luò)硬件和TCP/IP堆棧不支持接收或發(fā)送與本計(jì)算機(jī)無關(guān)的數(shù)據(jù)包,為了接收這些數(shù)據(jù)包,就必須使用網(wǎng)卡的混雜模式,并繞過標(biāo)準(zhǔn)的TCP/IP堆棧才行。在FreeBSD下,這就需要內(nèi)核支持偽設(shè)備bpfilter。因此,在內(nèi)核中取消bpfilter支持,就能屏蔽tcpdump之類的網(wǎng)絡(luò)分析工具。
并且當(dāng)網(wǎng)卡被設(shè)置為混雜模式時(shí),系統(tǒng)會(huì)在控制臺(tái)和日志文件中留下記錄,提醒管理員留意這臺(tái)系統(tǒng)是否被用作攻擊同網(wǎng)絡(luò)的其他計(jì)算機(jī)的跳板。
May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled
雖然網(wǎng)絡(luò)分析工具能將網(wǎng)絡(luò)中傳送的數(shù)據(jù)記錄下來,但是網(wǎng)絡(luò)中的數(shù)據(jù)流量相當(dāng)大,如何對這些數(shù)據(jù)進(jìn)行分析、分類統(tǒng)計(jì)、發(fā)現(xiàn)并報(bào)告錯(cuò)誤卻是更關(guān)鍵的問題。網(wǎng)絡(luò)中的數(shù)據(jù)包屬于不同的協(xié)議,而不同協(xié)議數(shù)據(jù)包的格式也不同。因此對捕獲的數(shù)據(jù)進(jìn)行解碼,將包中的信息盡可能的展示出來,對于協(xié)議分析工具來講更為重要。昂貴的商業(yè)分析工具的優(yōu)勢就在于它們能支持很多種類的應(yīng)用層協(xié)議,而不僅僅只支持tcp、udp等低層協(xié)議。
從上面tcpdump的輸出可以看出,tcpdump對截獲的數(shù)據(jù)并沒有進(jìn)行徹底解碼,數(shù)據(jù)包內(nèi)的大部分內(nèi)容是使用十六進(jìn)制的形式直接打印輸出的。顯然這不利于分析網(wǎng)絡(luò)故障,通常的解決辦法是先使用帶-w參數(shù)的tcpdump 截獲數(shù)據(jù)并保存到文件中,然后再使用其他程序進(jìn)行解碼分析。當(dāng)然也應(yīng)該定義過濾規(guī)則,以避免捕獲的數(shù)據(jù)包填滿整個(gè)硬盤。
TCP功能
數(shù)據(jù)過濾
不帶任何參數(shù)的TcpDump將搜索系統(tǒng)中所有的網(wǎng)絡(luò)接口,并顯示它截獲的所有數(shù)據(jù),這些數(shù)據(jù)對我們不一定全都需要,而且數(shù)據(jù)太多不利于分析。所以,我們應(yīng)當(dāng)先想好需要哪些數(shù)據(jù),TcpDump提供以下參數(shù)供我們選擇數(shù)據(jù):
-b 在數(shù)據(jù)-鏈路層上選擇協(xié)議,包括ip、arp、rarp、ipx都是這一層的。
例如:tcpdump -b arp 將只顯示網(wǎng)絡(luò)中的arp即地址轉(zhuǎn)換協(xié)議信息。
-i 選擇過濾的網(wǎng)絡(luò)接口,如果是作為路由器至少有兩個(gè)網(wǎng)絡(luò)接口,通過這個(gè)選項(xiàng),就可以只過濾指定的接口上通過的數(shù)據(jù)。例如:
tcpdump -i eth0 只顯示通過eth0接口上的所有報(bào)頭。
src、dst、port、host、net、ether、gateway這幾個(gè)選項(xiàng)又分別包含src、dst 、port、host、net、ehost等附加選項(xiàng)。他們用來分辨數(shù)據(jù)包的來源和去向,src host 192.168.0.1指定源主機(jī)IP地址是192.168.0.1,dst net 192.168.0.0/24指定目標(biāo)是網(wǎng)絡(luò)192.168.0.0。以此類推,host是與其指定主機(jī)相關(guān)無論它是源還是目的,net是與其指定網(wǎng)絡(luò)相關(guān)的,ether后面跟的不是IP地址而是物理地址,而gateway則用于網(wǎng)關(guān)主機(jī)。可能有點(diǎn)復(fù)雜,看下面例子就知道了:
tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24
過濾的是源主機(jī)為192.168.0.1與目的網(wǎng)絡(luò)為192.168.0.0的報(bào)頭。
tcpdump ether src 00:50:04:BA:9B and dst……
過濾源主機(jī)物理地址為XXX的報(bào)頭(為什么ether src后面沒有host或者net?物理地址當(dāng)然不可能有網(wǎng)絡(luò)嘍)。
Tcpdump src host 192.168.0.1 and dst port not telnet
過濾源主機(jī)192.168.0.1和目的端口不是telnet的報(bào)頭。
ip icmp arp rarp 和 tcp、udp、icmp這些選項(xiàng)等都要放到第一個(gè)參數(shù)的位置,用來過濾數(shù)據(jù)報(bào)的類型。