實驗8 ICMP協定分析 實驗目的 明瞭ICMP(Internet Control Message Protocol;網際網路控制訊息協定)的工作原理 解析ICMP協定下封包資料傳送的格式。
背景資料 IP協定的主要功能在於盡力地將封包依選取路徑送達目的端,但封包在傳送過程中,難免可能遭遇許多的困難與問題,也許是網路擁塞、主機故障或主機根本未開機,使用者或路由器便可依需要進行必要的偵錯或控制的工作。 不過,這些問題並非IP協定所能解決,ICMP便是用以處理此項工作的機制,向來源端進行訊息狀況的通知與聯繫,提供IP協定所未涉及的部分進行補強,它的目的就是讓我們能夠檢測網路的連線狀況,也能確保連線的準確性,不過由於僅是控制訊息的傳遞並無詳細的指導,所以一般而言來源端並不處理該訊息。
ICMP其主要功能 ICMP屬於網路層的通訊協定,一般視為是IP的輔助協定,必須與IP協定搭配一起使用。 偵測遠端主機是否存在 建立及維護路由資料 重導資料傳送路徑 資料流量控制 ICMP屬於網路層的通訊協定,一般視為是IP的輔助協定,必須與IP協定搭配一起使用。 一般如網路連線無法連通的回應訊息,或以ping、tracert指令偵測網路連線狀況等情形,都是典型常見相關ICMP的訊息。
ICMP封包的欄位格式 每個ICMP封包都會有ICMP表頭,其中包含了三個固定長度的欄位:Type、Code與Checksum;至於ICMP資料的部分,則會隨著ICMP封包的類型而異。
ICMP封包的欄位格式 TYPE:長度為1 Byte,定義ICMP封包的類型。其欄位值與封包類型的對照表整理如下:
ICMP封包的欄位格式
ICMP封包的欄位格式 CODE:長度為1 Byte,每種類型可再根據Code欄位來定義各種不同用途。不過大部分ICMP封包類型只定義了一種Code欄位值。 Checksum:長度為2 Bytes,記錄ICMP封包的錯誤檢查碼。
常見的ICMP類型 Echo Request / Echo Reply(要求與回應) Destination Unreachable(無法到達目的) Source Quench(降低來源端傳輸速度) Redirect(重新導向) Time Exceeded(逾時)
Echo Request / Echo Reply(要求與回應) A主動發出Echo Request封包給B。 B收到Echo Request後,回應Echo Reply給A。 當完成上述動作時,A便能確認B存在且連線狀況、IP路由架構都正常運作。
Echo Request / Echo Reply(要求與回應) 封包欄位 ICMP表頭
Echo Request / Echo Reply(要求與回應) ICMP資料的三個欄位: Identifier:長度為2 Bytes,做為識別之用,由Echo Request來源端裝置的程式所決定。當目的端裝置收到Echo Request後,所回應EchoReply的Identifier欄位值必須與收到的Echo Request相同。 Sequence Number:長度為2 Bytes,用來記錄序號,由Echo Request來源端裝置的程式所決定。當目的端裝置收到Echo Request後,所回應Echo Reply的Sequence Number欄位值必須與收到的Echo Request相同,如此Identifier與Sequence Number兩個欄位合起來,可識別特定配對的Echo Request / Echo Reply。
Echo Request / Echo Reply(要求與回應) Optional Data:長度不定,由Echo Request來源端裝置的程式所決定,可記錄一些選擇性的資料。當目的端裝置收到Echo Request後,所回應Echo Reply的Optional Data欄位值必須與收到的Echo Request相同。Echo Request來源端收到Echo Reply後,會讀取Optional Data欄位值,確認此為配對的Echo Reply。
Destination Unreachable(無法到達目的) 在IP路由過程中,如果路由器無法將IP封包傳送出去,或是目的裝置無法處理收到的IP封包,路由器或目的裝置便會發出此類ICMP封包通知來源端錯誤訊息。 封包欄位
Destination Unreachable(無法到達目的) Code欄位值
Source Quench(降低來源端傳輸速度) 當路由器因為來往的IP封包太多以致於來不及處理時,或路由器內部用以暫時存放的緩衝區已滿載,容易使得來源端所傳送的封包資料發生遺失的情形,此時路由器便會發出此類的ICMP封包給來源端裝置,要求來源端降低資料封包的傳送速率,或甚至暫停傳送資料的動作,直到來源端不再接收到Source Quench訊息為止。 封包欄位
Redirect(重新導向) 當路由器發現主機所選的路徑並非最佳路徑或閘通道有所變更時,便會送出ICMP Redirect封包給來源端主機,提供路徑重新定向的相關資訊。 如上圖,當A要傳送資料給B時,假設最佳路徑是經由R1的路由器,若A誤將封包送至R2,則R2會發出Redirect的ICMP封包給A,使其重送。
Redirect(重新導向) 封包欄位 Code欄位值可從0至3: 0:因網路變動而更改傳輸路徑 1:因主機變動而更改傳輸路徑 2:因網路和服務類型的變動而更改傳輸路徑 3:因主機和服務類型的變動而更改傳輸路徑
Time Exceeded(逾時) 為了防止IP封包在不當的路由架構中永無止境地傳送,當路由器收到TTL值為1的IP封包時,會將此IP封包丟棄,並送出此類ICMP封包給來源裝置。 當IP封包在傳送過程中發生切割時,必須在目的裝置重組切割的IP Fragment,重組封包的過程中,若時間內未收到全部的IP Fragment,目的裝置也會發出此類的ICMP封包給來源裝置。
Time Exceeded(逾時) 封包欄位 Code欄位值: 0:TTL count exceeded 1:Fragment reassembly time exceeded Unused:長度為4 Bytes,未定義用途,欄位內容必須為0。
實驗方法 - PING 當架設好一個TCP / IP網路時,最常利用Ping這個命令來檢查網路是否連接成功,不過要注意的是有時為了安全起見,遠方機器或經過的某些網路節點會過濾該ICMP封包。 Ping回應的各個欄位所代表的意義分別如下: Reply From:是從何處得到的回應。 Bytes:是該次Ping執行的數據大小。 TTL:Round Trip時間(毫秒)生存期限(毫秒)。
利用Ping由近而遠來診斷網路問題 固定IP位址 ping 127.0.0.1 ping 本機IP位址 這個步驟在現今的網路技術下可省略,127.0.0.1即所謂的Loopback位址,目的位址為127.0.0.1的封包送至本機的Loopback Driver而不會送到網路上,所以主要是用來測試TCP / IP協定是否正常運作。 ping 本機IP位址 試本機網路裝置是否正常,若有問題,建議重裝網路驅動程式或更換網路硬體。
利用Ping由近而遠來診斷網路問題 ping 對外連線的路由器 ping 網際網路上電腦的 IP 位址 ping 網際網路上電腦的網址 筆者最喜歡ping 168.95.1.1,原因除了數字較簡單,而且為中華電信DNS,一般而言很難故障,若有問題,對外專線故障可向網管人員申訴。 ping 網際網路上電腦的網址 筆者最喜歡ping www.google.com.tw,沒有特別的原因只是「搜尋未來」,若有問題,代表DNS設定有誤或DNS當機。
利用Ping由近而遠來診斷網路問題 DHCP浮動IP位址 ifconfig /all ping 對外連線的路由器 如果出現IP位址169.254.xx.xx或0.0.0.0則是無法向DHCP伺服器取得IP位址,請檢查一下DHCP伺服器狀況或向網管人員申訴。 ping 對外連線的路由器 Ping預設閘道IP位址,若有問題,代表內部網路的網路線接觸不良或交換機故障。 ping 網際網路上電腦的 IP 位址 ping 網際網路上電腦的網址
ICMP ECHO封包問題 在正常情況下,我們使用Ping對網路進行診斷,會發出ICMP響應請求封包(ICMP ECHO),對方接收到ICMP ECHO後,回應一個ICMP ECHO Reply封包。但是這過程需要CPU處理,有的情況下可能會消耗掉大量的資源。 如果攻擊者向目標計算機發送大量的ICMP ECHO封包,Ping –t x.x.x.x(ICMP Flood),則目標計算機會忙於處理這些ECHO封包,而無法繼續處理其他的網路數據封包,這也是一種阻斷服務攻擊(DOS)。 所以有些機器會關閉ICMP ECHO,讓我們無法Ping到它。 另外也不要使用網路掃瞄工具去任意掃瞄別人的網路,網路掃瞄最簡單的作法是對網路IP位址逐一往下Ping,這會讓人以為你具有攻擊的意圖。
實驗方法 - TRACEROUTE 另一個ICMP程式,Traceroute也是我們通常用到的工具,在Winodws XP上,這個程式叫做Tracert,其執行結果如圖所示:
TRACEROUTE 最左邊一行分別是中繼點(Hop)數字,然後是三個Round Trip Time,最後是主機的名稱(如果有的話)和IP位址,通常Traceroute指令會從1開始遞增TTL,將ICMP命令送給下一個中繼點,當路由器偵測到TTL的逾期時間,則會向發送源寄出TIME_EXCEEDED的ICMP封包,而每一次回應都會送出三個UDP數據流(Datagrams),以讓你獲得更詳細的資訊。 透過如此遞進的查詢過程,查詢端就可以追蹤到連線所經過的中繼點,這樣的判斷過程在我們判斷封包的路由路線非常有用,不過必須還要注意的是,封包的路由在每次的傳遞過程中都有可能不一樣,而在某些多路由環境中查詢路由和回應路由也未必一致,而且在防火牆的保護下,有些ICMP封包會被攔截下來,這樣的話,Traceroute也就不能完整的顯示出封包的傳遞路徑了。
擷取ICMP封包(Echo request)
擷取ICMP封包(Echo request) 說明: Type = 8 (Echo Request) ,其十六進位為08; Code = 0 (Not Used (MBZ)) ,其十六進位為00; CheckSum = 0x032c(十六進位值); Indentified = 0x0200; Sequence Number = 62163,其十六進位為0xf2d3; Data : [64 bytes]
擷取ICMP封包(Echo reply)
擷取ICMP封包(Echo reply) 說明: Type = 0 (Echo Reply) ,其十六進位為00 ; Code = 0 (Not Used (MBZ)) ,其十六進位為00; CheckSum = 0x0b2c(十六進位值); Indentified = 0x0200; Sequence Number = 62163 ,其十六進位為0xf2d3; Data : [56 bytes];
Free IP scanner 使用的Free IP scanner掃瞄192.192.73.1~192.192.73.63上所有IP機器的使用情況,網路掃瞄即是對網路IP地址逐一往下PING,重申一下請勿隨意掃瞄他人網路,這會讓人以為你具有攻擊的意圖。
學習評量 除了echo Request 和Echo Reply查詢訊息外,請試著擷取不同的ICMP訊息。 哪一些指令支援ICMP? 說明網路可能發生錯誤的原因和解決的方案? 說明ICMP協定潛在的風險? 如何關閉作業系統的Echo Reply回應?