# 第?4?章?實時捕捉數據包
**目錄**
+ [4.1\. 介紹](http://man.lupaworld.com/content/network/wireshark/capturing_live.html#c4.1)
+ [4.2\. 準備工作](#calibre_link-49)
+ [4.3\. 開始捕捉](#calibre_link-50)
+ [4.4\. 捕捉接口對話框](#calibre_link-44)
+ [4.5\. 捕捉選項對話框](#calibre_link-45)
+ [4.5.1\. 捕捉楨](http://man.lupaworld.com/content/network/wireshark/c4.5.html#c4.5.1)
+ [4.5.2\. 捉數據幀為文件。](http://man.lupaworld.com/content/network/wireshark/c4.5.html#c4.5.2)
+ [4.5.3\. 停止捕捉楨](http://man.lupaworld.com/content/network/wireshark/c4.5.html#c4.5.3)
+ [4.5.4\. 顯示楨選項](http://man.lupaworld.com/content/network/wireshark/c4.5.html#c4.5.4)
+ [4.5.5\. 名稱解析設置](http://man.lupaworld.com/content/network/wireshark/c4.5.html#c4.5.5)
+ [4.5.6\. 按鈕](http://man.lupaworld.com/content/network/wireshark/c4.5.html#c4.5.6)
+ [4.6\. 捕捉文件格式、模式設置](#calibre_link-51)
+ [4.7\. 鏈路層包頭類型](#calibre_link-52)
+ [4.8\. 捕捉時過濾](#calibre_link-53)
+ [4.8.1\. 自動過濾遠程通信](http://man.lupaworld.com/content/network/wireshark/c4.8.html#c4.8.1)
+ [4.9\. 在捕捉過程中](#calibre_link-54)
+ [4.9.1\. 停止捕捉](http://man.lupaworld.com/content/network/wireshark/c4.9.html#c4.9.1)
+ [4.9.2\. 重新啟動捕捉](http://man.lupaworld.com/content/network/wireshark/c4.9.html#c4.9.2)
## 4.1.?介紹
實時捕捉數據包時Wireshar的特色之一
Wiershark捕捉引擎具備以下特點
* 支持多種網絡接口的捕捉(以太網,令牌環網,ATM...)
* 支持多種機制觸發停止捕捉,例如:捕捉文件的大小,捕捉持續時間,捕捉到包的數量...
* 捕捉時同時顯示包解碼詳情
* 設置過濾,減少捕捉到包的容量。見[第?4.8?節 “捕捉時過濾”](#calibre_link-53 "4.8.?捕捉時過濾")
* 長時間捕捉時,可以設置生成多個文件。對于特別長時間的捕捉,可以設置捕捉文件大小罰值,設置僅保留最后的N個文件等手段。見[第?4.6?節 “捕捉文件格式、模式設置”](#calibre_link-51 "4.6.?捕捉文件格式、模式設置")
Wireshark捕捉引擎在以下幾個方面尚有不足
* 從多個網絡接口同時實時捕捉,(但是您可以開始多個應用程序實體,捕捉后進行文件合并)
* 根據捕捉到的數據停止捕捉(或其他操作)
## 4.2.?準備工作
第一次設置Wireshark捕捉包可能會遇到一些小麻煩
> 
> 提示
> 關于如何進行捕捉設置的較為全面的向導可以在:[http://wiki.wireshark.org/CaptureSetup.](http://wiki.wireshark.org/CaptureSetup.)
這里有一些常見需要注意的地方
* 你必須擁有root/Administrator特權以開始捕捉[[12](#calibre_link-95)]
* 必須選擇正確的網絡接口捕捉數據
* 如果您想捕捉某處的通信,你必須作出決定:在什么地方可以捕捉到
* ……以及許多
如果你碰到設置問題,建議看看前面的那個向導,或許會有所幫助
[[12](#calibre_link-96)] 記得在Windows安裝那一節層提到如果作為服務啟動可以避免非管理員無法進行捕捉,不知道二者能否相互印證。
## 4.3.?開始捕捉
可以使用下任一方式開始捕捉包
* 使用打開捕捉接口對話框,瀏覽可用的本地網絡接口,見[圖?4.1 “"Capture Interfaces"捕捉接口對話框”](#calibre_link-103 "圖?4.1.?"Capture Interfaces"捕捉接口對話框"),
選擇您需要進行捕捉的接口啟動捕捉
* 你也可以使用"捕捉選項"按鈕啟動對話框開始捕捉,見[圖?4.2 “"Capture Option/捕捉選項"對話框”](#calibre_link-104 "圖?4.2.?"Capture Option/捕捉選項"對話框")
* 如果您前次捕捉時的設置和現在的要求一樣,您可以點擊"開始捕捉"按鈕或者是菜單項立即開始本次捕捉。
* 如果你已經知道捕捉接口的名稱,可以使用如下命令從命令行開始捕捉:
```
wireshark -i eth0 -k
```
上述命令會從eht0接口開始捕捉,有關命令行的介紹參見[第?9.2?節 “從命令行啟動Wireshark”](#calibre_link-47 "9.2.?從命令行啟動Wireshark")
## 4.4.?捕捉接口對話框
如果您從捕捉菜單選擇"Interface...",將會彈出如[圖?4.1 “"Capture Interfaces"捕捉接口對話框”](#calibre_link-103 "圖?4.1.?"Capture Interfaces"捕捉接口對話框")所示的對話框
> 
> 警告
> 打開"Capture Interfaces"/捕捉對話框時 同時正在顯示捕捉的數據,這將會大量消耗您的系統資源。盡快選擇您需要的接口以結束該對話框。避免影響系統性能
> 
> 注意
> 這個對話框只顯示本地已知的網絡接口,Wireshark可能無法檢測到所有的本地接口,Wireshark不能檢測遠程可用的網絡接口,Wireshark只能使用列出可用的網絡接口
**圖?4.1.?"Capture Interfaces"捕捉接口對話框**

**描述**
從操作系統獲取的接口信息
**IP**
Wireshark能解析的第一個IP地址,如果接口未獲得IP地址(如,不存在可用的DHCP服務器),將會顯示"Unkow",如果有超過一個IP的,只顯示第一個(無法確定哪一個會顯示).
**Packets**
打開該窗口后,從此接口捕捉到的包的數目。如果一直沒有接收到包,則會顯示為灰度
**Packets/s**
最近一秒捕捉到包的數目。如果最近一秒沒有捕捉到包,將會是灰度顯示
**Stop**
停止當前運行的捕捉
**Capture**
從選擇的接口立即開始捕捉,使用最后一次捕捉的設置。
Options
打開該接口的捕捉選項對話框,見 [第?4.5?節 “捕捉選項對話框”](#calibre_link-45 "4.5.?捕捉選項對話框")
**Details(僅Win32系統)**
打開對話框顯示接口的詳細信息
**Close**
關閉對話框
## 4.5.?捕捉選項對話框
如果您從捕捉菜單選擇"start..."按鈕(或者從主工具欄選擇對應的項目),Wireshark彈出"Capture Option/捕捉選項"對話框。如[圖?4.2 “"Capture Option/捕捉選項"對話框”](#calibre_link-104 "圖?4.2.?"Capture Option/捕捉選項"對話框")所示
**圖?4.2.?"Capture Option/捕捉選項"對話框**

> 
> 提示
> 如果你不了解各項設置的意義,建議保持默認。
你可以用對話框中的如下字段進行設置
### 4.5.1.?捕捉楨
**Interface**
該字段指定你想用于進行捕捉的借口。一次只能使用一個接口。這是一個下拉列表,簡單點擊右側的按鈕,選擇你想要使用的接口。默認第一是支持捕捉的non-loopback(非環回)接口,如果沒有這樣的接口,第一個將是環回接口。在某些系統中,回借口不支持捕捉包(windows平臺下的環回接口就不支持。)
在命令行使用-i <interface>參數可以替代該選項
**IP address**
表示選擇接口的IP地址。如果系統未指定IP地址,將會顯示為"unknown"
**Link-layer header type**
除非你有些特殊應用,盡量保持此選項默認。想了解更多詳情,見 [第?4.7?節 “鏈路層包頭類型”](#calibre_link-52 "4.7.?鏈路層包頭類型")
Buffer size: n megabyte(s)
輸入用于捕捉的緩層大小。該選項是設置寫入數據到磁盤前保留在核心緩存中捕捉數據的大小,如果你發現丟包。嘗試增大該值。
> 
> 注意
> 該選項僅適用于Windows平臺
Capture packets in promiscuous mode
指定Wireshark捕捉包時,設置接口為雜收模式(有些人翻譯為混雜模式)。如果你**未**指定該選項,Wireshark 將只能捕捉進出你電腦的數據包(不能捕捉整個局域網段的包)[[13](#calibre_link-110)]
> 
> 注意
> 如果其他應用程序將網卡設置為雜收模式,即使不選中該選項,也會工作于雜收模式下。
> 
> 注意
> 即使在雜收模式下,你也未必能夠接收到整個網段所有的網絡包。詳細解釋見[http://www.wireshark.org/faq.html#promiscsniff](http://www.wireshark.org/faq.html#promiscsniff)
Limit each packet to n bytes
指定捕捉過程中,每個包的最大字節數。在某些地方被稱為。"snaplen".[[14](#calibre_link-111)]如果禁止該選項,默認值為65535,這適用于大多數協議,下面是一些大多數情況下都適用的規則(這里又出現了拇指規則,第一章,系統需求時提到過。這里權且翻譯作普適而非絕對的規則))
* 如果你不確定,盡量保持默認值
* 如果你不需要包中的所有數據。例如:如果您僅需要鏈路層、IP和TCP包頭,您可能想要選擇一個較小的快照長度。這樣只需要較少的cpu占用時間用于復制包,包需要的緩存也較少。如此在繁忙網絡中捕捉時丟失的包也可能會相應少一點。
* 如果你沒有捕捉包中的所有數據(適用snpaplen截斷了包),你可能會發現有時候你想要的包中的數據部分被截斷丟棄了。或者因為缺少重要的部分,想對某些包進行重組而發現失敗。
Capture Filter
指定捕捉過濾。捕捉過濾器將會在有[第?4.8?節 “捕捉時過濾”](#calibre_link-53 "4.8.?捕捉時過濾")詳細介紹,默認情況下是空的。
同樣你也可以點擊捕捉按鈕,通過彈出的捕捉過濾對話框創建或選擇一個過濾器,詳見[第?6.6?節 “定義,保存過濾器”](#calibre_link-1 "6.6.?定義,保存過濾器")
### 4.5.2.?捉數據幀為文件。
捕捉文件設置的使用方法的詳細介紹見[第?4.6?節 “捕捉文件格式、模式設置”](#calibre_link-51 "4.6.?捕捉文件格式、模式設置")
File
指定將用于捕捉的文件名。該字段默認是空白。如果保持空白,捕捉數據將會存儲在臨時文件夾。詳見[第?4.6?節 “捕捉文件格式、模式設置”](#calibre_link-51 "4.6.?捕捉文件格式、模式設置")
你可以點擊右側的按鈕打開瀏覽窗口設置文件存儲位置
Use multiple files
如果指定條件達到臨界值,Wireshark將會自動生成一個新文件,而不是適用單獨文件。
Next file every n megabyte(s)
僅適用選中Use multiple files,如果捕捉文件容量達到指定值,將會生成切換到新文件
Next file every n minutes(s)
僅適用選中Use multiple files,如果捕捉文件持續時間達到指定值,將會切換到新文件。
Ring buffer with n files
僅適用選中Use multiple files,僅生成制定數目的文件。
Stop caputure after n file(s)
僅適用選中Use multiple files,當生成指定數目文件時,在生成下一個文件時停止捕捉(生成n個還是n+1個文件?)
### 4.5.3.?停止捕捉楨
... after n packet(s)
在捕捉到指定數目數據包后停止捕捉
... after n megabytes(s)
在捕捉到指定容量的數據(byte(s)/kilobyte(s)/megabyte(s)/gigabyte(s) )后停止捕捉。如果沒有適用"user multiple files",該選項將是灰色
... after n minute(s)
在達到指定時間后停止捕捉
### 4.5.4.?顯示楨選項
Update list of packets in real time
在包列表面板實時更新捕捉數據。如果**未選定**該選項,在Wireshark捕捉結束之前將不能顯示數據。如果選中該選項,Wireshark將生成兩個獨立的進程,通過捕捉進程傳輸數據給顯示進程。
Automatic scrolling in live capture
指定Wireshark在有數據進入時實時滾動包列表面板,這樣您將一直能看到最近的包。反之,則最新數據包會被放置在行末,但不會自動滾動面板。如果未設置"update list of packets in real time",該選項將是灰色不可選的。
Hide capture info dialog
選中該選項,將會隱藏捕捉信息對話框
### 4.5.5.?名稱解析設置
Enable MAC name resolution
設置是否讓Wireshark翻譯MAC地址為名稱,見[第?7.6?節 “名稱解析”](#calibre_link-86 "7.6.?名稱解析")
Enable network name resolution
是否允許Wireshark對網絡地址進行解析,見[第?7.6?節 “名稱解析”](#calibre_link-86 "7.6.?名稱解析")
### 4.5.6.?按鈕
進行完上述設置以后,你可以點擊**start**按鈕進行捕捉,也可以點擊**Cancel**退出捕捉.
開始捕捉以后,在你收集到足夠的數據時你可以停止捕捉。見[第?4.9?節 “在捕捉過程中”](#calibre_link-54 "4.9.?在捕捉過程中")
[[13](#calibre_link-112)] 網卡在局域網內會接到很多不屬于自己的包,默認情況下,網卡會不對這些包進行處理。貌似設置為雜收模式,Wireshak會監聽所有的包,但并不作出相應。
[[14](#calibre_link-113)] 粗略查了一下,未找到該詞的合適翻譯,多見于Winpcap的描述,如果把該單詞拆分,snap:單元,快照,len:長度,似乎就是單位長度,單元大小的意思。在看看該段下面第二個如果中提到的snapshot length,snaplen應該是二者的簡寫形式,快照長度
## 4.6.?捕捉文件格式、模式設置
在 捕捉時,libpcap 捕捉引擎(linux環境下)會抓取來自網卡的包存放在(相對來說)較小的核心緩存內。這些數據由Wireshark讀取并保存到用戶指定的捕捉文件中。
保存包數據到捕捉文件時,可采用差異模式操作。
> 
> 提示
> 處理大文件(數百兆)將會變得非常慢。如果你計劃進行長時間捕捉,或者處于一個高吞吐量的網絡中,考慮使用前面提到的"Multiple files/多文件"選項。該選項可以將捕捉包分割為多個小文件。這樣可能更適合上述環境。
> 
> 注意
> 使用多文件可能會切斷上下文關聯信息。Wireshark保留載入包的上下文信息,所以它會報告上下文關聯問題(例如流問題)和關聯上下文協議信息(例如:何處數據產生建立階段,必須查找后續包)。這些信息僅能在載入文件中顯示,使用多文件模式可能會截斷這樣的上下文。如果建立連接階段已經保存在一個文件中,你想要看的在另一個文件中,你可能無法看到可用的上下文關聯信息。
> 
> 提示
> 關于捕捉文件的目錄信息,可見???
**表?4.1.?捕捉文件模式選項**
| "File"選項 | "Use multiple files"選項 | "Ring buffer with n files"選項 | Mode | 最終文件命名方式 |
| --- | --- | --- | --- | --- |
| - | - | - | Single temporary file | etherXXXXXX (where XXXXXX 是一個獨立值) |
| foo.cap | - | - | Single named file | foo.cap |
| foo.cap | x | - | Multiple files,continuous | foo_00001_20040205110102.cap, foo_00002_20040205110102.cap, ... |
| foo.cap | x | x | Multiple files,ring buffer | foo_00001_20040205110102.cap, foo_00002_20040205110102.cap, ... |
Single temporary file
將會創建并使用一個臨時文件(默認選項).捕捉文件結束后,該文件可以由用戶指定文件名。
Single named file
使用單獨文件,如果你想放到指定目錄,選擇此模式
Multiple files,continuous
與single name file模式類似,不同點在于,當捕捉達到多文件切換臨界條件時之一時,會創建一個新文件用于捕捉
Multiple files,ring buffer
與"multiple files continuous"模式類似,不同之處在于,創建的文件數目固定。當達到ring buffer with n值時,會替換掉第一個文件開始捕捉,如此循環往復。
該模式可以限制最大磁盤空間使用量,即使未限制捕捉數據輸入,也只能保留最后幾個捕捉數據。
## 4.7.?鏈路層包頭類型
在通常情況下,你不需要選擇鏈路層包頭類型。下面的段落描述了例外的情況,此時選擇包頭類型是有必要的,所以你需要知道怎么做:
如果你在某種版本BSD操作系統下從某種802.11 設備(無線局域網設備)捕捉數據,可能需要在"802.11"和"Ethernet"中做出選擇。"Ethernet"將會導致捕捉到的包帶有偽以太網幀頭(不知道是不是應該叫偽首部更準確些);"802.11"將會導致他們帶有802.11幀頭。如果捕捉時的應用程序不支持"802.11幀頭",你需要選擇"802.11"
如果你使用Endace DAG card(某種網絡監視卡)連接到同步串口線(譯者注:E文為synchronous serial line,權且翻譯作前文吧,未接觸過此卡、未熟稔此線名稱),可能會出現"PPP over serial" 或 "Cisco HDLC"(自己google去)供選擇。根據你自己的情況選擇二者中的一個。
如果你使用Endace DAG card(同上)連接到ATM網絡,將會提供"RFC 1483 IP-over-ATM"、"Sun raw ATM"供選擇。如果捕捉的通信是RFC 1483封裝IP(RFC 1483 LLC-encapsulated IP,不翻譯為妙),或者需要在不支持SunATM幀頭的應用程序下捕捉,選擇前者。反之選擇后者。
如果你在以太網捕捉,將會提供"Ethernet"、"DOCSIS"供選擇,如果您是在Cisco Cable Modem Termination System(CMTS是思科同軸電纜終端調制解調系統?)下捕捉數據。它會將DOCSIS(同軸電纜數據服務接口)通信放置到以太網中,供捕捉。此時需要選擇"DOCSIS",反之則反之。
## 4.8.?捕捉時過濾
Wireshark使用libpcap過濾語句進行捕捉過濾(what about winpcap?)。在tcpdump主頁有介紹,但這些只是過于晦澀難懂,所以這里做小幅度講解。
> 
> 提示
> 你可以從[http://wiki.wireshark.org/CaptureFilters](http://wiki.wireshark.org/CaptureFilters)找到捕捉過濾范例.
在Wireshark捕捉選項對話(見[圖?4.2 “"Capture Option/捕捉選項"對話框”](#calibre_link-104 "圖?4.2.?"Capture Option/捕捉選項"對話框"))框輸入捕捉過濾字段。下面的語句有點類似于tcpdump捕捉過濾語言。在tcpdump主頁[http://www.tcpdump.org/tcpdump_man.html](http://www.tcpdump.org/tcpdump_man.html)可以看到tcpdump表達式選項介紹。
捕捉過濾的形式為:和取值(**and/or**)進行進行基本單元連接,加上可選的,高有限級的**not**:
```
[not] **primitive** [and|or [not] **primitive** ...]
```
**例?4.1.?捕捉來自特定主機的telnet協議**
```
tcp port 23 and host 10.0.0.5
```
本例捕捉來自或指向主機10.0.0.5的Telnet 通信,展示了如何用and連接兩個基本單元。另外一個例子[例?4.2 “捕捉所有不是來自10.0.0.5的telnet 通信”](#calibre_link-118 "例?4.2.?捕捉所有不是來自10.0.0.5的telnet 通信")展示如何捕捉所有不是來自10.0.0.5的telnet 通信。
**例?4.2.?捕捉所有不是來自10.0.0.5的telnet 通信**
```
tcp host 23 and not src host 10.0.0.5
```
此處筆者建議增加更多范例。但是并沒有添加。
一個基本單元通常是下面中的一個
[src|dst] host <host>
此基本單元允許你過濾主機ip地址或名稱。你可以優先指定src|dst關鍵詞來指定你關注的是源地址還是目標地址。如果未指定,則指定的地址出現在源地址或目標地址中的包會被抓取。
ether [src|dst] host <ehost>
此單元允許你過濾主機以太網地址。你可以優先指定關鍵詞src|dst在關鍵詞ether和host之間,來確定你關注的是源地址還是目標地址。如果未指定,同上。
gateway host<host>
過濾通過指定**host**作為網關的包。這就是指那些以太網源地址或目標地址是**host**,但源ip地址和目標ip地址都不是**host**的包
[src|dst] net <net> [{mask<mask>}|{len <len>}]
通過網絡號進行過濾。你可以選擇優先指定**src|dst**來確定你感興趣的是源網絡還是目標網絡。如果兩個都沒指定。指定網絡出現在源還是目標網絡的都會被選擇。另外,你可以選擇子網掩碼或者CIDR(無類別域形式)。
[tcp|udp] [src|dst] port <port]
過濾tcp,udp及端口號。可以使用**src|dst**和**tcp|udp**關鍵詞來確定來自源還是目標,**tcp**協議還是**udp**協議。**tcp|udp**必須出現在**src|dst**之前。
less|greater <length>
選擇長度符合要求的包。(大于等于或小于等于)
ip|ether proto <protocol>
選擇有指定的協議在以太網層或是ip層的包
ether|ip broadcast|multicast
選擇以太網/ip層的廣播或多播
<expr> relop <expr>
創建一個復雜過濾表達式,來選擇包的字節或字節范圍符合要求的包。請參考[http://www.tcpdump.org/tcpdump_man.html](http://www.tcpdump.org/tcpdump_man.html)
### 4.8.1.?自動過濾遠程通信
如果Wireshark是使用遠程連接的主機運行的(例如使用SSH,X11 Window輸出,終端服務器),遠程連接必須通過網絡傳輸,會在你真正感興趣的通信中產生大量數據包(通常也是不重要的)
想要避免這種情況,wireshark可以設置為如果發現有遠程連接(通過察看指定的環境變量),自動創建一個過濾器來匹配這種連接。以避免捕捉Wireshark捕捉遠程連接通信。
下列環境變量可以進行分析
SSH——CONNECTION(ssh)
```
<remote IP> <remote port> <local IP> <local port>
```
SSH_CLIENT (ssh)
```
<remote IP> <remote port> <local port>
```
REMOTEHOST (tcsh, others?)
```
<remote name>
```
DISPLAY (x11)
```
[remote name]:<display num>
```
SESSIONNAME (terminal server)
```
<remote name>
```
## 4.9.?在捕捉過程中
捕捉時,會出現下面的對話框
**圖?4.3.?捕捉信息對話框**

上述對話框會向你顯示捕捉到包的數目,捕捉持續時間。選擇的被統計的協議無法更改(什么鳥意思?)
> 
> 提示
> 這個對話框可以被隱藏,在前次的捕捉選項對話框設置"Hide capture info dialog box"即可。
### 4.9.1.?停止捕捉
運行中的捕捉線程可以用下列方法停止:
1. 使用捕捉信息對話框上的"stop"按鈕停止。
|  | 注意 |
|
捕捉信息對話框有可能被隱藏,如果你選擇了"Hide capture info dialog"
|
2. 使用菜單項"Capture/ Stop"
3. 使用工具欄項" Stop"
4. 使用快捷鍵:Ctrl+E
5. 如果設置了觸發停止的條件,捕捉達到條件時會自動停止。
### 4.9.2.?重新啟動捕捉
運行中的捕捉進程可以被重新啟動。這將會移出上次捕捉的所有包。如果你捕捉到一些你不感興趣的包,你不想保留它,這個功能十分有用。
重新啟動是一項方便的功能,類似于停止捕捉后,在很短的時間內立即開始捕捉。以下兩種方式可以實現重新啟動捕捉:
1. 使用菜單項"Capture/ Restart"
2. 使用工具欄項" Restart"