簡介
ICMP(Internet Control Message Protocol,網際報文控制協定)是Internet協定族的核心協定之一,它主要用來在網路計算機的作業系統中傳送出錯信息,比如,提示請求的服務不可用,或者主機或者路由不可達.
ICMP依靠IP協定來完成其任務,通常也是IP協定的一個集成部分.和傳輸層協定如TCP和UDP的目的不同,它一般並不用來在端系統之間來傳送數據.它通常不被用戶網路程式直接使用,例外的情況是像Ping和tracert這樣的診斷程式.
IPv4版本的ICMP也被稱作ICMPv4,IPv6中也有對應的版本IPv6.
什麼是ICMP協定
ICMP是“Internet Control Message Protocol”(Internet控制訊息協定)的縮寫。它是TCP/IP協定族的一個子協定,用於在IP主機、路由器之間傳遞控制訊息。控制訊息是指網路通不通、主機是否可達、路由是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起著重要的作用。
我們在網路中經常會使用到ICMP協定,只不過我們覺察不到而已。比如我們經常使用的用於檢查網路通不通的Ping命令,這個“Ping”的過程實際上就是ICMP協定工作的過程。還有其他的網路命令如跟蹤路由的TRACERT命令也是基於ICMP協定的。
ICMP協定格式
ICMP報文類型
ICMP報文大體可以分為兩種類型,即ICMP差錯報文和ICMP詢問報文。但細分又可分為很多類型,如表1所示。
ICMP回射請求和應答報文頭部格式
ICMP報文被封裝在IP數據報內部傳輸。如圖1所示,是ICMP回射請求和應答報文頭部格式。
各種ICMP報文的前32bits都一樣,它們是:
8bits類型和8bits代碼欄位:一起決定了ICMP報文的類型。常見的有:
類型8、代碼0:回射請求。
類型0、代碼0:回射應答。
類型11、代碼0:逾時。
16bits校驗和欄位:包括數據在內的整個icmp數據包的校驗和,其計算方法和IP頭部校驗和的計算方法是一樣的。
對於ICMP回射請求和應答報文來說,接下來是16bits標識符欄位:用於標識本ICMP進程。
最後是16bits序列號欄位:用於判斷回射應答數據報。
2.3 ICMP目標不可達報文
如圖2所示,是ICMP目標不可達報文頭部格式。
其中代碼欄位的不同值又代表不同的含義,如,0代表網路不可達、1代表主機不可達等,見表1。
2.4 ICMP逾時報文頭部格式
如圖3所示,是ICMP逾時報文頭部格式。
其中:
類型11+代碼0:表示傳輸期間生存時間為0。
類型11+代碼1:表示數據報組裝期間生存時間為0。
由於篇幅有限,這裡不再分析其他類型ICMP協定數據包的格式。
ICMP的重要性
ICMP協定對於網路安全具有極其重要的意義。ICMP協定本身的特點決定了它非常容易被用於攻擊網路上的路由器和主機。例如,在1999年8月海信集團“懸賞”50萬元人民幣測試防火牆的過程中,其防火牆遭受到的ICMP攻擊達334050次之多,占整個攻擊總數的90%以上!可見,ICMP的重要性絕不可以忽視!
比如,可以利用作業系統規定的ICMP數據包最大尺寸不超過64KB這一規定,向主機發起“Ping of Death”(死亡之Ping)攻擊。“Ping of Death” 攻擊的原理是:如果ICMP數據包的尺寸超過64KB上限時,主機就會出現記憶體分配錯誤,導致TCP/IP堆疊崩潰,致使主機當機。
此外,向目標主機長時間、連續、大量地傳送ICMP數據包,也會最終使系統癱瘓。大量的ICMP數據包會形成“ICMP風暴”,使得目標主機耗費大量的CPU資源處理,疲於奔命。
應對ICMP攻擊
雖然ICMP協定給黑客以可乘之機,但是ICMP攻擊也並非無藥可醫。只要在日常網路管理中未雨綢繆,提前做好準備,就可以有效地避免ICMP攻擊造成的損失。
對於“Ping of Death”攻擊,可以採取兩種方法進行防範:第一種方法是在路由器上對ICMP數據包進行頻寬限制,將ICMP占用的頻寬控制在一定的範圍內,這樣即使有ICMP攻擊,它所占用的頻寬也是非常有限的,對整個網路的影響非常少;第二種方法就是在主機上設定ICMP數據包的處理規則,最好是設定拒絕所有的ICMP數據包。
設定ICMP數據包處理規則的方法也有兩種,一種是在作業系統上設定包過濾,另一種是在主機上安裝防火牆。具體設定如下:
1.在Windows 2000 Server中設定ICMP過濾
Windows 2000 Server提供了“路由與遠程訪問”服務,但是默認情況下是沒有啟動的,因此首先要啟動它:點擊“管理工具”中的“路由與遠程訪問”,啟動設定嚮導。在其中選擇“手動配置伺服器”項,點擊【下一步】按鈕。稍等片刻後,系統會提示“路由和遠程訪問服務現在已被安裝。要開始服務嗎?”,點擊【是】按鈕啟動服務。
服務啟動後,在計算機名稱的分支下會出現一個“IP路由選擇”,點擊它展開分支,再點擊“常規”,會在右邊出現伺服器中的網路連線(即網卡)。用滑鼠右鍵點擊你要配置的網路連線,在彈出的選單中點擊“屬性”,會彈出一個網路連線屬性的視窗,如圖1所示。
圖1
圖1中有兩個按鈕,一個是“輸入篩選器”(指對此伺服器接受的數據包進行篩選),另一個是“輸出篩選器”(指對此伺服器傳送的數據包進行篩選),這裡應該點擊【輸入篩選器】 按鈕,會彈出一個“添加篩選器”視窗,再點擊【添加】按鈕,表示要增加一個篩選條件。
在“協定”右邊的下拉列表中選擇“ICMP”,在隨後出現的“ICMP類型”和“ICMP編碼”中均輸入“255”,代表所有的ICMP類型及其編碼。ICMP有許多不同的類型(Ping就是一種類型),每種類型也有許多不同的狀態,用不同的“編碼”來表示。因為其類型和編碼很複雜,這裡不再敘述。
點擊【確定】按鈕返回“輸入篩選器”視窗,此時會發現“篩選器”列表中多了一項內容(如圖2所示)。點擊【確定】按鈕返回“本地連線”視窗,再點擊【確定】按鈕,此時篩選器就生效了,從其他計算機上Ping這台主機就不會成功了。
圖2
2. 用防火牆設定ICMP過濾
現在許多防火牆在默認情況下都啟用了ICMP過濾的功能。如果沒有啟用,只要選中“防禦ICMP攻擊”、“防止別人用ping命令探測”就可以了,如圖3所示。
圖3
通過以上講解,你現在知道ICMP的重要性了吧?趕緊給你的伺服器設定ICMP過濾吧。