咱們的服務器上,通常都沒有窗口界面,這時候要抓包,用tcpdump是最方便的。而分析網絡請求時,wireshark又是至關方便的,這時候咱們就須要把它們兩個一塊兒來使用了。html
tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]
[ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 類型 ] [ -w 文件名 ] [表達式 ]linux
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(簡單網絡管理協議;)git
一些經常使用的命令github
監控指定網卡正則表達式
tcpdump -i eth0 -w dump.pcap
-i
指定要抓取的網卡 -w
指定結果保存位置當想要中止的時候,按下 ctrl + c
就能夠了,而後用 sz 命令或其餘方式把 dump.pcap 文件下載到本地:服務器
sz dump.pcap網絡
上圖是過濾了只顯示 http 的包。less
Wireshark 顯示結果不夠方便,咱們也能夠用 Fiddler 看監控的結果。運維
Fiddler 2 and Fiddler 4 now include import support for PCAP, PCAPNG, and NetMon files. Click File > Import Session > 選擇 Packet Capture 類型.elasticsearch
Note that only HTTP traffic will be imported (HTTPS traffic is encrypted, and FTP traffic wasn't a priority).
注意,僅僅 http的包被提取出來了。
-v
主要是爲了獲得 Got 93
這個數,當想要中止的時候,按下 ctrl + c
就能夠了:
結束後能夠看到抓取了多少包
這時候咱們須要用到 tcpdump 的表達式了。 表達式是一個正則表達式,tcpdump利用它做爲過濾報文的條件,若是一個報文知足表達式的條件,則這個報文將會被捕獲。若是沒有給出任何條件,則網絡上全部的信息包將會被截獲。
在表達式中通常以下幾種類型的關鍵字,一種是關於類型的關鍵字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一臺主機,net 202.0.0.0 指明202.0.0.0是一個網絡地址,port 23 指明端口號是23。若是沒有指定類型,缺省的類型是host.
第二種是肯定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的網絡地址是202.0.0.0 。若是沒有指明方向關鍵字,則
缺省是src or dst關鍵字。
第三種是協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分佈式光纖數據接口網絡)上的特定的網絡協議,實際上它是"ether"的別名,fddi和ether具備相似的源地址和目的地址,因此能夠將fddi協議包看成ether的包進行處理和分析。其餘的幾個關鍵字就是指明瞭監聽的包的協議內容。若是沒有指定任何協議,則tcpdump將會監聽全部協議的信息包。
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||';
下面是一些例子:
tcpdump –i eth0 –w dump.pcap –v host 10.30.0.32 and port 9200
向 10.30.0.32 這個elasticsearch服務器發送請求的抓包。
tcpdump -i eth0 -w dump3.pcap -v 'tcp and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
參考 : http://www.tcpdump.org/manpages/tcpdump.1.html
注意,這時候抓取的數據用 wireshark 看時, 會看到不少 TCP segment of a reassembled PDU 的信息, 以下圖:
這是由於:主機響應一個查詢或者命令時若是要回應不少數據(信息)而這些數據超出了TCP的最大MSS時,主機會經過發送多個數據包來傳送 這些數據(注意:這些包並未被分片)。對wireshark來講這些對相應同一個查詢命令的數據包被標記了「TCP segment of a reassembled PDU」
參考: http://blog.csdn.net/hldjf/article/details/7450565
https://sites.google.com/site/jimmyxu101/testing/use-tcpdump-to-monitor-http-traffic
-c
參數對於運維人員來講也比較經常使用,由於流量比較大的服務器,靠人工CTRL+C仍是抓的太多,甚至致使服務器宕機,因而能夠用-c
參數指定抓多少個包。
time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的命令計算抓10000個SYN包花費多少時間,能夠判斷訪問量大概是多少。
tcpdump -D 獲取網絡適配器列表
參考資料:
tcpdump 抓包讓wireshark來分析
http://blog.csdn.net/langeldep/article/details/6156818
tcpdump使用技巧
http://linuxwiki.github.io/NetTools/tcpdump.html