簡介 ICMP協定是一種面向無連線的協定,用於傳輸出錯報告控制信息。它是一個非常重要的協定,它對於
網路安全 具有極其重要的意義。它屬於
網路層協定 ,主要用於在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據無法訪問目標、IP
路由器 無法按當前的傳輸速率轉發
數據包 等情況時,會自動傳送ICMP訊息。
ICMP 是 TCP/IP 模型中網路層的重要成員,與 IP 協定、ARP 協定、RARP 協定及 IGMP 協定共同構成 TCP/IP 模型中的網路層。ping 和 tracert是兩個常用網路管理命令,ping 用來測試網路可達性,tracert 用來顯示到達目的主機的路徑。ping和 tracert 都利用 ICMP 協定來實現網路功能,它們是把網路協定套用到日常網路管理的典型實例。
從技術角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網路的連線狀況﹐也能確保連線的準確性。當路由器在處理一個數據包的過程中發生了意外,可以通過ICMP向數據包的源端報告有關事件。
其功能主要有:偵測遠端主機是否存在,建立及維護路由資料,重導資料傳送路徑(
ICMP重定向 ),資料
流量控制 。ICMP在溝通之中,主要是透過不同的
類別 (Type)與
代碼 (Code) 讓機器來識別不同的連線狀況。
ICMP 是個非常有用的協定﹐尤其是當我們要對網路連線狀況進行判斷的時候。
工作原理 ICMP提供一致易懂的出錯報告信息。傳送的出錯
報文 返回到傳送原數據的設備,因為只有傳送設備才是出錯報文的邏輯接受者。傳送設備隨後可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由傳送方完成。
圖1 ICMP原理 我們在網路中經常會使用到ICMP協定,比如我們經常使用的用於檢查網路通不通的
Ping 命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協定工作的過程。還有其他的
網路命令 如
跟蹤路由 的Tracert命令也是基於ICMP協定的。
報文格式 ICMP報文包含在IP數據報中,屬於IP的一個用戶,IP頭部就在ICMP報文的前面,所以一個ICMP報文包括IP頭部、ICMP頭部和ICMP報文,IP頭部的Protocol值為1就說明這是一個ICMP報文,ICMP頭部中的類型(Type)域用於說明ICMP報文的作用及格式,此外還有一個代碼(Code)域用於詳細說明某種ICMP報文的類型,所有數據都在ICMP頭部後面。
圖2ICMP報文格式 ICMP報文格式具體由RFC 777,RFC 792規範。
ICMP類型 已經定義的ICMP訊息類型大約有10多種,每種ICMP數據類型都被封裝在一個IP數據包中。主要的ICMP訊息類型包括以下幾種。
回響請求 我們日常使用最多的ping,就是回響請求(Type=8)和應答(Type=0),一台主機向一個節點傳送一個Type=8的ICMP報文,如果途中沒有異常(例如被路由器丟棄、目標不回應ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,說明這台主機存在,更詳細的tracert通過計算ICMP報文通過的節點來確定主機與目標之間的網路距離。
目標不可到達、源抑制和逾時報文 這三種報文的格式是一樣的,目標不可到達報文(Type=3)在路由器或主機不能傳遞數據報時使用,例如我們要連線對方一個不存在的系統連線埠(連線埠號小於1024)時,將返回Type=3、Code=3的ICMP報文,它要告訴我們:“嘿,別連線了,我不在家的!”,常見的不可到達類型還有網路不可到達(Code=0)、主機不可到達(Code=1)、協定不可到達(Code=2)等。源抑制則充當一個控制流量的角色,它通知主機減少數據報流量,由於ICMP沒有恢復傳輸的報文,所以只要停止該報文,主機就會逐漸恢復傳輸速率。最後,無連線方式網路的問題就是數據報會丟失,或者長時間在網路遊蕩而找不到目標,或者擁塞導致主機在規定時間內無法重組數據報分段,這時就要觸發ICMP逾時報文的產生。逾時報文的代碼域有兩種取值:Code=0表示傳輸逾時,Code=1表示重組分段逾時。
時間戳 時間戳請求報文(Type=13)和時間戳應答報文(Type=14)用於測試兩台主機之間數據報來回一次的傳輸時間。傳輸時,主機填充原始時間戳,接收方收到請求後填充接收時間戳後以Type=14的報文格式返回,傳送方計算這個時間差。一些系統不回響這種報文。
全部訊息類型 下表顯示了完整的ICMP類型:
表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——地址掩碼應答
套用 ICMP 協定套用在許多網路管理命令中,下面以 ping 和 tracert 命令為例詳細介紹 ICMP 協定的套用。
(1) ping 命令使用 ICMP 回送請求和應答報文
在網路可達性測試中使用的分組網間探測命令 ping 能產生 ICMP 回送請求和應答報文。目的主機收到 ICMP 回送請求報文後立刻回送應答報文,若源主機能收到 ICMP 回送應答報文,則說明到達該主機的網路正常。
(2)路由分析診斷程式 tracert 使用了 ICMP時間超過報文
tracert 命令主要用來顯示數據包到達目的主機所經過的路徑。通過執行一個 tracert 到對方主機的命令,返回數據包到達目的主機所經歷的路徑詳細信息,並顯示每個路徑所消耗的時間。
ICMP攻擊與抵禦方法 ICMP攻擊 ICMP協定對於
網路安全 具有極其重要的意義。ICMP協定本身的特點決定了它非常容易被用於攻擊網路上的
路由器 和
主機 。例如,在1999年8月
海信集團 懸賞“50萬元人民幣測試防火牆”的過程中,其防火牆遭受到的ICMP攻擊達334050次之多,占整個攻擊總數的90%以上!可見,ICMP的重要性絕不可以忽視!
比如,可以利用
作業系統 規定的ICMP數據包最大尺寸不超過64
KB 這一規定,向
主機 發起“Ping of Death”(
死亡之Ping )攻擊。“Ping of Death” 攻擊的原理是:如果ICMP數據包的尺寸超過64KB上限時,
主機 就會出現
記憶體分配 錯誤,導致TCP/IP
堆疊 崩潰,致使主機當機。(
作業系統 已經取消了傳送ICMP數據包的大小的限制,解決了這個漏洞)
此外,向目標
主機 長時間、連續、大量地傳送ICMP數據包,也會最終使系統癱瘓。大量的ICMP數據包會形成“ICMP風暴”,使得目標
主機 耗費大量的CPU資源處理,疲於奔命。
抵禦方法 雖然ICMP協定給
黑客 以可乘之機,但是ICMP攻擊也並非無藥可醫。只要在日常
網路管理 中未雨綢繆,提前做好準備,就可以有效地避免ICMP攻擊造成的損失。
對於“Ping of Death”攻擊,可以採取兩種方法進行防範:第一種方法是在
路由器 上對ICMP
數據包 進行
頻寬 限制,將ICMP占用的頻寬控制在一定的範圍內,這樣即使有ICMP攻擊,它所占用的頻寬也是非常有限的,對整個網路的影響非常少;第二種方法就是在
主機 上設定ICMP數據包的處理規則,最好是設定拒絕所有的ICMP數據包。
設定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訊息類型都應該被阻止。