百科名片
ICMP是(Internet Control Message Protocol)Internet控制報文協(xié)議。它是TCP/IP協(xié)議族的一個子協(xié)議,用于在IP主機、路由器之間傳遞控制消息??刂葡⑹侵妇W(wǎng)絡(luò)通不通、主機是否可達(dá)、路由是否可用等網(wǎng)絡(luò)本身的消息。這些控制消息雖然并不傳輸用戶數(shù)據(jù),但是對于用戶數(shù)據(jù)的傳遞起著重要的作用。
編輯本段基本簡介
ICMP協(xié)議是一種面向連接的協(xié)議,用于傳輸出錯報告控制信息。它是一個非常重要的協(xié)議,它對于
網(wǎng)絡(luò)安全具有極其重要的意義。
它是
TCP/IP協(xié)議族的一個子協(xié)議,屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態(tài)信息等。當(dāng)遇到IP數(shù)據(jù)無法訪問目標(biāo)、IP路由器無法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時,會自動發(fā)送ICMP消息。
ICMP原理
ICMP提供一致易懂的出錯報告信息。發(fā)送的出錯報文返回到發(fā)送原數(shù)據(jù)的設(shè)備,因為只有發(fā)送設(shè)備才是出錯報文的邏輯接受者。發(fā)送設(shè)備隨后可根據(jù)ICMP報文確定發(fā)生錯誤的類型,并確定如何才能更好地重發(fā)失敗的數(shù)據(jù)報。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務(wù)由發(fā)送方完成。
我們在網(wǎng)絡(luò)中經(jīng)常會使用到ICMP協(xié)議,比如我們經(jīng)常使用的用于檢查網(wǎng)絡(luò)通不通的
Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協(xié)議工作的過程。還有其他的網(wǎng)絡(luò)命令如
跟蹤路由的Tracert命令也是基于ICMP協(xié)議的。
編輯本段ICMP 協(xié)定內(nèi)容
ICMP的全稱是 Internet Control Message Protocol 。從技術(shù)角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網(wǎng)路的連線狀況﹐也能確保連線的準(zhǔn)確性﹐其功能主要有:
· 偵測遠(yuǎn)端主機是否存在。
· 建立及維護(hù)路由資料。
· 重導(dǎo)資料傳送路徑。
· 資料流量控制。
ICMP常用類型
ICMP常用類型
ICMP在溝通之中,主要是透過不同的
類別(Type)與
代碼(Code) 讓機器來識別不同的連線狀況。常用的類別如下表所列﹕
ICMP 是個非常有用的協(xié)定﹐尤其是當(dāng)我們要對網(wǎng)路連接狀況進(jìn)行判斷的時候。下面讓我們看看常用的 ICMP 實例,以更好了解 ICMP 的功能與作用。
編輯本段ICMP的重要性
ICMP協(xié)議對于網(wǎng)絡(luò)安全具有極其重要的意義。ICMP協(xié)議本身的特點決定了它非常容易被用于攻擊網(wǎng)絡(luò)上的
路由器和
主機。例如,在1999年8月
海信集團“懸賞”50萬元人民幣測試
防火墻的過程中,其防火墻遭受到的ICMP攻擊達(dá)334050次之多,占整個攻擊總數(shù)的90%以上!可見,ICMP的重要性絕不可以忽視!
比如,可以利用
操作系統(tǒng)規(guī)定的ICMP數(shù)據(jù)包最大尺寸不超過64
KB這一規(guī)定,向主機發(fā)起“Ping of Death”(
死亡之Ping)攻擊。“Ping of Death” 攻擊的原理是:如果ICMP數(shù)據(jù)包的尺寸超過64KB上限時,主機就會出現(xiàn)內(nèi)存分配錯誤,導(dǎo)致TCP/IP堆棧崩潰,致使主機死機。(現(xiàn)在的操作系統(tǒng)已經(jīng)取消了發(fā)送ICMP數(shù)據(jù)包的大小的限制,解決了這個漏洞)
此外,向目標(biāo)主機長時間、連續(xù)、大量地發(fā)送ICMP數(shù)據(jù)包,也會最終使系統(tǒng)癱瘓。大量的ICMP數(shù)據(jù)包會形成“ICMP風(fēng)暴”,使得目標(biāo)主機耗費大量的CPU資源處理,疲于奔命。
編輯本段ICMP校驗和算法
以下代碼在Visual Studio 2008 + Windows 7下調(diào)試通過。
lpsz指定要計算的數(shù)據(jù)包首地址,_dwSize指定該數(shù)據(jù)包的長度。
int CalcCheckSum(char* lpsz,DWORD _dwSize)
{
int dwSize;
__asm // 嵌入?yún)R編
{
mov ecx,_dwSize
shr ecx,1
xor ebx,ebx
mov esi,lpsz
read: //所有word相加,保存至EBX寄存器
lodsw
movzx eax,ax
add ebx,eax
loop read
test _dwSize,1 //校驗數(shù)據(jù)是否是奇數(shù)位的
jz calc
lodsb
movzx eax,al
add ebx,eax
calc:
mov eax,ebx //高低位相加
and eax,0ffffh
shr ebx,16
add eax,ebx
not ax
mov dwSize,eax
}
return dwSize;
}
編輯本段應(yīng)對ICMP攻擊
雖然ICMP協(xié)議給
黑客以可乘之機,但是ICMP攻擊也并非無藥可醫(yī)。只要在日常網(wǎng)絡(luò)管理中未雨綢繆,提前做好準(zhǔn)備,就可以有效地避免ICMP攻擊造成的損失。
對于“Ping of Death”攻擊,可以采取兩種方法進(jìn)行防范:第一種方法是在路由器上對ICMP數(shù)據(jù)包進(jìn)行帶寬限制,將ICMP占用的帶寬控制在一定的范圍內(nèi),這樣即使有ICMP攻擊,它所占用的帶寬也是非常有限的,對整個網(wǎng)絡(luò)的影響非常少;第二種方法就是在主機上設(shè)置ICMP數(shù)據(jù)包的處理規(guī)則,最好是設(shè)定拒絕所有的ICMP數(shù)據(jù)包。
設(shè)置ICMP數(shù)據(jù)包處理規(guī)則的方法也有兩種,一種是在操作系統(tǒng)上設(shè)置包過濾,另一種是在主機上安裝防火墻。具體設(shè)置如下:1.在Windows 2000 Server中設(shè)置ICMP過濾
Windows 2000 Server提供了“路由與遠(yuǎn)程訪問”服務(wù),但是默認(rèn)情況下是沒有啟動的,因此首先要啟動它:點擊“管理工具”中的“路由與遠(yuǎn)程訪問”,啟動設(shè)置向?qū)?。在其中選擇“手動配置服務(wù)器”項,點擊[下一步]按鈕。稍等片刻后,系統(tǒng)會提示“路由和遠(yuǎn)程訪問服務(wù)現(xiàn)在已被安裝。要開始服務(wù)嗎?”,點擊[是]按鈕啟動服務(wù)。
圖1
服務(wù)啟動后,在計算機名稱的分支下會出現(xiàn)一個“IP路由選擇”,點擊它展開分支,再點擊“常規(guī)”,會在右邊出現(xiàn)服務(wù)器中的網(wǎng)絡(luò)連接(即
網(wǎng)卡)。用
鼠標(biāo)右鍵點擊你要配置的網(wǎng)絡(luò)連接,在彈出的菜單中點擊“屬性”,會彈出一個網(wǎng)絡(luò)連接屬性的窗口,如圖1所示。
圖1中有兩個按鈕,一個是“輸入篩選器”(指對此服務(wù)器接受的數(shù)據(jù)包進(jìn)行篩選),另一個是“輸出篩選器”(指對此服務(wù)器發(fā)送的數(shù)據(jù)包進(jìn)行篩選),這里應(yīng)該點擊[輸入篩選器] 按鈕,會彈出一個“添加篩選器”窗口,再點擊[添加]按鈕,表示要增加一個篩選條件。
在“協(xié)議”右邊的下拉列表中選擇“ICMP”,在隨后出現(xiàn)的“ICMP類型”和“ICMP編碼”中均輸入“255”,代表所有
圖2
的ICMP類型及其編碼。ICMP有許多不同的類型(Ping就是一種類型),每種類型也有許多不同的狀態(tài),用不同的“編碼”來表示。因為其類型和編碼很復(fù)雜,這里不再敘述。
點擊[確定]按鈕返回“輸入篩選器”窗口,此時會發(fā)現(xiàn)“篩選器”列表中多了一項內(nèi)容(如圖2所示)。點擊[確定]按鈕返回“本地連接”窗口,再點擊[確定]按鈕,此時篩選器就生效了,從其他計算機上Ping這臺主機就不會成功了
圖3
。2. 用防火墻設(shè)置ICMP過濾
現(xiàn)在許多防火墻在默認(rèn)情況下都啟用了ICMP過濾的功能。如果沒有啟用,只要選中“防御ICMP攻擊”、“防止別人用ping命令探測”就可以了,如圖3所示。
編輯本段防御基于ICMP的網(wǎng)絡(luò)攻擊的方法
選擇合適的防火墻
有效防止ICMP攻擊,防火墻應(yīng)該具有狀態(tài)檢測、細(xì)致的數(shù)據(jù)包完整性檢查和很好的過濾規(guī)則控制功能。
狀態(tài)檢測防火墻通過跟蹤它的連接狀態(tài),動態(tài)允許外出數(shù)據(jù)包的響應(yīng)信息進(jìn)入防火墻所保護(hù)的網(wǎng)絡(luò)。例如,狀態(tài)檢測防火墻可以記錄一個出去的 PING(ICMP Echo Request),在接下來的一個確定的時間段內(nèi),允許目標(biāo)主機響應(yīng)的ICMP Echo Reply直接發(fā)送給前面發(fā)出了
PING命令的IP,除此之外的其他ICMP Echo Reply消息都會被防火墻阻止。與此形成對比的是,包過濾類型的防火墻允許所有的ICMP Echo Reply消息進(jìn)入防火墻所保護(hù)的網(wǎng)絡(luò)了。許多路由器和基于Linux內(nèi)核2.2或以前版本的
防火墻系統(tǒng),都屬于包過濾型,用戶應(yīng)該避免選擇這些系統(tǒng)。
新的攻擊不斷出現(xiàn),防火墻僅僅能夠防止已知攻擊是遠(yuǎn)遠(yuǎn)不夠的。通過對所有數(shù)據(jù)包進(jìn)行細(xì)致分析,刪除非法的數(shù)據(jù)包,防火墻可以防止已知和未知的 DoS攻擊。這就要求防火墻能夠進(jìn)行數(shù)據(jù)包一致性檢查。安全策略需要針對ICMP進(jìn)行細(xì)致的控制。因此防火墻應(yīng)該允許對ICMP類型、代碼和包大小進(jìn)行過濾,并且能夠控制連接時間和ICMP包的生成速率。配置防火墻以預(yù)防攻擊
一旦選擇了合適的防火墻,用戶應(yīng)該配置一個合理的安全策略。以下是被普遍認(rèn)可的防火墻安全配置慣例,可供管理員在系統(tǒng)安全性和易用性之間作出權(quán)衡。
防火墻應(yīng)該強制執(zhí)行一個缺省的拒絕策略。除了出站的ICMP Echo Request、出站的ICMP Source Quench、進(jìn)站的TTL Exceeded和進(jìn)站的ICMP Destination Unreachable之外,所有的ICMP消息類型都應(yīng)該被阻止。
編輯本段詳細(xì)分析
下面是針對每個ICMP消息類型的過濾規(guī)則的詳細(xì)分析。Echo Request和Reply(類型8和0):
允許Echo Request消息出站以便于內(nèi)部用戶能夠PING一個遠(yuǎn)程主機。阻止入站Echo Request和出站Echo Reply可以防止外部網(wǎng)絡(luò)的主機對內(nèi)部網(wǎng)絡(luò)進(jìn)行掃描。如果您使用了位于外部網(wǎng)絡(luò)的監(jiān)視器來監(jiān)視內(nèi)部網(wǎng)絡(luò),就應(yīng)該只允許來自于特定外部IP的Echo Request進(jìn)入您的網(wǎng)絡(luò)。限制ICMP Echo包的大小可以防止“Ping Floods”攻擊,并且可以阻止那些利用Echo Request和Reply來“偷運”數(shù)據(jù)通過防火墻的木馬程序。Destination unreachable (類型3):
允許其入站以便于內(nèi)部網(wǎng)用戶可以使用traceroute。需要注意的是,有些攻擊者可以使用它來進(jìn)行針對會話的DoS攻擊,如果您曾經(jīng)歷過類似的攻擊,也可以阻止它。阻止出站的ICMP Destination unreachable消息,因為它可能會泄漏內(nèi)部網(wǎng)絡(luò)的結(jié)構(gòu)。不過有一個例外,對于那些允許外部網(wǎng)絡(luò)通過TCP訪問的內(nèi)部主機(如位于DMZ區(qū)的Web 服務(wù)器)發(fā)出的Destination unreachable,則應(yīng)該允許它通過。為了能夠支持“Path MTU Discovery”,您應(yīng)該允許出站的“Packet Too Big”消息(類型3,代碼4)到達(dá)那些主機。Source quench(類型4):
阻止其入站,因為它可以作為一種DoS攻擊,能夠降低發(fā)送者的發(fā)送速度。允許其出站以便于內(nèi)部主機能夠控制發(fā)送端發(fā)送數(shù)據(jù)的速度。有些防火墻會忽略所有直接發(fā)送到防火墻端口的Source Quench消息,以防止針對于防火墻的DoS攻擊。Redirect(類型5,9,10):
Redirect、Router announcement、 Router selection(類型5,9,10):這些消息都存在潛在危險,因為它們可以用來把數(shù)據(jù)重定向到攻擊者的機器。這些消息都應(yīng)該被阻止。TTL exceeded(類型11):
允許其進(jìn)站以便于內(nèi)部用戶可以使用traceroute。“firewalking”使用很低的
TTL值來對網(wǎng)絡(luò)進(jìn)行掃描,甚至可以通過防火墻對內(nèi)網(wǎng)進(jìn)行掃描,所以應(yīng)該禁止其出站。一些防火墻可以阻止TTL值小于設(shè)定值的數(shù)據(jù)包進(jìn)入防火墻。Parameter problem(類型12):
禁止其入站和出站。通過使用一個能夠進(jìn)行數(shù)據(jù)包一致性檢查的防火墻,錯誤和惡意的數(shù)據(jù)包都會被阻塞。