tcpdump介紹

tcpdump介紹

tcpdump 是一款開源的網絡數據截取分析工具,具有強大的功能和靈活的截取策略,用在網絡的分析、維護、統計、檢測等方面,例如定位網絡瓶頸、統計網絡流量使用情況等。它支持針對網絡層、協議、主機、網絡或端口的過濾,正則表達式的靈活應用能幫你準確獲取有用信息。
tcpdump 具備開源軟件的優勢,接口公開,具有較強的可擴展性。運行此命令必須有root權限,它通過將網絡接口設置爲混雜模式,繞過標準TCP/IP堆棧,進行工 作。出於安全等問題考慮,FreeBSD裏通過內核取消對僞設備bpfilter的支持,來屏蔽tcpdump之類的網絡分析工具,也可使用網橋、交換機 等將不信任網絡隔開,但不能解決內網通信安全問題。在linux下可採用軟件包或編譯源代碼的方式安裝。
tcpdump官方網站:http://www.tcpdump.org/

運行效果

kongove@ubuntu:~$ sudo tcpdump  -i eth0 host ubuntu.local
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
09:39:10.448284 IP ubuntu.local.2425 > 255.255.255.255.2425: UDP, length 35
09:39:15.565249 IP ubuntu.local.2425 > 255.255.255.255.2425: UDP, length 29

基本使用

tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ]
[ -T type ] [ -w file ] [ -W filecount ][ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ] [ expression ]

通過對 tcpdump 選項、參數、表達式的組合應用,從大流量的網絡數據當中,過濾出真正有用的信息,從而縮小分析範圍。

tcpdump選項

選項 含義
-A 以ASCII格式打印出所有分組,並將鏈路層的頭最小化
-d 將匹配信息包的代碼以人們能夠理解的彙編格式給出
-D 打印出系統中所有可以用tcpdump截包的網絡接口
-ddd 將匹配信息包的代碼以十進制的形式輸出
-e 在輸出行打印出數據鏈路層的頭部信息
-f 將外部的Internet地址以數字的形式打印出來
-l 使標準輸出變爲緩衝行形式
-L 列出網絡接口的已知數據鏈路
-n 不把網絡地址轉換成名字
-N 不輸出主機名中的域名部分,如“kongove.ubuntu.cn”只輸出“kongove”
-O 不運行分組分組匹配(packet-matching)代碼優化程序
-p 不將網絡接口設置成混雜模式
-q 快速輸出,只輸出較少的協議信息
-S 將tcp的序列號以絕對值形式輸出,而不是相對值
-t 在輸出的每一行不打印時間戳
-u 輸出未解碼的NFS句柄
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息
-vv 輸出詳細的報文信息
-c count 指定監聽數據包數量,當收到指定的包的數目後,tcpdump就會停止
-C file_size 限定數據包寫入文件大小
-F file 從指定的文件中讀取表達式,忽略其它的表達式
-i interface 指定監聽網絡接口
-m module 打開指定的SMI MIB組件
-M secret 如果tcp報文中存在TCP-MD5選項,則需要用secret作爲共享的驗證碼用於驗證TCP-MD5選選項摘要(詳見RFC 2385)
-r file 從指定的文件中讀取包(這些包一般通過-w選項產生)
-s snaplen 從每個分組中讀取最開始的snaplen個字節,而不是默認的68個字節
-T type 將截取的數據包直接解釋爲指定類型的報文,常見類型有rpc(遠程過程調用)和snmp(簡單網絡管理協議),還包括aodv、cnfp、rpc、rtp、rtcp、snmp、tftp、vat、wb等
-w file 指定將監聽到的數據包寫入文件,不分析和打印數據包
-W filecount 限定能寫入文件數據包的數量
-E spi@ipaddr algo:secret,... 用spi@ipaddr algo:secret解密那些以addr作爲地址,並且包含了安全參數索引值spi的IPsec ESP分組
expression 綜合表達式

tcpdump的表達式介紹

tcpdump利用正則表達式作爲過濾報文的條件,如果數據包滿足表達式的條件,則會被捕獲。如果沒有給出任何條件,則網絡上所有的數據包將會被截獲。表達式中常用關鍵字如下:

  • 1) 指定參數類型的關鍵字,主要包括host,net,port等,如果沒有指定類型,缺省的類型是host; 例如:#tcpdump host 222.24.20.86 截獲ip爲222.24.20.86的主機收發的所有數據包
  • 2) 指定數據報文傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src,缺省爲src or dst; 例如:#tcpdump src net 222.24.20.1 截取源網絡地址爲 222.24.20.1 的所有數據包
  • 3) 指定協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型,默認監聽所有協議的數據包; 例如:#tucpdump arp 截獲所有arp協議的數據包
  • 4) 其他重要的關鍵字還有,gateway,broadcast,less,greater,三種邏輯運算(取非運算是 'not ','! '; 與運算是 'and ','&& ';或運算 是'or ','|| ')等。這些關鍵字的巧妙組合,能靈活構造過濾條件,從而滿足用戶需要。 例如:#tcpdump host ubuntu and src port \(80 or 8080\) 截取主機ubuntu上源端口爲80或8080的所有數據包。

 

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

  • type

    類型修飾子指出標識名稱或標識數字代表什麼類型的東西. 可以使用的類型有host, net 和 port。例如, `host foo', `net 128.3', `port 20'. 如果不指定類型修飾子, 就使用缺省的 host。

  • dir

    方 向修飾子指出相對於標識的傳輸方向(數據是傳入還是傳出標識)。 可以使用的方向有 src, dst, src or dst 和 src and dst。例如, `src foo', `dst net 128.3', `src or dst port ftp-data'。如果不指定方向修飾子, 就使用缺省的src or dst。 對於`null'鏈路層 (就是說象slip之類的點到點協議), 用inbound和outbound修飾子指定所需的傳輸方向。

  • proto

    協議修 飾子要求匹配指定的協議。可以使用的協議有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp。例如, `ether srcfoo', `arp net 128.3', `tcp port 21'。 如果不指定協議修飾子, 就使用所有符合類型的協議. 例如, `src foo' 指 `(ip 或 arp 或 rarp) src foo'(注意後者不符合語法), `net bar'指`(ip 或 arp 或 rarp) net bar', `port 53'指 `(tcp 或 udp) port 53'。(`fddi'實際上是 `ether'的別名; 分析器把它們視爲 ``用在指定網絡接口上的數據鏈路層.'' FDDI報頭包含類似於以太協議的源目地址, 而且通常包含類似於以太協議的報文類型, 因此你可以過濾FDDI域, 就象分析以太協議一樣. FDDI報頭也包含其他域, 但是你不能在過濾器表達式裏顯式描述。)

作爲上述的補充, 有一些特殊的`原語'關鍵字, 它們不同於上面的模式: gateway, broadcast, less, greater和數學表達式. 這些在後面有敘述。 更復雜的過濾器表達式 可以通過and, or和not連接原語來組建。 例如,`host foo and notport ftp and not port ftp-data'。爲了少敲點鍵, 可以忽略相同的修飾子。 例如, `tcp dst port ftp or ftp-data or domain'實際上就是`tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'。

允許的 原語 有:

  • dst host host

    如果報文中IP的目的地址域是host, 則邏輯爲真. host既可以是地址, 也可以是主機名.

  • src host host

    如果報文中IP的源地址域是host, 則邏輯爲真.

  • host host

    如果報文中IP的源地址域或者目的地址域是host, 則邏輯爲真. 上面所有的host表達式都可以加上ip, arp, 或rarp關鍵字做前綴, 就象:ip host host 它等價於: ether proto \ip and host host。

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

  • ether dst ehost

    如果報文的以太目的地址是ehost, 則邏輯爲真。Ehost既可以是名字(/etc/ethers裏有),也可以是數字(有關數字格式另見 ethers(3N) )。

  • ether src ehost

    如果報文的以太源地址是ehost, 則邏輯爲真。

  • ether host ehost

    如果報文的以太源地址或以太目的地址是ehost, 則邏輯爲真。

  • gateway host

    如 果報文把host當做網關, 則邏輯爲真。也就是說,報文的以太源或目的地址是host, 但是IP的源目地址都不是host。 host必須是個主機名, 而且必須存在/etc/hosts和/etc/ethers中. (一個等價的表達式是ether host ehost and not host host,對於 host/ehost, 它既可以是名字, 也可以是數字。)

  • dst net net

    如果報文的IP目的地址屬於網絡號net,則邏輯爲真.net既可以是名字(存在/etc/networks中),也可以是網絡號.(詳見networks(4))。

  • src net net

    如果報文的IP源地址屬於網絡號net,則邏輯爲真。

  • net net

    如果報文的IP源地址或目的地址屬於網絡號net,則邏輯爲真.

  • net net mask mask

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

  • net net/len

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

  • dst port port

    如 果報文是ip/tcp或ip/udp,並且目的端口是port,則邏輯爲真.port是一個數字,也可以是/etc/services中說明過的名字(參 看tcp(4P)和udp(4P)).如果使用名字,則檢查端口號和協議.如果使用數字,或者有二義的名字,則只檢查端口號(例如,dstport513 將顯示tcp/login的數據和udp/who的數據,而portdomain將顯示tcp/domain和udp/domain的數據)。

  • src port port

    如果報文的源端口號是port,則邏輯爲真。

  • port port

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

  • tcp src port port

    它只匹配源端口是port的TCP報文。

  • less length

    如果報文的長度小於等於length,則邏輯爲真.它等同於:len <= length。

  • greater length

    如果報文的長度大於等於length,則邏輯爲真.它等同於:len >= length。

  • ip proto protocol

    如 果報文是IP數據報(參見ip(4P)),其內容的協議類型是protocol,則邏輯爲真.Protocol可以是數字,也可以是下列名稱中的一 個:icmp,igrp,udp,nd,或tcp.注意這些標識符tcp,udp,和icmp也同樣是關鍵字,所以必須用反斜槓(\)轉義,在C- shell中應該是\\.

  • ether broadcast

    如果報文是以太廣播報文,則邏輯爲真.關鍵字ether是可選的.

  • ip broadcast

    如果報文是IP廣播報文,則邏輯爲真.Tcpdump檢查全0和全1廣播約定,並且檢查本地的子網掩碼.

  • ether multicast

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

  • ip multicast

    如果報文是IP多目傳送報文,則邏輯爲真.

  • ether proto protocol

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

  • decnet src host

    如果DECNET的源地址是host,則邏輯爲真,該主機地址的形式可能是``10.123'',或者是DECNET主機名.[只有配置成運行DECNET的Ultrix系統支持DECNET主機名.]

  • decnet dst host

    如果DECNET的目的地址是host,則邏輯爲真.

  • decnet host host

    如 果DECNET的源地址或目的地址是host,則邏輯爲真.ip, arp, rarp, decnet是:ether proto p的簡寫形式,其中p爲上述協議的一種.lat, moprc, mopdl 是: ether proto p的簡寫形式,其中p爲上述協議的一種.注意tcpdump目前不知道如何分析這些協議.tcp, udp, icmp 是: ip proto p的簡寫形式,其中p爲上述協議的一種.

  • expr relop expr

    如果這個 關係成立,則邏輯爲真,其中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算符,而不是並列放置.

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

not host vs and ace作爲not host vs and host ace的簡寫形式, 不應該和not( host vs or ace )混淆。

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

tcpdump的輸出信息

tcpdump命令四種典型的輸出信息:

數據鏈路層頭信息

使用命令:tcpdump -e host host1
輸出結果:
11:15:12.247009 eth0 < 88:0:0:7:2b:26 0:90:27:58:af:1a ip 60: host2.25258 > host1.telnet 0:0(0) ack 22552 win 7890 (DF)
分析:“11:15:12”是顯示的時間,“247009”是ID號,“eth0 <”表示從網絡接口eth0接受該數據包,“88:0:0:7:2b:26”爲發送數據主機的MAC地址,“ ip”是表明該數據包是IP類型數據包,“60”是數據包的長度,“ host2.25258 > host1.telnet” 表明該數據包是從主機host2的25258端口發往主機host1的TELNET(23)端口。“ack 22552”表明對序列號是22552的包進行響應。“ win 7890”表明發送窗口的大小是7890。

ARP包的TCPDUMP輸出信息

使用命令:tcpdump arp
輸出結果:
22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
分析:“eth0 >”表示從網絡接口eth0發送數據包。

TCP包的輸出信息

輸出信息: src > dst: flags data-seqno ack window urgent options
分析:“src > dst:”表明從源地址到目的地址, flags是TCP包中的標誌信息(S是SYN標誌,F(FIN),P(PUSH),R(RST),"."(沒有標記));data-seqno是數據包 中的數據的順序號,ack是下次期望的順序號,window是接收緩存的窗口大小,urgent表明數據包中是否有緊急指針,Options是選項。

UDP包的輸出信息

輸出信息: host.p1 > linux.p2: udp lenth
分析:從主機host的p1端口發出的一個udp類型數據包到主機linux的p2端口,包的長度是lenth。

功能擴展

tcpdump還可以結合tcpshow、管道、重定向使用,從而擴展其功能。

範例

顯示所有進出sundown的報文:

tcpdump host sundown

顯示helios和主機hot,ace之間的報文傳送:

tcpdump host helios and \( hot or ace \)

顯示ace和除了helios以外的所有主機的IP報文

tcpdump ip host ace and not helios

顯示本地的主機和Berkeley的主機之間的網絡數據

tcpdump net ucb-ether

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

tcpdump 'gateway snup and (port ftp or ftp-data)'

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

tcpdump ip and not net localnet

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

tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet'

顯示經過網關snup中大於576字節的IP數據報

tcpdump 'gateway snup and ip[2:2] > 576'

顯示IP廣播或多目傳送的數據報,這些報文不是通過以太網的廣播或多目傳送形式傳送的

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

顯示所有不是迴響請求/應答的ICMP報文(也就是說,不是ping報文)

tcpdump 'icmp[0] != 8 and icmp[0] != 0'

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

鏈路層報頭 (Link Level Headers)

如果給出'-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;有三個字節的數據和六個字節的壓縮報頭:

O ctcp * A+6 S+49 I+6 3 (6)

ARP/RARP 報文

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

arp who-has csam tell rtsg

arp reply csam is-at CSAM

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

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

arp who-has 128.3.254.6 tell 128.3.254.68

arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

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

RTSG Broadcast 0806 64: arp who-has csam tell rtsg

CSAM RTSG 0806 64: arp reply csam is-at CSAM

這裏第一個報文指出以太網源地址是RTSG,目的地址是以太網廣播地址,類型域爲16進制數0806(類型ETHER_ARP),報文全長64字節.

TCP 報文

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

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

src > dst: flags data-seqno ack window urgent options

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: S 768512:768512(0) win 4096
csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096
rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096
csam.login > rtsg.1023: . ack 2 win 4096
rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096
csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077
csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1
csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

第一行是說從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: udp 84

就是說把一個udp數據報從主機actinide的who端口發送到broadcast,Internet廣播地址的who端口.報文包含84字節的用戶數據.

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

UDP域名服務請求(NameServerRequests)

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

域名服務請求的格式是

src > dst: id op? flags qtype qclass name (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: id op rcode flags a/n/au type class data (len)
helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)
helios.domain > h2opolo.1537: 2 NXDomain* 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: len op args
src.nfs > dst.xid: reply stat len op results
sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165
wrl.nfs > sushi.6709: reply ok 40 readlink "../var"
sushi.201b > wrl.nfs:
144 lookup fh 9,74/4096.6878 "xcolors"
wrl.nfs > sushi.201b:
reply ok 128 lookup fh 9,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:

148 read fh 21,11/12.195 8192 bytes @ 24576

wrl.nfs > sushi.1372a:

reply ok 1472 read REG 100664 ids 417/0 sz 29388

(-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網絡和節點號翻譯成名字.這個文件的行格式是

number name
1.254 ether
16.1 icsd-net
1.254.110 ace

前兩行給出了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-lkup 190: "=:LaserWriter@*"
jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250
techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186

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

ATP報文格式如下例所示:

jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001
helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000
jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001
helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001
jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002

Jssmag.209向主機helios發起12266號交易,請求8個報文(`<0-7>').行尾的十六進制數是請求中`userdata'域的值.
Helios用8個512字節的報文應答.跟在交易號後面的`:digit'給籌

實例:
#tcpdump -i eth0 -X src host 10.1.2.1

實踐經驗

診斷arp風暴

arp***包括arp掃描和arp欺騙兩類。arp風暴屬於前者,它是指由於病毒作用,導致主機向整個網絡內廣播大量arp請求,耗盡帶寬資源,使網絡癱瘓的現象,它往往是arp欺騙的前兆,用於破壞網絡連接、盜取他人網絡賬號。
tcpdump -e arp 可以用來監聽網絡內部廣播的所有數據包,監聽結果中包含數據發送方Mac地址、arp請求方法IP地址等其他信息,如果某個或多個固定MAC地址的主機連 續發送大量請求廣播,並得到迴應,則其有可能爲arp風暴源。可以對此主機進行物理隔離,進行再判斷。

 
kongove@ubuntu:~$ sudo tcpdump -e arp
09:43:48.630521 00:15:c5:6d:0e:80 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: arp who-has 192.168.2.1 tell 192.168.8.237
09:43:48.734420 00:e0:4d:1a:c9:24 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: arp who-has 192.168.44.138 tell 192.168.44.156
09:43:48.842663 00:e0:e4:02:32:59 (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: arp who-has 192.168.21.1 tell 192.168.21.251
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章