定義 ICMP協定是一種面向無連線的協定,用於傳輸出錯報告控制信息。它是一個非常重要的協定,它對於
網路安全 具有極其重要的意義。
它是
TCP/IP協定 族的一個子協定,屬於
網路層協定 ,主要用於在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據無法訪問目標、IP
路由器 無法按當前的傳輸速率轉發
數據包 等情況時,會自動傳送ICMP訊息。ICMP報文在IP幀結構的首部協定類型欄位(Protocol 8bit)的值=1.
如下圖所示,ICMP包有一個8位元組長的包頭,其中前4個位元組是固定的格式,包含8位類型欄位,8位代碼欄位和16位的校驗和;後4個位元組根據ICMP包的類型而取不同的值。
ICMP報文格式 ICMP提供一致易懂的出錯報告信息。傳送的出錯
報文 返回到傳送原數據的設備,因為只有傳送設備才是出錯報文的邏輯接受者。傳送設備隨後可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由傳送方完成。
ICMP原理 我們在網路中經常會使用到ICMP協定,比如我們經常使用的用於檢查網路通不通的
Ping 命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協定工作的過程。還有其他的
網路命令 如
跟蹤路由 的Tracert命令也是基於ICMP協定的。
協定內容 ICMP的全稱是 Internet Control Message Protocol 。從技術角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網路的連線狀況﹐也能確保連線的準確性﹐其功能主要有:
ICMP常用類型 · 偵測遠端主機是否存在。
· 建立及維護路由資料。
· 資料
流量控制 。ICMP在溝通之中,主要是透過不同的
類別 (Type)與
代碼 (Code) 讓機器來識別不同的連線狀況。常用的
類別 如下表所列﹕
ICMP 是個非常有用的協定﹐尤其是當我們要對網路連線狀況進行判斷的時候。
重要性 ICMP協定對於
網路安全 具有極其重要的意義。ICMP協定本身的特點決定了它非常容易被用於攻擊網路上的
路由器 和
主機 。例如,在1999年8月
海信集團 “懸賞”50萬元人民幣測試防火牆的過程中,其防火牆遭受到的ICMP攻擊達334050次之多,占整個攻擊總數的90%以上!可見,ICMP的重要性絕不可以忽視!
ICMP常用類型 比如,可以利用
作業系統 規定的ICMP數據包最大尺寸不超過64
KB 這一規定,向
主機 發起“Ping of Death”(
死亡之Ping )攻擊。“Ping of Death” 攻擊的原理是:如果ICMP數據包的尺寸超過64KB上限時,
主機 就會出現
記憶體分配 錯誤,導致TCP/IP
堆疊 崩潰,致使主機當機。(
作業系統 已經取消了傳送ICMP數據包的大小的限制,解決了這個漏洞)
此外,向目標
主機 長時間、連續、大量地傳送ICMP數據包,也會最終使系統癱瘓。大量的ICMP數據包會形成“ICMP風暴”,使得目標
主機 耗費大量的CPU資源處理,疲於奔命。
校驗算法 以下
代碼 在Visual Studio 2008 + Windows 7下調試通過。
lpsz指定要計算的數據包首地址,_dwSize指定該數據包的長度。
int CalcCheckSum(char* lpsz,DWORD _dwSize)
{
int dwSize;
__asm // 嵌入彙編
{
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 //校驗數據是否是奇數位的
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;
}
抵禦攻擊 雖然ICMP協定給
黑客 以可乘之機,但是ICMP攻擊也並非無藥可醫。只要在日常
網路管理 中未雨綢繆,提前做好準備,就可以有效地避免ICMP攻擊造成的損失。
對於“Ping of Death”攻擊,可以採取兩種方法進行防範:第一種方法是在
路由器 上對ICMP
數據包 進行
頻寬 限制,將ICMP占用的頻寬控制在一定的範圍內,這樣即使有ICMP攻擊,它所占用的頻寬也是非常有限的,對整個網路的影響非常少;第二種方法就是在
主機 上設定ICMP數據包的處理規則,最好是設定拒絕所有的ICMP數據包。
1.在Windows 2000 Server中設定ICMP過濾
服務啟動後,在
計算機 名稱的分支下會出現一個“IP
路由選擇 ”,點擊它展開分支,再點擊“常規”,會在右邊出現伺服器中的網路連線(即
網卡 )。用
滑鼠 右鍵點擊你要配置的網路連線,在彈出的選單中點擊“屬性”,會彈出一個網路連線屬性的視窗,如圖1所示。
圖1
圖1中有兩個按鈕,一個是“輸入篩選器”(指對此伺服器接受的
數據包 進行篩選),另一個是“輸出篩選器”(指對此伺服器傳送的數據包進行篩選),這裡應該點擊[輸入篩選器] 按鈕,會彈出一個“添加篩選器”視窗,再點擊[添加]按鈕,表示要增加一個篩選條件。
在“協定”右邊的下拉列表中選擇“ICMP”,在隨後出現的“ICMP類型”和“ICMP編碼”中均輸入“255”,代表所有的ICMP類型及其編碼。ICMP有許多不同的類型(Ping就是一種類型),每種類型也有許多不同的狀態,用不同的“編碼”來表示。因為其類型和編碼很複雜,這裡不再敘述。
圖2 點擊[確定]按鈕返回“輸入篩選器”視窗,此時會發現“篩選器”列表中多了一項內容(如圖2所示)。點擊[確定]按鈕返回“
本地連線 ”視窗,再點擊[確定]按鈕,此時篩選器就生效了,從其他
計算機 上Ping這台
主機 就不會成功了。
2. 用防火牆設定ICMP過濾 圖3 許多
防火牆 在默認情況下都啟用了ICMP過濾的功能。如果沒有啟用,只要選中“防禦ICMP攻擊”、“防止別人用
ping命令 探測 ”就可以了,如圖3所示。
防禦方法 選擇合適的防火牆
有效防止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類型 這是一個完整的ICMP類型的列表:Table C-1. ICMP類型
TYPE CODE Description Query Error 0
0
Echo Reply——回顯應答(Ping應答)
x
3
0
Network Unreachable——網路不可達
x
3
1
Host Unreachable——主機不可達
x
3
2
Protocol Unreachable——協定不可達
x
3
3
Port Unreachable——連線埠不可達
x
3
4
Fragmentation needed but no frag. bit set——需要進行分片但設定不分片比特
x
3
5
Source routing failed——源站選路失敗
x
3
6
Destination network unknown——目的網路未知
x
3
7
Destination host unknown——目的主機未知
x
3
8
Source host isolated (obsolete)——源主機被隔離(作廢不用)
x
3
9
Destination network administratively prohibited——目的網路被強制禁止
x
3
10
Destination host administratively prohibited——目的主機被強制禁止
x
3
11
Network unreachable for TOS——由於服務類型TOS,網路不可達
x
3
12
Host unreachable for TOS——由於服務類型TOS,主機不可達
x
3
13
Communication administratively prohibited by filtering——由於過濾,通信被強制禁止
x
3
14
Host precedence violation——主機越權
x
3
15
Precedence cutoff in effect——優先中止生效
x
4
0
Source quench——源端被關閉(基本流控制)
5
0
Redirect for network——對網路重定向
5
1
Redirect for host——對主機重定向
5
2
Redirect for TOS and network——對服務類型和網路重定向
5
3
Redirect for TOS and host——對服務類型和主機重定向
8
0
Echo request——回顯請求(Ping請求)
x
9
0
Router advertisement——路由器通告
10
0
Route solicitation——路由器請求
11
0
TTL equals 0 during transit——傳輸期間生存時間為0
x
11
1
TTL equals 0 during reassembly——在數據報組裝期間生存時間為0
x
12
0
IP header bad (catchall error)——壞的IP首部(包括各種差錯)
x
12
1
Required options missing——缺少必需的選項
x
13
0
Timestamp request (obsolete)——時間戳請求(作廢不用)
x
14
Timestamp reply (obsolete)——時間戳應答(作廢不用)
x
15
0
Information request (obsolete)——信息請求(作廢不用)
x
16
0
Information reply (obsolete)——信息應答(作廢不用)
x
17
0
Address mask request——地址掩碼請求
x
18
0
Address mask reply——地址掩碼應答