1. 程式人生 > >tcpdump使用詳解及資料包結果分析

tcpdump使用詳解及資料包結果分析

-轉自https://blog.csdn.net/liang_baikai/article/details/79626180
選出其中我需要的:
使用詳解
(1)監視指定主機和埠的資料包
如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令
tcpdump tcp port 23 and host 210.27.48.1
(2)截獲主機hostname傳送的所有資料
tcpdump -i eth0 src host hostname
(3)監視所有送到主機hostname的資料包
tcpdump -i eth0 dst host hostname
(4)監視指定主機的資料包
列印所有進入或離開sundown的資料包.tcpdump host sundown
(5)監視指定協議的資料包
列印TCP會話中的的開始和結束資料包, 並且資料包的源或目的不是本地網路上的主機.(nt: localnet, 實際使用時要真正替換成本地網路的名字))
tcpdump ‘tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet’
列印所有源或目的埠是80, 網路層協議為IPv4, 並且含有資料,而不是SYN,FIN以及ACK-only等不含資料的資料包.(ipv6的版本的表示式可做練習)
tcpdump ‘tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)’

結果分析:
(1)UDP 資料包
UDP 資料包的顯示格式,可通過rwho這個具體應用所產生的資料包來說明:

actinide.who > broadcast.who: udp 84
其含義為:actinide主機上的埠who向broadcast主機上的埠who傳送了一個udp資料包(nt: actinide和broadcast都是指Internet地址).
這個資料包承載的使用者資料為84個位元組.

一些UDP服務可從資料包的源或目的埠來識別,也可從所顯示的更高層協議資訊來識別. 比如, Domain Name service requests(DNS 請求,
(2)CP 資料包
(注意:以下將會假定你對 RFC-793所描述的TCP熟悉. 如果不熟, 以下描述以及tcpdump程式可能對你幫助不大.(nt:警告可忽略,
只需繼續看, 不熟悉的地方可回頭再看.).

通常tcpdump對tcp資料包的顯示格式如下:

src > dst: flags data-seqno ack window urgent options
src 和 dst 是源和目的IP地址以及相應的埠.
flags 標誌由S(SYN), F(FIN), P(PUSH, R(RST),W(ECN CWT(nt | rep:未知, 需補充))或者 E(ECN-Echo(nt | rep:未知, 需補充))組成,
單獨一個’.’表示沒有flags標識.
資料段順序號(Data-seqno)描述了此包中資料所對應序列號空間中的一個位置(nt:整個資料被分段,每段有一個順序號,所有的順序號構成一個序列號空間)
(可參考以下例子). Ack描述的是同一個連線,同一個方向,下一個本端應該接收的(對方應該傳送的)資料片段的順序號.
Window是本端可用的資料接收緩衝區的大小(也是對方傳送資料時需根據這個大小來組織資料).
Urg(urgent) 表示資料包中有緊急的資料. options 描述了tcp的一些選項, 這些選項都用尖括號來表示(如 ).

src, dst 和 flags 這三個域總是會被顯示.
其他域的顯示與否依賴於tcp協議頭裡的資訊.

這是一個從trsg到csam的一個rlogin應用登入的開始階段.

rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
rtsg.1023 > csam.login: . ack 1 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主機的tcp埠login上
(nt:udp協議的埠和tcp協議的埠是分別的兩個空間,雖然取值範圍一致).
S表示設定了SYN標誌. 包的順序號是768512, 並且沒有包含資料.
(表示格式為:’first:last(nbytes)’,其含義是’此包中資料的順序號從first開始直到last結束,不包括last.並且總共包含nbytes的使用者資料’.) 沒有捎帶應答(nt:從下文來看,第二行才是有捎帶應答的資料包), 可用的接受視窗的大小為4096bytes, 並且請求端(rtsg)的最大可接受的資料段大小是1024位元組(nt:這個資訊作為請求發向應答端csam, 以便雙方進一步的協商).

Csam 向rtsg 回覆了基本相同的SYN資料包, 其區別只是多了一個
‘piggy-backed ack’(nt:捎帶回的ack應答, 針對rtsg的SYN資料包).

rtsg 同樣針對csam的SYN資料包回覆了一ACK資料包作為應答.
‘.’的含義就是此包中沒有標誌被設定.
由於此應答包中不含有資料, 所以包中也沒有資料段序列號.
提醒! 此ACK資料包的順序號只是一個小整數1. 有如下解釋:tcpdump對於一個tcp連線上的會話, 只打印會話兩端的初始資料包的序列號,
其後相應資料包只打印出與初始包序列號的差異.
即初始序列號之後的序列號,可被看作此會話上當前所傳資料片段在整個
要傳輸的資料中的’相對位元組’位置
(nt:雙方的第一個位置都是1,即’相對位元組’的開始編號).
‘-S’將覆蓋這個功能,使資料包的原始順序號被打印出來.

第六行的含義為:rtsg 向 csam傳送了19位元組的資料(位元組的編號為2到20,傳送方向為rtsg到csam). 包中設定了PUSH標誌. 在第7行,
csam 喊到, 她已經從rtsg中收到了21以下的位元組, 但不包括21編號的位元組. 這些位元組存放在csam的socket的接收緩衝中, 相應地,
csam的接收緩衝視窗大小會減少19位元組(nt:可以從第5行和第7行win屬性值的變化看出來). csam在第7行這個包中也向rtsg傳送了一個
位元組. 在第8行和第9行, csam 繼續向rtsg 分別傳送了兩個只包含一個位元組的資料包, 並且這個資料包帶PUSH標誌.

如果所抓到的tcp包(nt:即這裡的snapshot)太小了,以至tcpdump無法完整得到其頭部資料, 這時, tcpdump會盡量解析這個不完整的頭,
並把剩下不能解析的部分顯示為’[|tcp]’. 如果頭部含有虛假的屬性資訊(比如其長度屬性其實比頭部實際長度長或短), tcpdump會為該頭部
顯示’[bad opt]’. 如果頭部的長度告訴我們某些選項(nt | rt:從下文來看, 指tcp包的頭部中針對ip包的一些選項, 回頭再翻)會在此包中,
而真正的IP(資料包的長度又不夠容納這些選項, tcpdump會顯示’[bad hdr length]’.

抓取帶有特殊標誌的的TCP包(如SYN-ACK標誌, URG-ACK標誌等).

在TCP的頭部中, 有8位元(bit)用作控制位區域, 其取值為:
CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
(nt | rt:從表達方式上可推斷:這8個位是用或的方式來組合的, 可回頭再翻)

現假設我們想要監控建立一個TCP連線整個過程中所產生的資料包. 可回憶如下:TCP使用3次握手協議來建立一個新的連線; 其與此三次握手
連線順序對應,並帶有相應TCP控制標誌的資料包如下:

  1. 連線發起方(nt:Caller)傳送SYN標誌的資料包
  2. 接收方(nt:Recipient)用帶有SYN和ACK標誌的資料包進行迴應
  3. 發起方收到接收方迴應後再發送帶有ACK標誌的資料包進行迴應