發展簡史
1997年底,Gerald Combs需要一個能夠追蹤網路流量的工具軟體作為其工作上的輔助。因此他開始撰寫Ethereal軟體。
Ethereal 在經過幾次中斷開發的事件過後,終於在1998年7月發布其第一個版本 v0.2.0。自此之後,Combs收到了來自全世界的補丁、錯誤回報與鼓勵信件。Ethereal的發展就此開始。不久之後,Gilbert Ramirez 看到了這套軟體的開發潛力並開始參予低級程式的開發。1998年10月,來自 Network Appliance 公司的 Guy Harris 在查找一套比 tcpview(另外一套網路數據包截取程式)更好的軟體。於是他也開始參與Ethereal的開發工作。
1998年底,一位在教授 TCP/IP 課程的講師 Richard Sharpe,看到了這套軟體的發展潛力,而後開始參與開發與加入新協定的功能。在當時,新的通信協定的制定並不複雜,因此他開始在Ethereal上新增的數據包截取功能,幾乎包含了當時所有通信協定。
自此之後,數以千計的人開始參與Ethereal的開發,多半是因為希望能讓Ethereal截取特定的,尚未包含在Ethereal默認的網路協定的數據包而參予新的開發。
2006年6月,因為商目標問題,Ethereal更名為Wireshark。
軟體特徵
Ethereal 主要具有以下特徵:
在實時時間內,從網路連線處捕獲數據,或者從被捕獲檔案處讀取數據;
Ethereal 可以讀取從 tcpdump(libpcap)、網路通用嗅探器(被壓縮和未被壓縮)、SnifferTM 專業版、NetXrayTM、Sun snoop 和 atmsnoop、Shomiti/Finisar 測試員、AIX 的 iptrace、Microsoft 的網路監控器、Novell 的 LANalyzer、RADCOM 的 WAN/LAN 分析器、 ISDN4BSD 項目的 HP-UX nettl 和 i4btrace、Cisco 安全 IDS iplog 和 pppd 日誌( pppdump 格式)、WildPacket 的 EtherPeek/TokenPeek/AiroPeek 或者可視網路的可視 UpTime 處捕獲的檔案。此外 Ethereal 也能從 Lucent/Ascend WAN 路由器和 Toshiba ISDN 路由器中讀取跟蹤報告,還能從 VMS 的 TCPIP 讀取輸出文本和 DBS Etherwatch。
從乙太網、FDDI、PPP、令牌環、IEEE 802.11、ATM 上的 IP 和迴路接口(至少是某些系統,不是所有系統都支持這些類型)上讀取實時數據。
通過 GUI 或 TTY 模式 tethereal 程式,可以訪問被捕獲的網路數據。
通過 editcap 程式的命令行交換機,有計畫地編輯或修改被捕獲檔案。
當前602協定可被分割。
輸出檔案可以被保存或列印為純文本或 PostScript格式。
通過顯示過濾器精確顯示數據。
顯示過濾器也可以選擇性地用於高亮區和顏色包摘要信息。
所有或部分被捕獲的網路跟蹤報告都會保存到磁碟中。
系統介紹
Ethereal是一個開放源碼的網路分析系統,也是是目前最好的開放源碼的網路協定分析器,支持Linux和windows平台。Ethereal起初由Gerald Combs開發,隨後由一個鬆散的Etheral團隊組織進行維護開發。它目前所提供的強大的協定分析功能完全可以媲美商業的網路分析系統,自從1998年發布最早的0.2版本至今,大量的志願者為Ethereal添加新的協定解析器,如今Ethereal已經支持五百多種協定解析。很難想像如此多的人開發的代碼可以很好的融入系統中;並且在系統中加入一個新的協定解析器很簡單,一個不了解系統的結構的新手也可以根據留出的接口進行自己的協定開發。這都歸功於Ehereal良好的設計結構。事實上由於網路上各種協定種類繁多,各種新的協定層出不窮。一個好的協定分析器必需有很好的可擴展性和結構。這樣才能適應網路發展的需要不斷加入新的協定解析器。
1 Ethereal的捕包平台
網路分析系統首先依賴於一套捕捉網路數據包的函式館。這套函式館工作在在網路分析系統模組的最底層。作用是從網卡取得數據包或者根據過濾規則取出數據包的子集,再轉交給上層分析模組。從協定上說,這套函式館將一個數據包從鏈路層接收,至少將其還原至傳輸層以上,以供上層分析。
在Linux系統中, 1992年Lawrence Berkeley Lab的Steven McCanne和Van Jacobson提出了包過濾器的一種的實現,BPF(BSD Packet Filter)。Libpcap是一個基於BPF的開放源碼的捕包函式館。現有的大部分Linux捕包系統都是基於這套函式館或者是在它基礎上做一些針對性的改進。
在window系統中,義大利人Fulvio Risso和Loris Degioanni提出並實現了Winpcap函式館,作者稱之為NPF。由於NPF的主要思想就是來源於BPF,它的設計目標就是為windows系統提供一個功能強大的開發式數據包捕獲平台,希望在Linux系統中的網路分析工具經過簡單編譯以後也可以移植到windows中,因此這兩種捕包架構是非常相似的。就實現來說提供的函式調用接口也是一致的。
Ethereal網路分析系統也需要一個底層的抓包平台,在Linux中是採用Libpcap函式館抓包,在windows系統中採用winpcap函式館抓包。
2 層次化的數據包協定分析方法
取得捕包函式捕回的數據包後就需要進行協定分析和協定還原工作了。由於OSI的7層協定模型,協定數據是從上到下封裝後傳送的。對於協定分析需要從下至上進行。首先對網路層的協定識別後進行組包還原然後脫去網路層協定頭。將裡面的數據交給傳輸層分析,這樣一直進行下去直到套用層。
Ip
| \
Tcp udp
| \
HTTP TFTP
由於網路協定種類很多,就Ethereal所識別的500多種協定來說,為了使協定和協定間層次關係明顯。從而對數據流里的各個層次的協定能夠逐層處理。Ethereal系統採用了協定樹的方式。上圖就是一個簡單的協定樹。如果協定A的所有數據都是封裝在協定B里的,那么這個協定A就是協定B是另外一個協定的兒子節點。我們將最低層的無結構數據流作為根接點。那么具有相同父節點的協定成為兄弟節點。那么這些擁有同樣父協定兄弟節點協定如何互相區分了?Ethereal系統採用協定的特徵字來識別。每個協定會註冊自己的特徵字。這些特徵字給自己的子節點協定提供可以互相區分開來的標識。比如tcp協定的port欄位註冊後。 Tcp.port=21就可以認為是ftp協定, 特徵字可以是協定規範定義的任何一個欄位。比如ip協定就可以定義proto欄位為一個特徵字。
在Ethereal中註冊一個協定解析器首先要指出它的父協定是什麼。另外還要指出自己區別於父節點下的兄弟接點協定的特徵。比如ftp協定。在Ethereal中他的父接點是tcp協定,它的特徵就是tcp協定的port欄位為21。
這樣當一個連線埠為21的tcp數據流來到時。首先由tcp協定註冊的解析模組處理,處理完之後通過查找協定樹找到自己協定下面的子協定,判斷應該由那個子協定來執行,找到正確的子協定後,就轉交給ftp註冊的解析模組處理。這樣由根節點開始一層層解析下去。
由於採用了協定樹加特徵字的設計,這個系統在協定解析上由了很強的擴展性,增加一個協定解析器只需要將解析函式掛到協定樹的相應節點上即可。
3 基於外掛程式技術的協定分析器
所謂外掛程式技術,就是在程式的設計開發過程中,把整個應用程式分成宿主程式和外掛程式兩個部分,宿主程式與外掛程式能夠相互通信,並且,在宿主程式不變的情況下,可以通過增減外掛程式或修改外掛程式來調整應用程式的功能。運用外掛程式技術可以開發出伸縮性良好、便於維護的應用程式。它著名的套用實例有:媒體播放器winamp、微軟的網路瀏覽器ie等。
由於現在網路協定種類繁多,為了可以隨時增加新的協定分析器,一般的協定分析器都採用外掛程式技術,這樣如果需要對一個新的協定分析只需要開發編寫這個協定分析器並調用註冊函式在系統註冊就可以使用了。通過增加外掛程式使程式有很強的可擴展性,各個功能模組內聚。
在協定分析器中新增加一個協定外掛程式一般需要外掛程式安裝或者註冊,外掛程式初始化,外掛程式處理3個步驟,下面以Ethereal為例進行分析如何利用外掛程式技術新增加一個協定分析模組。
Ethereal由於採用外掛程式技術,一個新加入開發的程式設計師開發一種新的協定分析模組的時候不需要了解所有的代碼,他只需要寫好這個協定模組的函式後,寫一個格式為proto_reg_handoff_XXX的函式,在函式內調用註冊函式告訴系統在什麼時候需要調用這個協定模組。比如
你事先寫好了一個名為dissect_myprot的協定解析模組,它是用來解析tcp協定連線埠為250的數據。可以利用這些語句來將這個解析器註冊到系統中
proto_reg_handoff_myprot(void)
{
dissector_handle_t myprot_handle;
myprot_handle = create_dissector_handle(dissect_myprot,
proto_myprot);
dissector_add("tcp.port", 250, myprot_handle);
}
這段代碼告訴系統當tcp協定數據流連線埠為250的時候要調用dissect_myprot這個函式模組。
在Ethereal中有一個腳本專門來發現開發者定義的類式proto_reg_handoff_xxx這樣的註冊函式名,然後自動生成調用這些註冊函式的代碼。這樣開發者不需要知道自己的註冊函式如何被調用的。這樣一個新的協定分析模組就加入到系統中了。
由於採用了外掛程式方式,Ethereal良好的結構設計讓開發者只需要關係自己開發的協定模組,不需要關心整個系統結構,需要將模組整合進系統只需要寫一個註冊函式即可,連初始化時調用這個註冊函式都由腳本自動完成了。正是因為有很好的體系結構,這個系統才能夠開發出如此多的協定解析器。
儘管Ethereal是目前最好的開放源碼的網路分析系統,但Ethereal仍然有一些可以改進的地方,一個優秀的網路分析器,儘可能的正確分析出數據協定和高效的處理數據是兩個重要的指標。在協定識別方面Ethereal大多採用連線埠識別,有少量協定採用內容識別。這就讓一些非標準連線埠的協定數據沒有正確解析出來。比如ftp協定如果不是21連線埠的話,Ethereal就無法識別出來,只能作為tcp數據處理。另外對於內容識別式。Ethereal是將所以內容識別的函式組成一張入口表。每次協定數據需要內容識別時,按字母順序逐個調用表里的每個識別函式。比如對於識別yahoo massanger協定。主要是看數據前幾個位元組是不是’ymsg’.由於協定名為y開頭。所以當識別出協定時已經把所有內容識別函式調用了一遍。這些都是由於Ethereal沒有實現tcp協定棧,無法做到流級別的識別。導致在協定識別方面有點缺陷。
套用範圍
Ethereal 是一種開放原始碼的許可軟體,允許用戶向其中添加改進方案。Ethereal 適用於當前所有較為流行的計算機系統,包括 Unix、Linux 和 Windows 。
使用入門
Ethereal 可以用來從網路上抓包,並能對包進行分析。下面介紹windows 下Ethereal 的使用方法:
安裝
1)安裝winpcap
2)安裝Ethereal
使用
windows 程式,使用很簡單。
啟動ethereal 以後,選擇選單Capture->Start ,就OK 了。當你不想抓的時候,按一下stop, 抓的包就會顯示在面板中,並且已經分析好了。
Ethereal使用-capture選項
interface: 指定在哪個接口(網卡)上抓包。一般情況下都是單網卡,所以使用預設的就可以了
Limit each packet: 限制每個包的大小,預設情況不限制
Capture packets in promiscuous mode: 是否打開混雜模式。如果打開,抓取所有的數據包。一般情況下只需要監聽本機收到或者發出的包,因此應該關閉這個選項。
Filter:過濾器。只抓取滿足過濾規則的包(可暫時略過)
File:如果需要將抓到的包寫到檔案中,在這裡輸入檔案名稱稱。
use ring buffer: 是否使用循環緩衝。預設情況下不使用,即一直抓包。注意,循環緩衝只有在寫檔案的時候才有效。如果使用了循環緩衝,還需要設定檔案的數目,檔案多大時回卷
其他的項選擇預設的就可以了
Ethereal的抓包過濾器
抓包過濾器用來抓取感興趣的包,用在抓包過程中。 抓包過濾器使用的是libcap 過濾器語言,在tcpdump 的手冊中有詳細的解釋,基本結構是: [not] primitive [and|or [not] primitive ...]
個人觀點,如果你想抓取某些特定的數據包時,可以有以下兩種方法,你可以任選一種, 個人比較偏好第二種方式:
1、在抓包的時候,就先定義好抓包過濾器,這樣結果就是只抓到你設定好的那些類型的數 據包;
2、先不管三七二十一,把本機收到或者發出的包一股腦的抓下來,然後使用下節介紹的顯 示過濾器,只讓Ethereal 顯示那些你想要的那些類型的數據包;
etheral的顯示過濾器(重點內容)
在抓包完成以後,顯示過濾器可以用來找到你感興趣的包,可以根據1)協定2)是否存在某個域3)域值4)域值之間的比較來查找你感興趣的包。
舉個例子,如果你只想查看使用tcp 協定的包,在ethereal 視窗的左下角的Filter 中輸入tcp, 然後回車,Ethereal 就會只顯示tcp 協定的包。
值比較表達式可以使用下面的操作符來構造顯示過濾器自然語言類c 表示舉例eq == ip.addr==10.1.10.20 ne != ip.addr!=10.1.10.20 gt > frame.pkt_len>10 lt < frame.pkt_len= frame.pkt_len>=10 le