網際網路控制訊息協定

網際網路控制訊息協定

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資源處理,疲於奔命。

技術細節

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"訊息來實現的。

校驗算法

以下代碼在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報頭的可選部分)。
Bits160-167168-175176-183184-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訊息類型都應該被阻止。

詳細分析

下面是針對每個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):
禁止其入站和出站。通過使用一個能夠進行數據包一致性檢查的防火牆,錯誤和惡意的數據包都會被阻塞。

相關詞條

熱門詞條

聯絡我們