天天看點

tcpdump中文詳細手冊

名稱(NAME)

tcpdump-轉儲網絡上的資料流

總覽(SYNOPSIS)

tcpdump[-adeflnNOpqStvx][-ccount][-Ffile]

[-iinterface][-rfile][-ssnaplen]

[-Ttype][-wfile][expression]

描述(DESCRIPTION)

Tcpdump列印出在某個網絡界面上,比對布爾表達式expression的報頭.

對于SunOS的nit或bpf界面:要運作tcpdump,你必須有/dev/nit或/dev/bpf*的讀通路權限.

對于Solaris的dlpi:你必須有網絡仿真裝置(networkpseudodevice),如/dev/le的讀通路權限.

對于HP-UX的dlpi:你必須是root,或者把它安裝成root的設定uid程式.對于IRIX的snoop:你必須是root,或者把它安裝成root的設定uid程式.對于Linux:你必須是root,或者把它安裝成root的設定uid程式.

對于Ultrix和DigitalUNIX:一旦超級使用者使用pfconfig(8)開放了promiscuous操作模式(promiscuous-mode),任何使用者都可以運作tcpdump.

對于BSD:你必須有/dev/bpf*的讀通路權限.

選項(OPTIONS)

-a

試着把網絡和廣播位址轉換成名稱.

-c

當收到count封包後退出.

-d

把編譯好的封包比對模闆(packet-matchingcode)翻譯成可讀形式,傳往标準輸出,然後退出.

-dd

把封包比對模闆(packet-matchingcode)以C程式片斷的形式輸出.

-ddd

把封包比對模闆(packet-matchingcode)以十進制數形式輸出(前面加上總數).

-e

每行都顯示鍊路層報頭.

-f

用數字形式顯示'外部的'網際網路位址,而不是字元形式(這個選項用來繞開腦殼壞光的SUN黃頁伺服器的問題---一般說來它翻譯外部網絡數字位址的時候會長期挂起).

-F

把file的内容用作過濾表達式.忽略指令行上的表達式.

-i

監聽interface.如果不指定接口,tcpdump在系統的接口清單中,尋找号碼最小,已經配置好的接口(loopback除外).選中的時候會中斷連接配接.

-l

行緩沖标準輸出.可用于捕捉資料的同時檢視資料.例如,

``tcpdump-l|teedat''or``tcpdump-l>dat&tail-fdat''.

-n

别把位址轉換成名字(就是說,主機位址,端口号等)

-N

不顯示主機名字中的域名部分.例如,如果使用這個選項,tcpdump隻顯示``nic'',而不是``nic.ddn.mil''.

-O

禁止運作封包比對模闆的優化器.隻有當你懷疑優化器有bug時才有用.

-p

禁止把接口置成promiscuous模式.注意,接口有可能因其他原因而處于promiscuous模式;是以,'-p'不能作為`etherhost{local-hw-addr}或etherbroadcast'的簡寫.

-q

快速輸出.顯示較少的協定資訊,輸出行會短一點點.

-r

從file中讀入資料報(檔案是用-w選項建立的).如果file是``-'',就讀标準輸入.

-s

從每個封包中截取snaplen位元組的資料,而不是預設的68(如果是SunOS的NIT,最小值是96).68個位元組适用于IP,ICMP,TCP和 UDP,但是有可能截掉名字伺服器和NFS封包的協定資訊(見下面).輸出時如果指定``[|proto]'',tcpdump可以指出那些捕捉量過小的資料報,這裡的proto是截斷發生處的協定層名稱.注意,采用更大的捕捉範圍既增加了處理封包的時間,又相應的減少了封包的緩沖數量,可能導緻封包的丢失.你應該把snaplen設的盡量小,隻要能夠容納你需要的協定資訊就可以了.

-T

把通過"expression"挑選出來的封包解釋成指定的type.目前已知的類型有:rpc(遠端過程調用RemoteProcedureCall),rtp(實時應用協定Real- TimeApplicationsprotocol),rtcp(實時應用控制協定Real- TimeApplicationscontrolprotocol),vat(可視音頻工具VisualAudioTool),和wb(分布式白闆 distributedWhiteBoard).

-S

顯示絕對的,而不是相對的TCP序列号.

-t

禁止顯示時戳标志.

-tt

顯示未格式化的時戳标志.

-v

(稍微多一點)繁瑣的輸出.例如,顯示IP資料報中的生存周期和服務類型.

-vv

更繁瑣的輸出.例如,顯示NFS應答封包的附加域.

-w

把原始封包存進file,而不是分析和顯示.它們可以以後用-r選項顯示.如果file是``-'',就寫往标準輸出.

-x

以16進制數形式顯示每一個封包(去掉鍊路層報頭後).可以顯示較小的完整封包,否則隻顯示snaplen個位元組.

expression

用來選擇要轉儲的資料報.如果沒有指定expression,就轉儲網絡的全部封包.否則,隻轉儲相對expression為`true'的資料報.

expression一個或多個原語(primitive)組成.原語通常由一個辨別(id,名稱或數字),和辨別前面的一個或多個修飾子(qualifier)組成.修飾子有三種不同的類型:

type

類型修飾子指出辨別名稱或辨別數字代表什麼類型的東西.可以使用的類型有host,net和port.例如,`hostfoo',`net128.3',`port20'.如果不指定類型修飾子,就使用預設的host.

dir

方向修飾子指出相對于辨別的傳輸方向(資料是傳入還是傳出辨別).可以使用的方向有src,dst,srcordst和srcanddst.例如, `srcfoo',`dstnet128.3',`srcordstportftp-data'.如果不指定方向修飾子,就使用預設的srcordst. 對于`null'鍊路層(就是說象slip之類的點到點協定),用inbound和outbound修飾子指定所需的傳輸方向.

proto

協定修飾子要求比對指定的協定.可以使用的協定有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc, mopdl,tcp和udp.例如,`ethersrcfoo',`arpnet128.3',`tcpport21'.如果不指定協定修飾子,就使用所有符合類型的協定.例如,`srcfoo'指`(ip或arp或rarp)srcfoo'(注意後者不符合文法),`netbar'指`(ip或arp或 rarp)netbar',`port53'指`(tcp或udp)port53'.

[`fddi'實際上是`ether'的别名;分析器把它們視為``用在指定網絡接口上的資料鍊路層.''FDDI報頭包含類似于以太協定的源目位址,而且通常包含類似于以太協定的封包類型,是以你可以過濾 FDDI域,就象分析以太協定一樣.FDDI報頭也包含其他域,但是你不能在過濾器表達式裡顯式描述.]

作為上述的補充,有一些特殊的`原語'關鍵字,它們不同于上面的模式:gateway,broadcast,less,greater和數學表達式.這些在後面有叙述.

更複雜的過濾器表達式可以通過and,or和not連接配接原語來組建.例如,`hostfooandnotportftpandnotportftp- data'.為了少敲點鍵,可以忽略相同的修飾子.例如,`tcpdstportftporftp-dataordomain'實際上就是 `tcpdstportftportcpdstportftp-dataortcpdstportdomain'.

允許的原語有:

dsthosthost

如果封包中IP的目的位址域是host,則邏輯為真.host既可以是位址,也可以是主機名.

srchosthost

如果封包中IP的源位址域是host,則邏輯為真.

hosthost

如果封包中IP的源位址域或者目的位址域是host,則邏輯為真.上面所有的host表達式都可以加上ip,arp,或rarp關鍵字做字首,就象:

iphosthost

它等價于:

etherproto/ipandhosthost

如果host是擁有多個IP位址的主機名,它的每個位址都會被查驗.

etherdstehost

如果封包的以太目的位址是ehost,則邏輯為真.Ehost既可以是名字(/etc/ethers裡有),也可以是數字(有關數字格式另見ethers(3N)).

ethersrcehost

如果封包的以太源位址是ehost,則邏輯為真.

etherhostehost

如果封包的以太源位址或以太目的位址是ehost,則邏輯為真.

gatewayhost

如果封包把host當做網關,則邏輯為真.也就是說,封包的以太源或目的位址是host,但是IP的源目位址都不是host.host必須是個主機名,而且必須存在/etc/hosts和/etc/ethers中.(一個等價的表達式是

etherhostehostandnothosthost

對于host/ehost,它既可以是名字,也可以是數字.)

dstnetnet

如果封包的IP目的位址屬于網絡号net,則邏輯為真.net既可以是名字(存在/etc/networks中),也可以是網絡号.(詳見networks(4)).

srcnetnet

如果封包的IP源位址屬于網絡号net,則邏輯為真.

netnet

如果封包的IP源位址或目的位址屬于網絡号net,則邏輯為真.

netnetmaskmask

如果IP位址比對指定網絡掩碼(netmask)的net,則邏輯為真.本原語可以用src或dst修飾.

netnet/len

如果IP位址比對指定網絡掩碼的net,則邏輯為真,掩碼的有效位寬為len.本原語可以用src或dst修飾.

dstportport

如果封包是ip/tcp或ip/udp,并且目的端口是port,則邏輯為真.port是一個數字,也可以是/etc/services中說明過的名字(參看tcp(4P)和udp(4P)).如果使用名字,則檢查端口号和協定.如果使用數字,或者有二義的名字,則隻檢查端口号(例如,dstport513 将顯示tcp/login的資料和udp/who的資料,而portdomain将顯示tcp/domain和udp/domain的資料).

srcportport

如果封包的源端口号是port,則邏輯為真.

portport

如果封包的源端口或目的端口是port,則邏輯為真.上述的任意一個端口表達式都可以用關鍵字tcp或udp做字首,就象:

tcpsrcportport

它隻比對源端口是port的TCP封包.

lesslength

如果封包的長度小于等于length,則邏輯為真.它等同于:

len<=length.

greaterlength

如果封包的長度大于等于length,則邏輯為真.它等同于:

len>=length.

ipprotoprotocol

如果封包是IP資料報(參見ip(4P)),其内容的協定類型是protocol,則邏輯為真.Protocol可以是數字,也可以是下列名稱中的一個: icmp,igrp,udp,nd,或tcp.注意這些辨別符tcp,udp,和icmp也同樣是關鍵字,是以必須用反斜杠(/)轉義,在C-shell 中應該是//.

etherbroadcast

如果封包是以太廣播封包,則邏輯為真.關鍵字ether是可選的.

ipbroadcast

如果封包是IP廣播封包,則邏輯為真.Tcpdump檢查全0和全1廣播約定,并且檢查本地的子網路遮罩.

ethermulticast

如果封包是以太多目傳送封包(multicast),則邏輯為真.關鍵字ether是可選的.這實際上是`ether[0]&1!=0'的簡寫.

ipmulticast

如果封包是IP多目傳送封包,則邏輯為真.

etherprotoprotocol

如果封包協定屬于以太類型的protocol,則邏輯為真.Protocol可以是數字,也可以是名字,如ip,arp,或rarp.注意這些辨別符也是關鍵字,是以必須用反斜杠(/)轉義.[如果是FDDI(例如,`fddiprotocolarp'),協定辨別來自802.2邏輯鍊路控制(LLC)報頭,它通常位于FDDI報頭的頂層.當根據協定辨別過濾封包時,Tcpdump假設所有的FDDI封包含有LLC報頭,而且LLC報頭用的是SNAP格式.]

decnetsrchost

如果DECNET的源位址是host,則邏輯為真,該主機位址的形式可能是``10.123'',或者是DECNET主機名.[隻有配置成運作DECNET的Ultrix系統支援DECNET主機名.]

decnetdsthost

如果DECNET的目的位址是host,則邏輯為真.

decnethosthost

如果DECNET的源位址或目的位址是host,則邏輯為真.

ip,arp,rarp,decnet

是:

etherprotop

的簡寫形式,其中p為上述協定的一種.

lat,moprc,mopdl

是:

etherprotop

的簡寫形式,其中p為上述協定的一種.注意tcpdump目前不知道如何分析這些協定.

tcp,udp,icmp

是:

ipprotop

的簡寫形式,其中p為上述協定的一種.

exprrelopexpr

如果這個關系成立,則邏輯為真,其中relop是>,<,>=,<=,=,!=之一,expr是數學表達式,由常整數(标準C文法形式),普通的二進制運算符[+,-,*,/,&,|],一個長度運算符,和指定的封包資料通路算符組成.要通路封包内的資料,使用下面的文法:

proto[expr:size]

Proto 是ether,fddi,ip,arp,rarp,tcp,udp,oricmp之一,同時也指出了下标操作的協定層.expr給出位元組機關的偏移量,該偏移量相對于指定的協定層.Size是可選項,指出感興趣的位元組數;它可以是1,2,4,預設為1位元組.由關鍵字len給出的長度運算符指明封包的長度.

例如,`ether[0]&1!=0'捕捉所有的多目傳送封包.表達式`ip[0]&0xf!=5'捕捉所有帶可選域的IP封包.表達式 `ip[6:2]&0x1fff=0'隻捕捉未分片和片偏移為0的資料報.這種檢查隐含在tcp和udp下标操作中.例如,tcp[0]一定是 TCP報頭的第一個位元組,而不是其中某個IP片的第一個位元組.

原語可以用下述方法結合使用:

園括弧括起來的原語和操作符(園括弧在Shell中有專用,是以必須轉義).

取反操作(`!'or`not').

連結操作(`&&'or`and').

或操作(`||'or`or').

取反操作有最高優先級.或操作和連結操作有相同的優先級,運算時從左到右結合.注意連結操作需要顯式的and算符,而不是并列放置.

如果給出辨別符,但沒給關鍵字,那麼暗指最近使用的關鍵字.例如,

nothostvsandace

作為

nothostvsandhostace

的簡寫形式,不應該和

not(hostvsorace)

混淆.

表達式參數可以作為單個參數傳給tcpdump,也可以作為複合參數,後者更友善一些.一般說來,如果表達式包含Shell元字元(metacharacter),傳遞單個括起來的參數要容易一些.複合參數在被解析前用空格聯接一起.

示例(EXAMPLES)

顯示所有進出sundown的封包:

tcpdumphostsundown

顯示helios和主機hot,ace之間的封包傳送:

tcpdumphostheliosand/(hotorace/)

顯示ace和除了helios以外的所有主機的IP封包:

tcpdumpiphostaceandnothelios

顯示本地的主機和Berkeley的主機之間的網絡資料:

tcpdumpnetucb-ether

顯示所有通過網關snup的ftp封包(注意這個表達式被單引号括起,防止shell解釋園括弧):

tcpdump'gatewaysnupand(portftporftp-data)'

顯示既不是來自本地主機,也不是傳往本地主機的網絡資料(如果你把網關通往某個其他網絡,這個做法将不會把資料發往你的本地網絡).

tcpdumpipandnotnetlocalnet

顯示每個TCP會話的起始和結束封包(SYN和FIN封包),而且會話方中有一個遠端主機.

tcpdump'tcp[13]&3!=0andnotsrcanddstnetlocalnet'

顯示經過網關snup中大于576位元組的IP資料報:

tcpdump'gatewaysnupandip[2:2]>576'

顯示IP廣播或多目傳送的資料報,這些封包不是通過以太網的廣播或多目傳送形式傳送的:

tcpdump'ether[0]&1=0andip[16]>=224'

顯示所有不是回響請求/應答的ICMP封包(也就是說,不是ping封包):

tcpdump'icmp[0]!=8andicmp[0]!=0"

輸出格式(OUTPUTFORMAT)

tcpdump的輸出格式取決于協定.下面的描述給出大多數格式的簡要說明和範例.

鍊路層報頭(LinkLevelHeaders)

如果給出'-e'選項就顯示鍊路層報頭.在以太網上,顯示封包的源目位址,協定和封包長度.

在FDDI 網絡上,'-e'選項導緻tcpdump顯示出`幀控制(framecontrol)'域,源目位址和封包長度.(`幀控制'域負責解釋其餘的封包.普通封包(比如說載有IP資料報)是`異步'封包,優先級介于0到7;例如,`async4'.這些被認為載有802.2邏輯鍊路控制(LLC)封包;如果它們不是ISO資料報或者所謂的SNAP封包,就顯示出LLC報頭.

(注意:以下描述中假設你熟悉RFC-1144中說明的SLIP壓縮算法.)

在SLIP 鍊路上,tcpdump顯示出方向訓示(``I''指inbound,``O''指outbound),封包類型和壓縮資訊.首先顯示的是封包類型.有三種類型ip,utcp和ctcp.對于ip封包不再顯示更多的鍊路資訊.對于TCP封包,在類型後面顯示連接配接辨別.如果封包是壓縮過的,就顯示出編碼的報頭.特殊情形以*S+n和*SA+n的形式顯示,這裡的n是順序号(或順序号及其确認)發生的改變總和.如果不是特殊情形,就顯示0或多少個改變.改變由 U(urgentpointer),W(window),A(ack),S(sequencenumber)和I(packetID)指明,後跟一個變化量(+nor-n),或另一個值(=n).最後顯示封包中的資料總和,以及壓縮報頭的長度.

例如,下面一行顯示了一個傳出的壓縮的TCP封包,有一個隐含的連接配接辨別;确認(ack)的變化量是6,順序号是49,封包ID是6;有三個位元組的資料和六個位元組的壓縮報頭:

Octcp*A+6S+49I+63(6)

ARP/RARP封包

Arp/rarp封包的輸出顯示請求類型及其參數.輸出格式傾向于能夠自我解釋.這裡是一個簡單的例子,來自主機rtsg到主機csam的'rlogin'開始部分:

arpwho-hascsamtellrtsg

arpreplycsamis-atCSAM

第一行說明rtsg發出一個arp封包詢問internet主機csam的以太網位址.Csam用它的以太位址作應答(這個例子中,以太位址是大寫的,internet位址為小寫).

如果用tcpdump-n看上去要清楚一些:

arpwho-has128.3.254.6tell128.3.254.68

arpreply128.3.254.6is-at02:07:01:00:01:c4

如果用tcpdump-e,可以看到實際上第一個封包是廣播,第二個封包是點到點的:

RTSGBroadcast080664:arpwho-hascsamtellrtsg

CSAMRTSG080664:arpreplycsamis-atCSAM

這裡第一個封包指出以太網源位址是RTSG,目的位址是以太網廣播位址,類型域為16進制數0806(類型ETHER_ARP),封包全長64位元組.

TCP封包

(注意:以下的描述中假設你熟悉RFC-793中說明的TCP協定,如果你不了解這個協定,無論是本文還是tcpdump都對你用處不大)

一般說來tcp協定的輸出格式是:

src>dst:flagsdata-seqnoackwindowurgentoptions

Src 和dst是源目IP位址和端口.Flags是S(SYN),F(FIN),P(PUSH)或R(RST)或單獨的`.'(無标志),或者是它們的組合. Data-seqno說明了本封包中的資料在流序号中的位置(見下例).Ack是在這條連接配接上信源機希望下一個接收的位元組的流序号 (sequencenumber).Window是在這條連接配接上信源機接收緩沖區的位元組大小.Urg表明封包内是`緊急(urgent)'資料. Options是tcp可選報頭,用尖括号括起(例如,).

Src,dst和flags肯定存在.其他域依據封包的tcp報頭内容,隻輸出有必要的部分.

下面是從主機rtsgrlogin到主機csam的開始部分.

rtsg.1023>csam.login:S768512:768512(0)win4096

csam.login>rtsg.1023:S947648:947648(0)ack768513win4096

rtsg.1023>csam.login:.ack1win4096

rtsg.1023>csam.login:P1:2(1)ack1win4096

csam.login>rtsg.1023:.ack2win4096

rtsg.1023>csam.login:P2:21(19)ack1win4096

csam.login>rtsg.1023:P1:2(1)ack21win4077

csam.login>rtsg.1023:P2:3(1)ack21win4077urg1

csam.login>rtsg.1023:P3:4(1)ack21win4077urg1

第一行是說從rtsg的tcp端口1023向csam的login端口發送封包.S标志表明設定了SYN标志.封包的流序号是768512,沒有資料.(這個寫成`first:last(nbytes)',意思是`從流序号first到last,不包括last,有nbytes位元組的使用者資料'.)此時沒有捎帶确認(piggy-backedack),有效的接收視窗是4096位元組,有一個最大段大小(max-segment-size)的選項,請求設定 mss為1024位元組.

Csam用類似的形式應答,隻是增加了一個對rtsgSYN的捎帶确認.然後Rtsg确認csam的SYN.`.'意味着沒有設定标志.這個封包不包含資料,是以也就沒有資料的流序号.注意這個确認流序号是一個小整數(1).當tcpdump第一次發現一個tcp會話時,它顯示封包攜帶的流序号.在随後收到的封包裡,它顯示目前封包和最初那個封包的流序号之差.這意味着從第一個封包開始,以後的流序号可以了解成資料流中的相對位移asrelativebytepositionsintheconversation'sdatastream (withthefirstdatabyteeachdirectionbeing`1').`-S'選項能夠改變這個特性,直接顯示原始的流序号.

在第六行,rtsg傳給csam19個位元組的資料(位元組2到20).封包中設定了PUSH标志.第七行csam表明它收到了rtsg的資料,位元組序号是 21,但不包括第21個位元組.顯然大多數資料在socket的緩沖區内,因為csam的接收視窗收到的資料小于19個位元組.同時csam向rtsg發送了一個位元組的資料.第八和第九行顯示csam發送了兩個位元組的緊急資料到rtsg.

如果捕捉區設定的過小,以至于tcpdump不能捕捉到完整的TCP報頭,tcpdump會盡可能的翻譯已捕獲的部分,然後顯示``[|tcp]'',表明無法翻譯其餘部分.如果報頭包含一個僞造的選項 (onewithalengththat'seithertoosmallorbeyondtheendoftheheader),tcpdump顯示 ``[badopt]''并且不再翻譯其他選項部分(因為它不可能判斷出從哪兒開始).如果報頭長度表明存在選項,但是IP資料報長度不夠,不可能真的儲存選項,tcpdump就顯示``[badhdrlength]''.

UDP封包

UDP格式就象這個rwho封包顯示的:

actinide.who>broadcast.who:udp84

就是說把一個udp資料報從主機actinide的who端口發送到broadcast,Internet廣播位址的who端口.封包包含84位元組的使用者資料.

某些UDP服務能夠識别出來(從源目端口号上),因而顯示出更高層的協定資訊.特别是域名服務請求(RFC-1034/1035)和NFS的RPC調用(RFC-1050).

UDP域名服務請求(NameServerRequests)

(注意:以下的描述中假設你熟悉RFC-1035說明的域名服務協定.如果你不熟悉這個協定,下面的内容就象是天書.)

域名服務請求的格式是

src>dst:idop?flagsqtypeqclassname(len)

h2opolo.1538>helios.domain:3+A?ucbvax.berkeley.edu.(37)

主機h2opolo通路helios上的域名服務,詢問和ucbvax.berkeley.edu.關聯的位址記錄(qtype=A).查詢号是`3'.` +'表明設定了遞歸請求标志.查詢長度是37位元組,不包括UDP和IP頭.查詢操作是普通的Query操作,是以op域可以忽略.如果op設定成其他什麼東西,它應該顯示在`3'和`+'之間.類似的,qclass是普通的C_IN類型,也被忽略了.其他類型的qclass應該在`A'後面顯示.

Tcpdump 會檢查一些不規則情況,相應的結果作為補充域放在方括号内:如果某個查詢包含回答,名字服務或管理機構部分,就把ancount,nscount,或 arcount顯示成`[na]',`[nn]'或`[nau]',這裡的n代表相應的數量.如果在第二和第三位元組中,任何一個回答位(AA,RA或 rcode)或任何一個`必須為零'的位被置位,就顯示`[b2&3=x]',這裡的x是報頭第二和第三位元組的16進制數.

UDP名字服務回答

名字服務回答的格式是

src>dst:idoprcodeflagsa/n/autypeclassdata(len)

helios.domain>h2opolo.1538:33/3/7A128.32.137.3(273)

helios.domain>h2opolo.1537:2NXDomain*0/1/0(97)

第一個例子裡,helios回答了h2opolo發出的辨別為3的詢問,一共是3個回答記錄,3個名字服務記錄和7個管理結構記錄.第一個回答紀錄的類型是 A(位址),資料是internet位址128.32.137.3.回答的全長為273位元組,不包括UDP和IP報頭.作為A記錄的class (C_IN)可以忽略op(詢問)和rcode(NoError).

在第二個例子裡,helios對辨別為2的詢問作出域名不存在(NXDomain)的回答,沒有回答記錄,一個名字服務記錄,而且沒有管理結構.

`*'表明設定了權威回答(authoritativeanswer).由于沒有回答記錄,這裡就不顯示type,class和data.

其他标志字元可以顯示為`-'(沒有設定遞歸有效(RA))和`|'(設定消息截短(TC)).如果`問題'部分沒有有效的内容,就顯示`[nq]'.

注意名字服務的詢問和回答一般說來比較大,68位元組的snaplen可能無法捕捉到足夠的封包内容.如果你的确在研究名字服務的情況,可以使用-s選項增大捕捉緩沖區.`-s128'應該效果不錯了.

NFS請求和響應

SunNFS(網絡檔案系統)的請求和響應顯示格式是:

src.xid>dst.nfs:lenopargs

src.nfs>dst.xid:replystatlenopresults

sushi.6709>wrl.nfs:112readlinkfh21,24/10.73165

wrl.nfs>sushi.6709:replyok40readlink"../var"

sushi.201b>wrl.nfs:

144lookupfh9,74/4096.6878"xcolors"

wrl.nfs>sushi.201b:

replyok128lookupfh9,74/4134.3150

在第一行,主機sushi向wrl發送号碼為6709的交易會話(注意源主機後面的數字是交易号,不是端口).這項請求長112位元組,不包括UDP和IP報頭.在檔案句柄(fh)21,24/10.731657119上執行readlink(讀取符号連接配接)操作.(如果運氣不錯,就象這種情況,檔案句柄可以依次翻譯成主次裝置号,i節點号,和事件号(generationnumber).)Wrl回答`ok'和連接配接的内容.

在第三行,sushi請求wrl在目錄檔案9,74/4096.6878中查找`xcolors'.注意資料的列印格式取決于操作類型.格式應該是可以自我說明的.

給出-v(verbose)選項可以顯示附加資訊.例如:

sushi.1372a>wrl.nfs:

148readfh21,11/[email protected]

wrl.nfs>sushi.1372a:

replyok1472readREG100664ids417/0sz29388

(- v同時使它顯示IP報頭的TTL,ID,和分片域,在這個例子裡把它們省略了.)在第一行,sushi請求wrl從檔案21,11/12.195的偏移位置24576開始,讀取8192位元組.Wrl回答`ok';第二行顯示的封包是應答的第一個分片,是以隻有1472位元組(其餘資料在後續的分片中傳過來, 但由于這些分片裡沒有NFS甚至UDP報頭,是以根據所使用的過濾器表達式,有可能不顯示).-v選項還會顯示一些檔案屬性(它們作為檔案資料的附帶部分傳回來):檔案類型(普通檔案``REG''),存取模式(八進制數),uid和gid,以及檔案大小.

如果再給一個-v選項(-vv),還能顯示更多的細節.

注意NFS請求的資料量非常大,除非增加snaplen,否則很多細節無法顯示.試一試`-s192'選項.

NFS應答封包沒有明确标明RPC操作.是以tcpdump保留有``近來的''請求記錄,根據交易号比對應答封包.如果應答封包沒有相應的請求封包,它就無法分析.

KIPAppletalk(UDP上的DDP)

AppletalkDDP封包封裝在UDP資料報中,解包後按DDP封包轉儲(也就是說,忽略所有的UDP報頭資訊).檔案/etc/atalk.names用來把appletalk網絡和節點号翻譯成名字.這個檔案的行格式是

numbername

1.254ether

16.1icsd-net

1.254.110ace

前兩行給出了appletalk的網絡名稱.第三行給出某個主機的名字(主機和網絡依據第三組數字區分-網絡号一定是兩組數字,主機号一定是三組數字.)号碼和名字用空白符(空格或tab)隔開./etc/atalk.names檔案可以包含空行或注釋行(以`#'開始的行).

Appletalk位址按這個格式顯示

net.host.port

144.1.209.2>icsd-net.112.220

office.2>icsd-net.112.220

jssmag.149.235>icsd-net.2

(如果不存在/etc/atalk.names,或者裡面缺少有效項目,就以數字形式顯示位址.)第一個例子裡,網絡144.1的209節點的NBP(DDP 端口2)向網絡icsd的112節點的220端口發送資料.第二行和上面一樣,隻是知道了源節點的全稱(`office').第三行是從網絡jssmag 的149節點的235端口向icsd-net的NBP端口廣播(注意廣播位址(255)隐含在無主機号的網絡名字中-是以在 /etc/atalk.names中區分節點名和網絡名是個好主意).

Tcpdump可以翻譯NBP(名字聯結協定)和ATP(Appletalk互動協定)的封包内容.其他協定隻轉儲協定名稱(或号碼,如果還沒給這個協定注冊名稱)和封包大小.

NBP封包的輸出格式就象下面的例子:

icsd-net.112.220>jssmag.2:nbp-lkup190:"=:[email protected]*"

jssmag.209.2>icsd-net.112.220:nbp-reply190:"RM1140:[email protected]*"250

techpit.2>icsd-net.112.220:nbp-reply190:"techpit:[email protected]*"186

第一行是網絡icsd的112主機在網絡jssmag上的廣播,對名字laserwriter做名字查詢請求.名字查詢請求的nbp辨別号是190.第二行顯示的是對這個請求的回答(注意它們有同樣的辨別号),主機jssmag.209表示在它的250端口注冊了一個laserwriter的資源,名字是 "RM1140".第三行是這個請求的其他回答,主機techpit的186端口有laserwriter注冊的"techpit".

ATP封包格式如下例所示:

jssmag.209.165>helios.132:atp-req12266<0-7>0xae030001

helios.132>jssmag.209.165:atp-resp12266:0(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:1(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:2(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:4(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:6(512)0xae040000

helios.132>jssmag.209.165:atp-resp*12266:7(512)0xae040000

jssmag.209.165>helios.132:atp-req12266<3,5>0xae030001

helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000

helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000

jssmag.209.165>helios.132:atp-rel12266<0-7>0xae030001

jssmag.209.133>helios.132:atp-req*12267<0-7>0xae030002

Jssmag.209向主機helios發起12266号交易,請求8個封包(`<0-7>').行尾的十六進制數是請求中`userdata'域的值.

繼續閱讀