天天看點

Linux網絡抓包分析工具Tcpdump基礎篇[參數說明]

很多故障排除或者網絡分析的時候都需要進行抓包分析,windows下可以通過sniffer或者wireshark,科來等工具;

linux下原生已經有了一個很強大的分析工具tcpdump,今天來測試一下這個工具的一些常用方法或者參數

<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>這時候抓包就可以通過-i參數抓取指定的網卡了(通過網卡編号或者網卡名都可以)</b>

-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>

<code>[root@localhost ~]</code><code># tcpdump -r test.cat</code>

<b>這裡抓取的IP和端口會被反向解析為域名和服務名,如果為了看到純粹的資料的話,可以通過-nn參數</b>

<code>tcpdump -i 1 -c 2  -nn</code>

這樣IP和端口就會直接顯示出來,而不是顯示出域名和服務名了

<b> </b>

<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>

Linux網絡抓包分析工具Tcpdump基礎篇[參數說明]

<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>

Linux網絡抓包分析工具Tcpdump基礎篇[參數說明]

想抓取指定網絡的資料包  通過net參數

Linux網絡抓包分析工具Tcpdump基礎篇[參數說明]

想要截獲主機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>

Linux網絡抓包分析工具Tcpdump基礎篇[參數說明]

如果想抓取指定協定的資料包,比如arp或者udp來分析arp欺騙或者udp攻擊,可以通過-p 加協定名稱:icmp,ip,ip6,arp,tcp,udp等

比如抓取arp資訊#:

<code>#tcpdump -i 1 -c 1 -nn -p arp</code>

Linux網絡抓包分析工具Tcpdump基礎篇[參數說明]

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 &gt; dat &amp; tail -f dat”.(nt: 前者使用tee來把tcpdump 的輸出同時放到檔案dat和标準輸出中, 而後者通過重定向操作’&gt;’, 把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 的取值未知, 需補充)

繼續閱讀