很多故障排除或者網絡分析的時候都需要進行抓包分析,windows下可以通過sniffer或者wireshark,科來等工具;
linux下原生已經有了一個很強大的分析工具tcpdump,今天來測試一下這個工具的一些常用方法或者參數<b></b>
<b>首先需要檢視裝置上有哪些裝置可以抓取,通過tcpdump -d會列出可以抓取的網絡裝置名以及編号</b>
<code>1</code>
<code>[root@localhost ~]</code><code># tcpdump -d</code>
<code>2</code>
<code>1.eth0</code>
<code>3</code>
<code>2.usbmon1 (usb bus number 1)</code>
<code>4</code>
<code>3.usbmon2 (usb bus number 2)</code>
<code>5</code>
<code>4.any (pseudo-device that captures on all interfaces)</code>
<code>6</code>
<code>5.lo</code>
<b></b>
這時候抓包就可以通過-i參數抓取指定的網卡了(通過網卡編号或者網卡名都可以)
-c 定義抓取資料包的count ,沒有此參數的話tcpdump會一直抓下去直到ctrl+c手工終止
<code>[root@~]</code><code># tcpdump -i 1 -c 2//這裡tcpdump -i eth0 -c 2效果是完全一樣的</code>
如果想抓取所有接口的資料包 可以指定any參數
#tcpdump -i any
即可
<b>-w 将抓取的資料包儲存到一個檔案中,用于離線分析或者儲存</b>
<code>[root@localhost ~]</code><code># tcpdump -i 1 -c 2 -w test.cap</code>
<code>tcpdump: listening on eth0, link-</code><code>type</code> <code>en10mb (ethernet), capture size 65535 bytes</code>
<code>2 packets captured</code>
<code>2 packets received by filter</code>
<code>0 packets dropped by kernel</code>
<code>[root@localhost ~]</code><code># ls</code>
<code>7</code>
<code>test</code><code>.cap</code>
<b>這裡面儲存的資料包可以通過windows的wireshark等分析工具打開,也可以通過tcpdump -r參數打</b><b>開</b>
<code>[root@localhost ~]</code><code># tcpdump -r test.cat</code>
<b>這裡抓取的ip和端口會被反向解析為域名和服務名,如果為了看到純粹的資料的話,可以通過-nn參數</b>
<code>tcpdump -i 1 -c 2 -nn</code>
這樣ip和端口就會直接顯示出來,而不是顯示出域名和服務名了
<b>通過-r參數離線讀取的時候,和線上抓包時候一樣,可以配合其它的tcpdump過濾參數一起使用</b>
<b>port 22 可以指定抓取22端口的資料,不抓取指定的端口可以用</b><b>port</b><b> not 22 或者 port ! 22</b>
如果本地ssh登陸伺服器抓包的話,為了避免本地ssh程式産生的資料包影響了分析,可以用:
<code>#tcpdump -i 1 port ! ssh</code>
這樣ssh的包就不會被抓取了
<b>如果隻想分析發往192.168.233.1的80端口的資料包,可以通過dst參數(多個篩選條件通過and或者or連接配接)</b>
<code>#tcpdump -i 1 -c 1 -nn dst 192.168.233.1 and port 80</code>
如果想抓192.168.233.1與192.168.233.2之外的所有ip通訊的資料包
<code>#tcpdump -i any host 192.168.233.1 and ! 192.168.233.2</code>

<b>如果想抓取192.168.233.1和192.168.233.237之間的資料包</b>
<code># tcpdump -i 1 -c 1 -nn host 192.168.233.1 and host 192.168.233.237</code>
想抓取指定網絡的資料包 通過net參數
想要截獲主機192.168.233.1 和(主機192.168.233.2 或192.168.233.3)的通信(shell下需要用括号要用\進行轉義)
<code>#tcpdump host 192.168.233.1 and \ (192.168.233.2 or 192.168.233.3 \)</code>
如果想抓取指定協定的資料包,比如arp或者udp來分析arp欺騙或者udp攻擊,可以通過-p 加協定名稱:icmp,ip,ip6,arp,tcp,udp等
比如抓取arp資訊#:
<code>#tcpdump -i 1 -c 1 -nn -p arp</code>
如果抓區域網路的包,還可以配合-e參數看到以太網的mac資訊等
1
下面是tcpdump的參數解釋
-a 以ascii碼方式顯示每一個資料包(不會顯示資料包中鍊路層頭部資訊). 在抓取包含網頁資料的資料包時, 可友善檢視資料(nt: 即handy for capturing web pages).
-c count
tcpdump将在接受到count個資料包後退出.
-c file-size (nt: 此選項用于配合-w file 選項使用)
該選項使得tcpdump 在把原始資料包直接儲存到檔案中之前, 檢查此檔案大小是否超過file-size. 如果超過了, 将關閉此檔案,另創一個檔案繼續用于原始資料包的記錄. 新建立的檔案名與-w 選項指定的檔案名一緻, 但檔案名後多了一個數字.該數字會從1開始随着新建立檔案的增多而增加. file-size的機關是百萬位元組(nt: 這裡指1,000,000個位元組,并非1,048,576個位元組, 後者是以1024位元組為1k, 1024k位元組為1m計算所得, 即1m=1024 * 1024 = 1,048,576)
-d 以容易閱讀的形式,在标準輸出上列印出編排過的包比對碼, 随後tcpdump停止.(nt | rt: human readable, 容易閱讀的,通常是指以ascii碼來列印一些資訊. compiled, 編排過的. packet-matching code, 包比對碼,含義未知, 需補充)
-dd 以c語言的形式列印出包比對碼.
-ddd 以十進制數的形式列印出包比對碼(會在包比對碼之前有一個附加的’count’字首).
-d 列印系統中所有tcpdump可以在其上進行抓包的網絡接口. 每一個接口會列印出數字編号, 相應的接口名字, 以及可能的一個網絡接口描述. 其中網絡接口名字和數字編号可以用在tcpdump 的-i flag 選項(nt: 把名字或數字代替flag), 來指定要在其上抓包的網絡接口.
此選項在不支援接口清單指令的系統上很有用(nt: 比如, windows 系統, 或缺乏 ifconfig -a 的unix系統); 接口的數字編号在windows 2000 或其後的系統中很有用, 因為這些系統上的接口名字比較複雜, 而不易使用.
如果tcpdump編譯時所依賴的libpcap庫太老,-d 選項不會被支援, 因為其中缺乏 pcap_findalldevs()函數.
-e 每行的列印輸出中将包括資料包的資料鍊路層頭部資訊
-e spi@ipaddr algo:secret,…
可通過spi@ipaddr algo:secret 來解密ipsec esp包(nt | rt:ipsec encapsulating security payload,ipsec 封裝安全負載, ipsec可了解為, 一整套對ip資料包的加密協定, esp 為整個ip 資料包或其中上層協定部分被加密後的資料,前者的工作模式稱為隧道模式; 後者的工作模式稱為傳輸模式 . 工作原理, 另需補充).
需要注意的是, 在終端啟動tcpdump 時, 可以為ipv4 esp packets 設定密鑰(secret).
可用于加密的算法包括des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者沒有(none).預設的是des-cbc(nt: des, data encryption standard, 資料加密标準, 加密算法未知, 另需補充).secret 為用于esp 的密鑰, 使用ascii 字元串方式表達. 如果以 0x 開頭, 該密鑰将以16進制方式讀入.
該選項中esp 的定義遵循rfc2406, 而不是 rfc1827. 并且, 此選項隻是用來調試的, 不推薦以真實密鑰(secret)來使用該選項, 因為這樣不安全: 在指令行中輸入的secret 可以被其他人通過ps 等指令檢視到.
除了以上的文法格式(nt: 指spi@ipaddr algo:secret), 還可以在後面添加一個文法輸入檔案名字供tcpdump 使用(nt:即把spi@ipaddr algo:secret,… 中…換成一個文法檔案名). 此檔案在接受到第一個esp 包時會打開此檔案, 是以最好此時把賦予tcpdump 的一些特權取消(nt: 可了解為, 這樣防範之後, 當該檔案為惡意編寫時,不至于造成過大損害).
-f 顯示外部的ipv4 位址時(nt: foreign ipv4 addresses, 可了解為, 非本機ip位址), 采用數字方式而不是名字.(此選項是用來對付sun公司的nis伺服器的缺陷(nt: nis, 網絡資訊服務, tcpdump 顯示外部位址的名字時會用到她提供的名稱服務): 此nis伺服器在查詢非本地位址名字時,常常會陷入無盡的查詢循環).
由于對外部(foreign)ipv4位址的測試需要用到本地網絡接口(nt: tcpdump 抓包時用到的接口)及其ipv4 位址和網絡掩碼. 如果此位址或網絡掩碼不可用, 或者此接口根本就沒有設定相應網絡位址和網絡掩碼(nt: linux 下的 ‘any’ 網絡接口就不需要設定位址和掩碼, 不過此’any’接口可以收到系統中所有接口的資料包), 該選項不能正常工作.
-f file
使用file 檔案作為過濾條件表達式的輸入, 此時指令行上的輸入将被忽略.
-i interface
指定tcpdump 需要監聽的接口. 如果沒有指定, tcpdump 會從系統接口清單中搜尋編号最小的已配置好的接口(不包括 loopback 接口).一但找到第一個符合條件的接口, 搜尋馬上結束.
在采用2.2版本或之後版本核心的linux 作業系統上, ‘any’ 這個虛拟網絡接口可被用來接收所有網絡接口上的資料包(nt: 這會包括目的是該網絡接口的, 也包括目的不是該網絡接口的). 需要注意的是如果真實網絡接口不能工作在’混雜’模式(promiscuous)下,則無法在’any’這個虛拟的網絡接口上抓取其資料包.
如果 -d 标志被指定, tcpdump會列印系統中的接口編号,而該編号就可用于此處的interface 參數.
-l 對标準輸出進行行緩沖(nt: 使标準輸出裝置遇到一個換行符就馬上把這行的内容列印出來).在需要同時觀察抓包列印以及儲存抓包記錄的時候很有用. 比如, 可通過以下指令組合來達到此目的:
<code></code>tcpdump -l | tee dat” 或者 <code></code>tcpdump -l > dat & tail -f dat”.(nt: 前者使用tee來把tcpdump 的輸出同時放到檔案dat和标準輸出中, 而後者通過重定向操作’>’, 把tcpdump的輸出放到dat 檔案中, 同時通過tail把dat檔案中的内容放到标準輸出中)
-l 列出指定網絡接口所支援的資料鍊路層的類型後退出.(nt: 指定接口通過-i 來指定)
-m module
通過module 指定的file 裝載smi mib 子產品(nt: smi,structure of management information, 管理資訊結構mib, management information base, 管理資訊庫. 可了解為, 這兩者用于snmp(simple network management protoco)協定資料包的抓取. 具體snmp 的工作原理未知, 另需補充).
此選項可多次使用, 進而為tcpdump 裝載不同的mib 子產品.
-m secret 如果tcp 資料包(tcp segments)有tcp-md5選項(在rfc 2385有相關描述), 則為其摘要的驗證指定一個公共的密鑰secret.
-n 不對位址(比如, 主機位址, 端口号)進行數字表示到名字表示的轉換.
-n 不列印出host 的域名部分. 比如, 如果設定了此選現, tcpdump 将會列印’nic’ 而不是 ‘nic.ddn.mil’.
-o 不啟用進行包比對時所用的優化代碼. 當懷疑某些bug是由優化代碼引起的, 此選項将很有用.
-p 一般情況下, 把網絡接口設定為非’混雜’模式. 但必須注意 , 在特殊情況下此網絡接口還是會以’混雜’模式來工作; 進而, ‘-p’ 的設與不設, 不能當做以下選現的代名詞:’ether host {local-hw-add}’ 或 ‘ether broadcast'(nt: 前者表示隻比對以太網位址為host 的包, 後者表示比對以太網位址為廣播位址的資料包).
-q 快速(也許用’安靜’更好?)列印輸出. 即列印很少的協定相關資訊, 進而輸出行都比較簡短.
-r 設定tcpdump 對 esp/ah 資料包的解析按照 rfc1825而不是rfc1829(nt: ah, 認證頭, esp, 安全負載封裝, 這兩者會用在ip包的安全傳輸機制中). 如果此選項被設定, tcpdump 将不會列印出’禁止中繼’域(nt: relay prevention field). 另外,由于esp/ah規範中沒有規定esp/ah資料包必須擁有協定版本号域,是以tcpdump不能從收到的esp/ah資料包中推導出協定版本号.
-r file
從檔案file 中讀取包資料. 如果file 字段為 ‘-‘ 符号, 則tcpdump 會從标準輸入中讀取包資料.
-s 列印tcp 資料包的順序号時, 使用絕對的順序号, 而不是相對的順序号.(nt: 相對順序号可了解為, 相對第一個tcp 包順序号的差距,比如, 接受方收到第一個資料包的絕對順序号為232323, 對于後來接收到的第2個,第3個資料包, tcpdump會列印其序列号為1, 2分别表示與第一個資料包的差距為1 和 2. 而如果此時-s 選項被設定, 對于後來接收到的第2個, 第3個資料包會列印出其絕對順序号:232324, 232325).
-s snaplen
設定tcpdump的資料包抓取長度為snaplen, 如果不設定預設将會是68位元組(而支援網絡接口分接頭(nt: nit, 上文已有描述,可搜尋’網絡接口分接頭’關鍵字找到那裡)的sunos系列作業系統中預設的也是最小值是96).68位元組對于ip, icmp(nt: internet control message protocol,網際網路控制封包協定), tcp 以及 udp 協定的封包已足夠, 但對于名稱服務(nt: 可了解為dns, nis等服務), nfs服務相關的資料包會産生包截短. 如果産生包截短這種情況, tcpdump的相應列印輸出行中會出現”[|proto]”的标志(proto 實際會顯示為被截短的資料包的相關協定層次). 需要注意的是, 采用長的抓取長度(nt: snaplen比較大), 會增加包的處理時間, 并且會減少tcpdump 可緩存的資料包的數量, 進而會導緻資料包的丢失. 是以, 在能抓取我們想要的包的前提下, 抓取長度越小越好.把snaplen 設定為0 意味着讓tcpdump自動選擇合适的長度來抓取資料包.
-t type
強制tcpdump按type指定的協定所描述的包結構來分析收到的資料包. 目前已知的type 可取的協定為:
aodv (ad-hoc on-demand distance vector protocol, 按需距離向量路由協定, 在ad hoc(點對點模式)網絡中使用),
cnfp (cisco netflow protocol), rpc(remote procedure call), rtp (real-time applications protocol),
rtcp (real-time applications con-trol protocol), snmp (simple network management protocol),
tftp (trivial file transfer protocol, 碎檔案協定), vat (visual audio tool, 可用于在internet 上進行電
視電話會議的應用層協定), 以及wb (distributed white board, 可用于網絡會議的應用層協定).
-t 在每行輸出中不列印時間戳
-tt 不對每行輸出的時間進行格式處理(nt: 這種格式一眼可能看不出其含義, 如時間戳列印成1261798315)
-ttt tcpdump 輸出時, 每兩行列印之間會延遲一個段時間(以毫秒為機關)
-tttt 在每行列印的時間戳之前添加日期的列印
-u 列印出未加密的nfs 句柄(nt: handle可了解為nfs 中使用的檔案句柄, 這将包括檔案夾和檔案夾中的檔案)
-u 使得當tcpdump在使用-w 選項時, 其檔案寫入與包的儲存同步.(nt: 即, 當每個資料包被儲存時, 它将及時被寫入檔案中,而不是等檔案的輸出緩沖已滿時才真正寫入此檔案)
-u 标志在老版本的libcap庫(nt: tcpdump 所依賴的封包捕獲庫)上不起作用, 因為其中缺乏pcap_cump_flush()函數.
-v 當分析和列印的時候, 産生詳細的輸出. 比如, 包的生存時間, 辨別, 總長度以及ip包的一些選項. 這也會打開一些附加的包完整性檢測, 比如對ip或icmp標頭部的校驗和.
-vv 産生比-v更詳細的輸出. 比如, nfs回應包中的附加域将會被列印, smb資料包也會被完全解碼.
-vvv 産生比-vv更詳細的輸出. 比如, telent 時所使用的sb, se 選項将會被列印, 如果telnet同時使用的是圖形界面,
其相應的圖形選項将會以16進制的方式列印出來(nt: telnet 的sb,se選項含義未知, 另需補充).
-w 把包資料直接寫入檔案而不進行分析和列印輸出. 這些包資料可在随後通過-r 選項來重新讀入并進行分析和列印.
-w filecount
此選項與-c 選項配合使用, 這将限制可打開的檔案數目, 并且當檔案資料超過這裡設定的限制時, 依次循環替代之前的檔案, 這相當于一個擁有filecount 個檔案的檔案緩沖池. 同時, 該選項會使得每個檔案名的開頭會出現足夠多并用來占位的0, 這可以友善這些檔案被正确的排序.
-x 當分析和列印時, tcpdump 會列印每個包的頭部資料, 同時會以16進制列印出每個包的資料(但不包括連接配接層的頭部).總共列印的資料大小不會超過整個資料包的大小與snaplen 中的最小值. 必須要注意的是, 如果高層協定資料沒有snaplen 這麼長,并且資料鍊路層(比如, ethernet層)有填充資料, 則這些填充資料也會被列印.(nt: so for link layers that pad, 未能銜接了解和翻譯, 需補充 )
-xx tcpdump 會列印每個包的頭部資料, 同時會以16進制列印出每個包的資料, 其中包括資料鍊路層的頭部.
-x 當分析和列印時, tcpdump 會列印每個包的頭部資料, 同時會以16進制和ascii碼形式列印出每個包的資料(但不包括連接配接層的頭部).這對于分析一些新協定的資料包很友善.
-xx 當分析和列印時, tcpdump 會列印每個包的頭部資料, 同時會以16進制和ascii碼形式列印出每個包的資料, 其中包括資料鍊路層的頭部.這對于分析一些新協定的資料包很友善.
-y datalinktype
設定tcpdump 隻捕獲資料鍊路層協定類型是datalinktype的資料包
-z user
使tcpdump 放棄自己的超級權限(如果以root使用者啟動tcpdump, tcpdump将會有超級使用者權限), 并把目前tcpdump的使用者id設定為user, 組id設定為user首要所屬組的id(nt: tcpdump 此處可了解為tcpdump 運作之後對應的程序)
此選項也可在編譯的時候被設定為預設打開.(nt: 此時user 的取值未知, 需補充)