複製鏈接
請複製以下鏈接發送給好友

因特網控制消息協議

鎖定
ICMP是“InternetControlMessageProtocol”(因特網控制消息協議)的縮寫。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用户數據,但是對於用户數據的傳遞起着重要的作用。
中文名稱
因特網控制消息協議
英文名稱
Internet control message protocol;ICMP
定  義
TCP/IP協議中專門設計的用於控制差錯和傳輸報文的協議。
應用學科
通信科技(一級學科),通信協議(二級學科)
中文名
因特網控制消息協議
外文名
Internet Control Message Protocol
作    用
在主機與路由器之間傳遞控制信息
協議族
TCP/IP協議族

因特網控制消息協議簡介

ICMP協議是一種面向連接的協議,用於傳輸出錯報告控制信息。它是一個非常重要的協議,它對於網絡安全具有極其重要的意義。
它是TCP/IP協議族的一個子協議,屬於網絡層協議,主要用於在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據無法訪問目標、IP路由器無法按當前的傳輸速率轉發數據包等情況時,會自動發送ICMP消息。
ICMP提供一致易懂的出錯報告信息。發送的出錯報文返回到發送原數據的設備,因為只有發送設備才是出錯報文的邏輯接受者。發送設備隨後可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由發送方完成。
我們在網絡中經常會使用到ICMP協議,比如我們經常使用的用於檢查網絡通不通的Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協議工作的過程。還有其他的網絡命令跟蹤路由Tracert命令也是基於ICMP協議的。

因特網控制消息協議協議內容

ICMP的全稱是InternetControl Message Protocol 。從技術角度來説,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網路的連線狀況﹐也能確保連線的準確性﹐其功能主要有:
· 偵測遠端主機是否存在。
· 建立及維護路由資料。
· 重導資料傳送路徑。
· 資料流量控制
ICMP在溝通之中,主要是透過不同的類別(Type)與代碼(Code) 讓機器來識別不同的連線狀況。常用的類別如下表所列﹕ ICMP 是個非常有用的協議﹐尤其是當我們要對網路連接狀況進行判斷的時候。下面讓我們看看常用的 ICMP 實例,以更好了解 ICMP 的功能與作用。

因特網控制消息協議重要性

Internet 控制信息協議(ICMP)是 IP 組的一個整合部分。通過 IP 包傳送的 ICMP 信息主要用於涉及網絡操作或錯誤操作的不可達信息。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資源處理,疲於奔命。 [1] 

因特網控制消息協議技術細節

ICMP消息是在IP層,通常是從一個普通的產生了ICMP響應的IP數據報中生成的。IP把適當的ICMP消息用一個新的檔頭(header)封裝起來(以把ICMP消息送回原來的發送者),然後把產生的數據報用常規的方式傳送回去。
例如,每台轉發IP數據報的機器(例如途中的路由器)都要把IP報頭中的TTL(time tolive)減1,如果TTL減為了0,一個ICMP超時消息就會被髮送到數據報的源發送者。
每個ICMP消息都是直接封裝在一個IP數據報中的,因此,和UDP一樣,ICMP是不可靠的。
雖然ICMP是包含在IP數據報中的,但是對ICMP消息通常會特殊處理,會和一般IP數據報的處理不同,而不是作為IP的一個子協議來處理。在很多時候,需要去查看ICMP消息的內容,然後發送適當的錯誤消息到那個原來產生IP數據包的程序,即那個被提示一個ICMP消息的程序。
很多常用的工具是基於ICMP消息的。traceroute是通過發送包含有特殊的TTL的包,然後查找ICMP超時消息和目標不可達消息來實現的。和traceroute相關的ping則是用ICMP的"Echo request"和"Echo reply"消息來實現的。 [2] 

因特網控制消息協議校驗算法

以下代碼在Visual Studio 2008 + Windows 7下調試通過。
lpsz指定要計算的數據包首地址,_dwSize指定該數據包的長度。
int CalcCheckSum(char* lpsz,DWORD _dwSize)
{
int dwSize;
__asm // 嵌入彙編
{
mov ecx,_dwSize
shr ecx,1
xorebx,ebx
movesi,lpsz
read: //所有word相加,保存至EBX寄存器
lodsw
movzxeax,ax
addebx,eax
loop read
test_dwSize,1 //校驗數據是否是奇數位的
jzcalc
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;
}
ICMP部分的結構
報頭
ICMP報頭從IP報頭的第160位開始(除非使用了IP報頭的可選部分)。
Bits
160-167
168-175
176-183
184-191
160
Type
Code
較驗碼(checksum)
192
ID
序號(sequence)
Type- ICMP的類型;
Code- 進一步劃分ICMP的類型;例如,ICMP的目標不可達類型可以把這個位設為1至15等來表示不同的意思。
Checksum- 這個字段包含有從ICMP報頭和數據部分計算得來的,用於檢查錯誤的數據,withvalue0 for thisfield.
ID- 這個字段包含了ID值,在ECHO REPLY類型的消息中要返回這個字段。
Sequence- 這個字段包含一個序號,同樣要在ECHO REPLY類型的消息中要返回這個字段。
填充數據
填充的數據緊接在ICMP報頭的後面(以8位為一組):
Linux的 "ping"工具填充的ICMP除了8個8位元組的報頭以外,還另外填充數據使得總大小為64字節。
Windows的"ping.exe" 填充的ICMP除了8個8位元組的報頭以外,還另外填充數據使得總大小為40字節
基本簡介 ICMP協議是一種面向無連接的協議,用於傳輸出錯報告控制信息。它是一個非常重要的協議,它對於網絡安全具有極其重要的意義。
它是TCP/IP協議族的一個子協議,屬於網絡層協議,主要用於在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據無法訪問目標、IP路由器無法按當前的傳輸速率轉發數據包等情況時,會自動發送ICMP消息。
ICMP提供一致易懂的出錯報告信息。發送的出錯報文返回到發送原數據的設備,因為只有發送設備才是出錯報文的邏輯接受者。發送設備隨後可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由發送方完成。
我們在網絡中經常會使用到ICMP協議,比如我們經常使用的用於檢查網絡通不通的Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協議工作的過程。還有其他的網絡命令跟蹤路由Tracert命令也是基於ICMP協議的。

因特網控制消息協議防禦方法

選擇合適的防火牆
有效防止ICMP攻擊,防火牆應該具有狀態檢測、細緻的數據包完整性檢查和很好的過濾規則控制功能。
狀態檢測防火牆通過跟蹤它的連接狀態,動態允許外出數據包的響應信息進入防火牆所保護的網絡。例如,狀態檢測防火牆可以記錄一個出去的 PING(ICMP Echo Request),在接下來的一個確定的時間段內,允許目標主機響應的ICMP Echo Reply直接發送給前面發出了PING命令的IP,除此之外的其他ICMP Echo Reply消息都會被防火牆阻止。與此形成對比的是,包過濾類型的防火牆允許所有的ICMP Echo Reply消息進入防火牆所保護的網絡了。許多路由器和基於Linux內核2.2或以前版本的防火牆系統,都屬於包過濾型,用户應該避免選擇這些系統。
新的攻擊不斷出現,防火牆僅僅能夠防止已知攻擊是遠遠不夠的。通過對所有數據包進行細緻分析,刪除非法的數據包,防火牆可以防止已知和未知的DoS攻擊。這就要求防火牆能夠進行數據包一致性檢查安全策略需要針對ICMP進行細緻的控制。因此防火牆應該允許對ICMP類型、代碼和包大小進行過濾,並且能夠控制連接時間和ICMP包的生成速率。
配置防火牆以預防攻擊
一旦選擇了合適的防火牆,用户應該配置一個合理的安全策略。以下是被普遍認可的防火牆安全配置慣例,可供管理員在系統安全性和易用性之間作出權衡。
防火牆應該強制執行一個缺省的拒絕策略。除了出站的ICMP Echo Request、出站的ICMP Source Quench、進站的TTL Exceeded和進站的ICMP Destination Unreachable之外,所有的ICMP消息類型都應該被阻止。 [3] 

因特網控制消息協議詳細分析

下面是針對每個ICMP消息類型的過濾規則的詳細分析。
Echo Request和Reply(類型8和0):
允許Echo Request消息出站以便於內部用户能夠PING一個遠程主機。阻止入站Echo Request和出站Echo Reply可以防止外部網絡的主機對內部網絡進行掃描。如果您使用了位於外部網絡的監視器來監視內部網絡,就應該只允許來自於特定外部IP的Echo Request進入您的網絡。限制ICMP Echo包的大小可以防止“Ping Floods”攻擊,並且可以阻止那些利用Echo Request和Reply來“偷運”數據通過防火牆的木馬程序
Destination unreachable (類型3):
允許其入站以便於內部網用户可以使用traceroute。需要注意的是,有些攻擊者可以使用它來進行針對會話的DoS攻擊,如果您曾經歷過類似的攻擊,也可以阻止它。阻止出站的ICMP Destination unreachable消息,因為它可能會泄漏內部網絡的結構。不過有一個例外,對於那些允許外部網絡通過TCP訪問的內部主機(如位於DMZ區的Web 服務器)發出的Destination unreachable,則應該允許它通過。為了能夠支持“Path MTU Discovery”,您應該允許出站的“Packet Too Big”消息(類型3,代碼4)到達那些主機。
Source quench(類型4):
阻止其入站,因為它可以作為一種DoS攻擊,能夠降低發送者的發送速度。允許其出站以便於內部主機能夠控制發送端發送數據的速度。有些防火牆會忽略所有直接發送到防火牆端口的Source Quench消息,以防止針對於防火牆的DoS攻擊。
Redirect(類型5,9,10):
Redirect、Router announcement、 Router selection(類型5,9,10):這些消息都存在潛在危險,因為它們可以用來把數據重定向到攻擊者的機器。這些消息都應該被阻止。
TTL exceeded(類型11):
允許其進站以便於內部用户可以使用traceroute。“firewalking”使用很低的TTL值來對網絡進行掃描,甚至可以通過防火牆對內網進行掃描,所以應該禁止其出站。一些防火牆可以阻止TTL值小於設定值的數據包進入防火牆。
Parameter problem(類型12):
禁止其入站和出站。通過使用一個能夠進行數據包一致性檢查的防火牆,錯誤和惡意的數據包都會被阻塞。
參考資料