使用tcpdump進行網路包分析

來源:互聯網
上載者:User

tcpdump介紹

tcpdump 是一個運行在命令列下的抓包工具。它允許使用者攔截和顯示發送或收到過網路連接到該電腦的TCP/IP和其他資料包。tcpdump 適用於

大多數的類Unix系統作業系統(如linux,BSD等)。類Unix系統的 tcpdump 需要使用libpcap這個捕捉資料的庫就像 windows下的WinPcap。

在學習tcpdump前最好對基本網路的網路知識有一定的認識。

tcpdump命令格式及常用參數

Tcpdump的大概形式如下:

例:tcpdump –i eth0 ’port 1111‘ -X -c 3

tcpdump採用命令列方式,它的命令格式為:

  tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 檔案名稱 ]

          [ -i 網路介面 ] [ -r 檔案名稱] [ -s snaplen ]

[ -T 類型 ] [ -w 檔案名稱 ] [運算式 ]

tcpdump的選項介紹

   -a    將網路地址和廣播位址轉變成名字;

   -d    將匹配資訊包的代碼以人們能夠理解的彙編格式給出;

   -dd    將匹配資訊包的代碼以c語言程式段的格式給出;

   -ddd    將匹配資訊包的代碼以十進位的形式給出;

   -e    在輸出行列印出資料連結層的頭部資訊;

   -f    將外部的Internet地址以數位形式列印出來;

   -l    使標準輸出變為緩衝行形式;

   -n    不把網路位址轉譯成名字;

   -t    在輸出的每一行不列印時間戳記;

   -v    輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務類型的資訊;

   -vv    輸出詳細的報文資訊;

   -c    在收到指定的包的數目後,tcpdump就會停止;

   -F    從指定的檔案中讀取運算式,忽略其它的運算式;

   -i    指定監聽的網路介面;

   -r    從指定的檔案中讀取包(這些包一般通過-w選項產生);

   -w    直接將包寫入檔案中,並不分析和列印出來;

   -T    將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠端程序呼叫)和snmp(簡易網路管理通訊協定;)

如鍵入命令: tcpdump –i eth0 ‘port 1111’ -X -c 3

 

-i 是interface的含義,是指我們有義務告訴tcpdump希望他去監聽哪一個網卡,

-X告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進位和ASCII的形式顯示),這在進行協議分析時是絕對的利器。

port 1111我們只關心源連接埠或目的連接埠是1111的資料包.

-c 是Count的含義,這設定了我們希望tcpdump幫我們抓幾個包。

其中還有另外一個比較重要的參數– l 使得輸出變為行緩衝

-l選項的作用就是將tcpdump的輸出變為“行緩衝”方式,這樣可以確保tcpdump遇到的內容一旦是分行符號即將緩衝的內容輸出到標準輸出,以便於利用管道

或重新導向方式來進行後續處理。

Linux/UNIX的標準I/O提供了全緩衝、行緩衝和無緩衝三種緩衝方式。標準錯誤是不帶緩衝的,終端裝置常為行緩衝,而其他情況預設都是全緩衝的。

例如我們只想提取包的每一行的第一個域(時間域),這種情況下我們就需要-l將預設的全緩衝變為行緩衝了。

 

參數–w -r

-w 直接將包寫入檔案中(即原始包,如果使用 重新導向 > 則只是儲存顯示的結果,而不是原始檔案),即所謂的“流量儲存”---就是把抓到的網路包能儲存到磁碟上,

儲存下來,為後續使用。參數-r 達到“流量回放”---就是把曆史上的某一時間段的流量,重新類比回放出來,用於流量分析。

 

通過-w選項將流量都儲存在cp.pcap(二進位格式)檔案中了.可以通過 –r 讀取raw packets檔案 cp.pcap.

如:sudo tcpdump i- eth0 'port 1111' -c 3 -r cp.pcap 即可進行流量回放。

tcpdump的輸出結果介紹

鍵入命令:sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111' 所截獲包內容如下:


第一行:“tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode”

提示使用選項-v和-vv,可以看到更全的輸出內容。

第二行“listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes”

我們監聽的是通過eth0這個NIC裝置的網路包,且它的鏈路層是基於乙太網路的,要抓的包大小限制是65535位元組。包大小限制值可以通過-s選項來設定。

第三行”12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),”

12:40:33.569037 分別對應著這個包被抓到的“時”、“分”、“秒”、“微妙”。

00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址00:19:e0:b5:10:94發送到MAC地址為00:1a:a0:31:39:d4的主機,ethertype IPv4 (0x0800)表示

Ethernet幀的協議類型為ipv4(即代碼為0x0800)。

第四行”length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808,

length 66表示以太幀長度為66。 210.45.123.249.27236表示這個包的源IP為210.45.123.249,源連接埠為27236,’>’表示資料包的傳輸方向, 172.16.0.11.1111,

表示這個資料包的目的端ip為172.16.0.11,目標連接埠為1111,1111連接埠是我的一個web伺服器監聽連接埠。Flags是[S],表明是syn建立串連包(即三向交握的第一次

握手),seq1624463808 序號為1624463808,這個其實就是TCP三向交握的第一次握手:client(210.45.123.249)發送syn請求建立串連包。

第五行” win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0”

win 8192 表示視窗大小為8192位元組。options[mss 1460,nop,wscale 2,nop,nop,sackOK]為tcp首部可選欄位mss 1460表示mss是發送端(用戶端)通告的最大

報文段長度,發送端將不接收超過這個長度的TCP報文段(這個值和MTU有一定關係)。nop是一個空操作選項, wscale指出發送端使用的視窗擴大因子為2, sackOK

表示發送端支援並同意使用SACK選。

下面幾行分別是IP,TCP首部 ,這裡不再敷述。

tcpdump過濾語句介紹

可以給tcpdump傳送“過濾運算式”來起到網路包過濾的作用,而且可以支援傳入單個或多個過濾運算式。

可以通過命令 man pcap-filter 來參考過濾運算式的協助文檔

過濾運算式大體可以分成三種過濾條件,“類型”、“方向”和“協議”,這三種條件的搭配組合就構成了我們的過濾運算式。

關於類型的關鍵字,主要包括host,net,port, 例如 host 210.45.114.211,指定主機 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一個網路地址,port 21 指明

連接埠號碼是21。如果沒有指定類型,預設的類型是host.

關於傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,

這些關鍵字指明了傳輸的方向。舉例說明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的網路地址是210.11.0.0 。如果沒有指明

方向關鍵字,則預設是srcor dst關鍵字。

關於協議的關鍵字,主要包括 ether,ip,ip6,arp,rarp,tcp,udp等類型。這幾個關鍵字指明了監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的

資訊包。

如我們只想抓tcp的包命令為: sudo tcpdump -i eth0 -nn -c1 'tcp'

 

除了這三種類型的關鍵字之外,其他重要的關鍵字如下:

gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算是'or' ,'||';

可以利用這些關鍵字進行組合,從而組合為比較強大的過濾條件。下面舉例說明

(1)只想查目標機器連接埠是21或80的網路包,其他連接埠的我不關註:

  sudo tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'

(2) 想要截獲主機172.16.0.11 和主機210.45.123.249或 210.45.123.248的通訊,使用命令(注意括弧的使用):

  sudo tcpdump -i eth0 -c 3 'host 172.16.0.11 and (210.45.123.249 or210.45.123.248)'

(3)想擷取使用ftp連接埠和ftp資料連接埠的網路包

sudo tcpdump 'port ftp or ftp-data'

這裡 ftp、ftp-data到底對應哪個連接埠? linux系統下 /etc/services這個檔案裡面,就儲存著所有知名服務和傳輸層連接埠的對應關係。如果你直接把/etc/services裡

的ftp對應的連接埠值從21改為了3333,那麼tcpdump就會去抓連接埠含有3333的網路包了。

(4) 如果想要擷取主機172.16.0.11除了和主機210.45.123.249之外所有主機通訊的ip包,使用命令:

sudo tcpdump ip ‘host 172.16.0.11 and ! 210.45.123.249’

(5) 抓172.16.0.11的80連接埠和110和25以外的其他連接埠的包

sudo tcpdump -i eth0 ‘host 172.16.0.11 and! port 80 and ! port 25 and ! port 110’

下面介紹一些tcpdump中過濾語句比較進階的用法

想擷取172.16.10.11和google.com之間建立TCP三向交握中帶有SYN標記位的網路包.

命令為:sudo tcpdump -i eth0 'host 172.16.0.11 andhost google.com and tcp[tcpflags]&tcp-syn!=0' -c 3 -nn

上面的命令是不是看著有點暈的感覺,下面詳細介相關知識。

其實我們理解這種文法: proto [ expr : size] ,就不難理解上面的語句了。

下面詳細介紹proto [ expr : size]

Proto即protocol的縮寫,它表示這裡要指定的是某種協議名稱,如ip,tcp,udp等。總之可以指定的協議有十多種,如鏈路層協議 ether,fddi,tr,wlan,ppp,slip,link,

網路層協議ip,ip6,arp,rarp,icmp傳輸層協議tcp,udp等。

expr用來指定資料報位元組單位的位移量,該位移量相對於指定的協議層,預設的起始位置是0;而size表示從位移量的位置開始提取多少個位元組,可以設定為

1、2、4,預設為1位元組。如果只設定了expr,而沒有設定size,則預設提取1個位元組。比如ip[2:2],就表示提取出第3、4個位元組;而ip[0]則表示提取ip協議頭的

第一個位元組。在我們提取了特定內容之後,我們就需要設定我們的過濾條件了,我們可用的“比較操作符”包括:>,<,>=,<=,=,!=,總共有6個。

舉例:想截取每個TCP會話的起始和結束報文(SYN 和 FIN 報文), 而且會話方中有一個遠程主機.

sudo tcpdump 'tcp[13] & 3 != 0 and not(src and dst net 172.16.0.0)' -nn

如果熟悉tcp首部報文格式可以比較容易理解這句話,因為tcp便宜13位元組的位置為2位保留位和6位標誌位(URG,ACK,PSH,RST,SYN,FIN), 所以與3相與就可以得出

SYN,FIN其中是否一個置位1.

從上面可以看到在寫過濾運算式時,需要我們對協議格式比較理解才能把運算式寫對。這個比較有難度的..。為了讓tcpdump工具更人性化一些,有一些常用的位移量,

可以通過一些名稱來代替,比如icmptype表示ICMP協議的類型域、icmpcode表示ICMP的code域,tcpflags 則表示TCP協議的標誌欄位域。

更進一步的,對於ICMP的類型域,可以用這些名稱具體指代:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect,icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob,icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq,icmp-maskreply。

而對於TCP協議的標誌欄位域,則可以細分為tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg。

對於tcpdump 只能通過經常操作來熟練這些語句了。也可以把網路包用tcpdump截獲儲存到指定檔案,然後用wireshark等可視化軟體分析網路包。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.