ICMP - 是TCP/IP協(xié)議簇的子協(xié)議
ICMP(Internet?Control?Message?Protocol)Internet控制報文協(xié)議。它是TCP/IP協(xié)議集中的一個子協(xié)議,屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態(tài)信息等。當遇到IP數(shù)據(jù)無法訪問目標、IP路由器無法按當前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時,會自動發(fā)送ICMP消息。從技術(shù)角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網(wǎng)路的連線狀況﹐也能確保連線的準確性。

簡介
ICMP協(xié)議是一種面向無連接的協(xié)議,用于傳輸出錯報告控制信息。它是一個非常重要的協(xié)議,它對于網(wǎng)絡(luò)安全具有極其重要的意義。它屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態(tài)信息等。當遇到IP數(shù)據(jù)無法訪問目標、IP路由器無法按當前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時,會自動發(fā)送ICMP消息。
ICMP是TCP/IP模型中網(wǎng)絡(luò)層的重要成員,與IP協(xié)議、ARP協(xié)議、RARP協(xié)議及IGMP協(xié)議共同構(gòu)成TCP/IP模型中的網(wǎng)絡(luò)層。ping和tracert是兩個常用網(wǎng)絡(luò)管理命令,ping用來測試網(wǎng)絡(luò)可達性,tracert用來顯示到達目的主機的路徑。ping和tracert都利用ICMP協(xié)議來實現(xiàn)網(wǎng)絡(luò)功能,它們是把網(wǎng)絡(luò)協(xié)議應(yīng)用到日常網(wǎng)絡(luò)管理的典型實例。
從技術(shù)角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網(wǎng)路的連線狀況﹐也能確保連線的準確性。當路由器在處理一個數(shù)據(jù)包的過程中發(fā)生了意外,可以通過ICMP向數(shù)據(jù)包的源端報告有關(guān)事件。
其功能主要有:偵測遠端主機是否存在,建立及維護路由資料,重導(dǎo)資料傳送路徑(ICMP重定向),資料流量控制。ICMP在溝通之中,主要是透過不同的類別(Type)與代碼(Code)讓機器來識別不同的連線狀況。
ICMP是個非常有用的協(xié)議﹐尤其是當我們要對網(wǎng)路連接狀況進行判斷的時候。
原理
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報文包含在IP數(shù)據(jù)報中,屬于IP的一個用戶,IP頭部就在ICMP報文的前面,所以一個ICMP報文包括IP頭部、ICMP頭部和ICMP報文,IP頭部的Protocol值為1就說明這是一個ICMP報文,ICMP頭部中的類型(Type)域用于說明ICMP報文的作用及格式,此外還有一個代碼(Code)域用于詳細說明某種ICMP報文的類型,所有數(shù)據(jù)都在ICMP頭部后面。
ICMP報文格式具體由RFC?777,RFC?792規(guī)范。
ICMP類型
已經(jīng)定義的ICMP消息類型大約有10多種,每種ICMP數(shù)據(jù)類型都被封裝在一個IP數(shù)據(jù)包中。主要的ICMP消息類型包括以下幾種。
響應(yīng)請求
我們?nèi)粘J褂米疃嗟膒ing,就是響應(yīng)請求(Type=8)和應(yīng)答(Type=0),一臺主機向一個節(jié)點發(fā)送一個Type=8的ICMP報文,如果途中沒有異常(例如被路由器丟棄、目標不回應(yīng)ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,說明這臺主機存在,更詳細的tracert通過計算ICMP報文通過的節(jié)點來確定主機與目標之間的網(wǎng)絡(luò)距離。
目標不可到達、源抑制和超時報文
這三種報文的格式是一樣的,目標不可到達報文(Type=3)在路由器或主機不能傳遞數(shù)據(jù)報時使用,例如我們要連接對方一個不存在的系統(tǒng)端口(端口號小于1024)時,將返回Type=3、Code=3的ICMP報文,它要告訴我們:“嘿,別連接了,我不在家的!”,常見的不可到達類型還有網(wǎng)絡(luò)不可到達(Code=0)、主機不可到達(Code=1)、協(xié)議不可到達(Code=2)等。源抑制則充當一個控制流量的角色,它通知主機減少數(shù)據(jù)報流量,由于ICMP沒有恢復(fù)傳輸?shù)膱笪模灾灰V乖搱笪?,主機就會逐漸恢復(fù)傳輸速率。最后,無連接方式網(wǎng)絡(luò)的問題就是數(shù)據(jù)報會丟失,或者長時間在網(wǎng)絡(luò)游蕩而找不到目標,或者擁塞導(dǎo)致主機在規(guī)定時間內(nèi)無法重組數(shù)據(jù)報分段,這時就要觸發(fā)ICMP超時報文的產(chǎn)生。超時報文的代碼域有兩種取值:Code=0表示傳輸超時,Code=1表示重組分段超時。
時間戳
時間戳請求報文(Type=13)和時間戳應(yīng)答報文(Type=14)用于測試兩臺主機之間數(shù)據(jù)報來回一次的傳輸時間。傳輸時,主機填充原始時間戳,接收方收到請求后填充接收時間戳后以Type=14的報文格式返回,發(fā)送方計算這個時間差。一些系統(tǒng)不響應(yīng)這種報文。
全部消息類型
下表顯示了完整的ICMP類型:
|
TYPE |
CODE |
Description |
Query |
Error |
|
0 |
0 |
Echo Reply——回顯應(yīng)答(Ping應(yīng)答) |
x |
|
|
3 |
0 |
Network Unreachable——網(wǎng)絡(luò)不可達 |
x |
|
|
3 |
1 |
Host Unreachable——主機不可達 |
x |
|
|
3 |
2 |
Protocol Unreachable——協(xié)議不可達 |
x |
|
|
3 |
3 |
Port Unreachable——端口不可達 |
x |
|
|
3 |
4 |
Fragmentation needed but no frag. bit set——需要進行分片但設(shè)置不分片比特 |
x |
|
|
3 |
5 |
Source routing failed——源站選路失敗 |
x |
|
|
3 |
6 |
Destination network unknown——目的網(wǎng)絡(luò)未知 |
x |
|
|
3 |
7 |
Destination host unknown——目的主機未知 |
x |
|
|
3 |
8 |
Source host isolated (obsolete)——源主機被隔離(作廢不用) |
x |
|
|
3 |
9 |
Destination network administratively prohibited——目的網(wǎng)絡(luò)被強制禁止 |
x |
|
|
3 |
10 |
Destination host administratively prohibited——目的主機被強制禁止 |
x |
|
|
3 |
11 |
Network unreachable for TOS——由于服務(wù)類型TOS,網(wǎng)絡(luò)不可達 |
x |
|
|
3 |
12 |
Host unreachable for TOS——由于服務(wù)類型TOS,主機不可達 |
x |
|
|
3 |
13 |
Communication administratively prohibited by filtering——由于過濾,通信被強制禁止 |
x |
|
|
3 |
14 |
Host precedence violation——主機越權(quán) |
x |
|
|
3 |
15 |
Precedence cutoff in effect——優(yōu)先中止生效 |
x |
|
|
4 |
0 |
Source quench——源端被關(guān)閉(基本流控制) |
||
|
5 |
0 |
Redirect for network——對網(wǎng)絡(luò)重定向 |
||
|
5 |
1 |
Redirect for host——對主機重定向 |
||
|
5 |
2 |
Redirect for TOS and network——對服務(wù)類型和網(wǎng)絡(luò)重定向 |
||
|
5 |
3 |
Redirect for TOS and host——對服務(wù)類型和主機重定向 |
||
|
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——在數(shù)據(jù)報組裝期間生存時間為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——時間戳應(yīng)答(作廢不用) |
x |
||
|
15 |
0 |
Information request (obsolete)——信息請求(作廢不用) |
x |
|
|
16 |
0 |
Information reply - obsolete——信息應(yīng)答(作廢不用) |
x |
|
|
17 |
0 |
Address mask request——地址掩碼請求 |
x |
|
|
18 |
0 |
Address mask reply——地址掩碼應(yīng)答 |
應(yīng)用
ICMP協(xié)議應(yīng)用在許多網(wǎng)絡(luò)管理命令中,下面以ping和tracert命令為例詳細介紹ICMP協(xié)議的應(yīng)用。
(1)ping命令使用ICMP回送請求和應(yīng)答報文
在網(wǎng)絡(luò)可達性測試中使用的分組網(wǎng)間探測命令ping能產(chǎn)生ICMP回送請求和應(yīng)答報文。目的主機收到ICMP回送請求報文后立刻回送應(yīng)答報文,若源主機能收到ICMP回送應(yīng)答報文,則說明到達該主機的網(wǎng)絡(luò)正常。
(2)路由分析診斷程序tracert使用了ICMP時間超過報文
tracert命令主要用來顯示數(shù)據(jù)包到達目的主機所經(jīng)過的路徑。通過執(zhí)行一個tracert到對方主機的命令,返回數(shù)據(jù)包到達目的主機所經(jīng)歷的路徑詳細信息,并顯示每個路徑所消耗的時間。
ICMP攻擊與抵御方法
ICMP攻擊
ICMP協(xié)議對于網(wǎng)絡(luò)安全具有極其重要的意義。ICMP協(xié)議本身的特點決定了它非常容易被用于攻擊網(wǎng)絡(luò)上的路由器和主機。例如,在1999年8月海信集團懸賞“50萬元人民幣測試防火墻”的過程中,其防火墻遭受到的ICMP攻擊達334050次之多,占整個攻擊總數(shù)的90%以上!可見,ICMP的重要性絕不可以忽視!
比如,可以利用操作系統(tǒng)規(guī)定的ICMP數(shù)據(jù)包最大尺寸不超過64KB這一規(guī)定,向主機發(fā)起“Ping?of?Death”(死亡之Ping)攻擊?!癙ing?of?Death”攻擊的原理是:如果ICMP數(shù)據(jù)包的尺寸超過64KB上限時,主機就會出現(xiàn)內(nèi)存分配錯誤,導(dǎo)致TCP/IP堆棧崩潰,致使主機死機。(操作系統(tǒng)已經(jīng)取消了發(fā)送ICMP數(shù)據(jù)包的大小的限制,解決了這個漏洞)
此外,向目標主機長時間、連續(xù)、大量地發(fā)送ICMP數(shù)據(jù)包,也會最終使系統(tǒng)癱瘓。大量的ICMP數(shù)據(jù)包會形成“ICMP風(fēng)暴”,使得目標主機耗費大量的CPU資源處理,疲于奔命。
抵御方法
雖然ICMP協(xié)議給黑客以可乘之機,但是ICMP攻擊也并非無藥可醫(yī)。只要在日常網(wǎng)絡(luò)管理中未雨綢繆,提前做好準備,就可以有效地避免ICMP攻擊造成的損失。
對于“Ping?of?Death”攻擊,可以采取兩種方法進行防范:第一種方法是在路由器上對ICMP數(shù)據(jù)包進行帶寬限制,將ICMP占用的帶寬控制在一定的范圍內(nèi),這樣即使有ICMP攻擊,它所占用的帶寬也是非常有限的,對整個網(wǎng)絡(luò)的影響非常少;第二種方法就是在主機上設(shè)置ICMP數(shù)據(jù)包的處理規(guī)則,最好是設(shè)定拒絕所有的ICMP數(shù)據(jù)包。
設(shè)置ICMP數(shù)據(jù)包處理規(guī)則的方法也有兩種,一種是在操作系統(tǒng)上設(shè)置包過濾,另一種是在主機上安裝防火墻。通過安裝防火墻抵御攻擊的方法如下:
選擇合適的防火墻
有效防止ICMP攻擊,防火墻應(yīng)該具有狀態(tài)檢測、細致的數(shù)據(jù)包完整性檢查和很好的過濾規(guī)則控制功能。
狀態(tài)檢測防火墻通過跟蹤它的連接狀態(tài),動態(tài)允許外出數(shù)據(jù)包的響應(yīng)信息進入防火墻所保護的網(wǎng)絡(luò)。例如,狀態(tài)檢測防火墻可以記錄一個出去的PING(ICMPEchoRequest),在接下來的一個確定的時間段內(nèi),允許目標主機響應(yīng)的ICMPEchoReply直接發(fā)送給前面發(fā)出了PING命令的IP,除此之外的其他ICMPEchoReply消息都會被防火墻阻止。與此形成對比的是,包過濾類型的防火墻允許所有的ICMPEchoReply消息進入防火墻所保護的網(wǎng)絡(luò)了。許多路由器和基于Linux內(nèi)核2.2或以前版本的防火墻系統(tǒng),都屬于包過濾型,用戶應(yīng)該避免選擇這些系統(tǒng)。
新的攻擊不斷出現(xiàn),防火墻僅僅能夠防止已知攻擊是遠遠不夠的。通過對所有數(shù)據(jù)包進行細致分析,刪除非法的數(shù)據(jù)包,防火墻可以防止已知和未知的DoS攻擊。這就要求防火墻能夠進行數(shù)據(jù)包一致性檢查。安全策略需要針對ICMP進行細致的控制。因此防火墻應(yīng)該允許對ICMP類型、代碼和包大小進行過濾,并且能夠控制連接時間和ICMP包的生成速率。
配置防火墻以預(yù)防攻擊
一旦選擇了合適的防火墻,用戶應(yīng)該配置一個合理的安全策略。以下是被普遍認可的防火墻安全配置慣例,可供管理員在系統(tǒng)安全性和易用性之間作出權(quán)衡。
防火墻應(yīng)該強制執(zhí)行一個缺省的拒絕策略。除了出站的ICMP?Echo?Request、出站的ICMP?Source?Quench、進站的TTL?Exceeded和進站的ICMP?Destination?Unreachable之外,所有的ICMP消息類型都應(yīng)該被阻止。
