TCP/IP詳解 第八章-ICMP(Internet控制報文)協議

1、引言

1.1、ICMP簡介

IP 協議本身沒有提供直接的方法來發現那些發往目的地址失敗的IP 數據包。

此外, IP 沒有提供直接的方式來獲取診斷信息(例如哪些路由器在沿途中被使用了或使用一種方法來估計往返時間)

爲了解決這些不足之處,將一個特殊的 Internet 控制報文協議( Internet Control Message Protocol,ICMP)[RFC0792][RFC4443]IP 結合使用,以便提供IP 協議層配置和IP 數據包處置相關的診斷和控制信息

ICMP 通常被認爲是IP 的部分,它需要在所有IP 實現中存在。它使用IP 協議進行傳輸。因此,確切地說,它既不是一個網絡層協議,也不是一個傳輸層協議,而是位於兩者之間

ICMP報文可以分類兩類:

1.差錯報文:有關IP數據報傳遞的ICMP報文
2.查詢或者信息類報文:有關信息採集和配置的ICMP報文

ICMP報文通常由IP層本身、上層的傳輸協議(例如TCPUDP),甚至是用戶應用觸發的。

ICMP並不爲IP網絡提供可靠性,它只是表明某些類別的故障和配置信息,最常見的丟包(路由器緩衝區溢出)並不會觸發任何ICMP信息。

鑑於此,黑客們已經在大量攻擊中使用ICMP報文。由於擔心這種攻擊,網絡管理員通常會使用防火牆封堵ICMP報文,特別是在邊界路由器上。如果ICMP被封鎖,大量的診斷程序(例如ping, traceroute)將無法正常工作。

1.2、ICMP報文格式

 

ICMP報文封裝在IP數據報內

IPv4協議中,協議字段=1

IPV6協議中,下一個頭部字段=58

ICMP頭部=類型+代碼+檢驗和組成

ICMP類型不同,ICMP數據格式不同

2、ICMP報文

2.1、ICMPv4類型

信息報文: 顯請求(8)和回顯應答(0);路由器通告(9)和路由器請求(10)

差錯報文: 目的不可達(3)、重定向(5)、超時(11)、參數問題(12)

2.2、ICMPv6類型

ICMPv6不僅有差錯和信息類報文,還負責IPv6路由器和主機的配置

ICMPv6差錯報文類型字段(0~127),信息類報文類型爲128~255

2.3、報文處理

信息類請求將被操作系統自動處理,差錯類報文傳遞給用戶進程或傳輸層協議。

例外情況是:

重定向報文導致主機路由表自動更新

目的不可達需要分片報文,用於路徑MTU發現機制

 

ICMPv6對報文處理更加嚴格:

1.未知ICMPv6報文必須傳遞給上層產生差錯報文的進程
2.未知ICMPv6信息報文被丟棄
3. ICMPv6差錯報文將會盡可能多的包含導致差錯的原始報文
4.處理ICMPv6差錯報文時,需要提取原始報文的上層協議類型,用於選擇適當的上層進程
5.ICMPv6節點必須限制它發送ICMPv6差錯報文的速率。

 

2.4、限制規則

目的:

限制生成ICMP差錯報文的原因是防止出現廣播風暴

ICMPv4限制規則:

1.ICMPv4差錯報文
2.目的地址是IPv4廣播地址或IPv4組播地址的數據報
3.作爲鏈路層廣播的數據報
4.不是第一個分片的其他分片
5.源地址不是單個主機的數據報,即原地址不能是零地址、環回地址、廣播地址、組播地址

 

ICMPv6限制規則:

1.ICMPv6差錯報文
2.ICMPv6重定向報文
3.目的地址是IPv6組播地址的數據包,以下情況除外:數據包太大(PTB)報文,參數問題報文
4.作爲鏈路層組播(以及前面提到的例外情況)的數據包
5.作爲鏈路層廣播(以及前面提到的例外情況)的數據包
6.源地址不是唯一識別的單個節點的數據包

3、ICMP差錯報文

3.1、總體流量水平規則

除了控制產生ICMP報文條件的規則,還有限制總體流量水平規則。一種推薦的方法是令牌桶。

隨着時間流逝,系統會按恆定1/QPS時間間隔(如果QPS=100,則間隔是10ms)往桶裏加入Token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經滿了就不再加了.新請求來臨時,會各自拿走一個Token,如果沒有Token可拿了就阻塞或者拒絕服務.

令牌桶的另外一個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種算法則實時的計算應該增加的令牌的數量.

3.2、ICMP差錯報文數據包組成

包含一個完整的源自原始數據報的IP頭部副本,再加上原始數據報的IP有效載荷區中的任何其他數據,同時保證生產恆的IP/ICMP數據報的大小不超過特定值(IPV4:576字節,IPV6最小的MTU,至少1280字節)

 

擴展的ICMP和多部報文

擴展結構用於ICMPv4的目的不可達、超時、參數問題報文,以及ICMPv6的不可達和超時報文。

通過在ICMP報文的尾部追加擴展數據結構的方法,擴展包括一個擴展頭部和對象數據

ICMPv4頭部的第6字節和ICMPv6頭部的第5字節用來表示長度字段

3.3、ICMPv4主機不可達(1)ICMPv6地址不可達(3)

路由器或者主機產生,出現在當它被要求使用直接交付方法發送一個IP數據報到一個主機,但由於某些原因無法到達目的地。例如當最後一跳路由器試圖發送一個ARP請求到已經不再或者關閉的主機時。

ICMPv6目的無路由(代碼0)

ICMPv4管理禁止通信(代碼3)ICMPv6目的管理禁止通信(代碼1)

ICMPv4端口不可達(代碼3)ICMPv6端口不可達(代碼4)

結合traceroute命令分析

ICMPv4 PTB

數據大於選定的傳出網絡接口的MTU,則需要分片。如果到達的數據包在IP頭部中設置了不分片(Don’t Fragement)字段,此時產生不可達PTB報文。已經用來作爲MTU發現

ICMPv6 PTB

ICMPv6超出源地址範圍

ICMPv6源地址失敗進/出策略

ICMOv6拒絕路由到目的地

重定向(ICMPv4(5)/ICMPv6(137))

ICMP超時(ICMPv4(11)/ICMPv6(3))

結合traceroute命令分析

參數問題(ICMPv4(12)/ICMPv6(4))

3.4.、traceroute的原理

Traceroute命令利用了”TTL超時以及“端口不可達”的報文。

它發送的用於探測網絡路徑的數據包的IP之上的協議可以是 UDPTCPICMP。不同模式下,探測過程中設計的數據包如下:

1.UDP模式:UDP探測數據包(目標端口大於30000+ 中間網關發回 ICMP TTL 超時數據包 + 目標主機發回ICMP Destination Unreachable 數據包
2.TCP模式:TCP [SYN]探測數據包(目標端口爲Web服務的80+ 中間網關發回 ICMP TTL 超時數據包 + 目標主機發回TCP [SYN ACK] 數據包
3.ICMP模式:ICMP Echo (ping) Request 探測數據包 + 中間網關發回ICMP TTL超時數據包 + 目標主機發回ICMP Echo (ping) reply 數據包

3.5、traceroute詳細過程

1.將傳遞到目的IP地址的ICMP Echo消息的TTL值被設置爲1,該消息報經過第一個路由器時,其TTL值減去1,此時新產生的TTL值爲0
2. 由於TTL值被設置爲0,路由器判斷此時不應該嘗試繼續轉發數據報,而是直接拋棄該數據報。由於數據報的生存週期(TTL值)已經到期,這個路由器會發送一個一個ICMP時間超時,即TTL值過期信息返回到客戶端計算機。
3. traceroute命令的客戶端計算機將顯示該路由器的名稱,之後可以再發送一個ICMP Echo消息並把TTL值設置爲2
4.1個路由器仍然對這個TTL值減1,然後,如果可能的話,將這個數據報轉發到傳輸路徑上的下一跳。當數據報抵達第2個路由器,TTL值會再被減去1,成爲0值。

5.2個路由器會像第1個路由器一樣,拋棄這個數據包,並像第1個路由器那樣返回一個ICMP消息。

6.過程會一直持續,traceroute命令不停遞增TTL值,而傳輸路徑上的路由器不斷遞減該值,直到數據報最終抵達預期的目的地

7.目的計算機接收到ICMP Echo消息時,會回傳一個ICMP Echo Reply消息地址掩碼請求/應答(17/18)、時間戳請求/應答(13/14)、信息請求/應答(15/16)等已經不再使用。

 

3.6、回顯請求/應答

回顯請求/應答(ICMPv48/0 ICMPv6128/129)

 

4、ICMP查詢/信息類報文

4、ICMP查詢/信息類報文

本地代理地址發現請求/應答(ICMPv6 144/145)

發現本地代理

移動前綴請求、通告(ICMPv6 146/147)

用來通知一個移動中的節點其本身前綴已經改變了,一般使用Ipsec保護,防止假冒前綴通告的欺騙

移動IPv6快速切換報文(ICMPv6 154)

當一個移動節點從一個網絡的接入點(AP)移動到另一個是,改善IP切換延遲

組播偵聽查詢/報告/完成(ICMPv6 130/131/132)

版本2組播偵聽發現(ICMPv6 143)

組播路由器發現(IGMP 48/49/50 ICMPv6151/152/153)

5、IPv6中的鄰居發現

NDPNeighbor Discovery Protocol,鄰居發現協議)是IPv6的一個關鍵協議,它組合了IPv4中的ARPICMP路由器發現和ICMP重定向等協議,並對它們作了改進。作爲IPv6的基礎性協議,NDP還提供了前綴發現、鄰居不可達檢測、重複地址監測、地址自動配置等功能。

5.1、路由器請求/通告(133/134)

路由器週期發送RA(route advertisement)消息。每臺設備爲了讓二層網絡上的主機和設備知道自己的存在,定時都會組播發送RA報文,RA報文中會帶有網絡前綴信息,及其他一些標誌位信息。

主機發送RSroute solicitation),路由器迴應RA(route advertisement)。 很多情況下主機接入網絡後希望儘快獲取網絡前綴進行通信,此時主機可以立刻發送RS報文,網絡上的設備將回應RA報文。主機收到包含路由信息的RA報文後,會更新自己的路由表。當主機向其他設備發送報文時,通過查詢該列表的路由信息,選擇合適的路由發送報文

5.2、鄰居請求/通告(135/136)

取代IPv4ARP(地址解析協議),主要目的是將IPv6地址轉換爲鏈路層地址,鄰居請求NSneighbor solicitation,鄰居通告NAneighbor advertisement

主機A發給主機B的報文爲組播報文,主機B發給主機A的是單播報文,其他無關的路由器是不會迴應的。

 

過程可以這樣描述:

主機A:誰叫李法拉?你住在哪裏?

主機B: 我叫李法拉,住在MAC地址的xxxxx

主機C: 不是叫我,不管他。

5.3、鄰居不可達檢測(Neighbor Unreachable Detection)

檢測同一個鏈路上的兩個系統什麼時候丟失了或者變得非對稱了。

1、未完成(Incomplete,還有沒有票?不知道啊)。表示正在解析地址,但鄰居鏈路層地址尚未確定。

2、可達(Reachable,我就是今天的票!)表示地址解析成功,該鄰居可達。

3、陳舊(Stale,我的這張舊船票還能登上你的破船嗎?)表示可達時間耗盡,未確定鄰居是否可達。

4、延遲(Delay,破船到底還有沒有?),表示未確定鄰居是否可達。DELAY狀態不是一個穩定的狀態,而是一個延時等待狀態。

5、探查(Probe,這張票還能用嗎?能到xx地方嗎?),節點會向處於PROBE狀態的鄰居持續發送NS報文。

Empty表示鄰居表項爲空。

5.4、鄰居不可達檢測狀態轉換

① 在EMPTY狀態時,如果有報文要發送給鄰接節點,則在本地鄰居緩存表建立該鄰接節點的表項,並將該表項置於INCOMPLETE狀態,同時向鄰接節點以組播方式發送NS報文。

② 節點收到鄰居迴應的單播NA報文後,將處於INCOMPLETE狀態的鄰居緩存表項轉化爲REACHABLE狀態。如果地址解析失敗(發出的組播NS超時),則刪除該表項。

③ 處於REACHABLE狀態的表項,如果在REACHABLE_TIME時間內沒有收到關於該鄰居的“可達性證實信息”,則進入STALE狀態。此外,如果該節點收到鄰居節點發出的非S置位NA報文,並且鏈路層地址有變化,相關表項會進入STALE狀態。

④ 處於STALE狀態的表項,當有報文發往該鄰居時,這個報文會利用緩存的鏈路層地址進行封裝,並使該表項進入DELAY狀態,等待收到“可達性證實信息”。

⑤ 進入DELAY狀態後,如果DELAY_FIRST_PROBE_TIME時間之內還未收到關於該鄰居的“可達性證實信息”,則該表項進入PROBE狀態。

⑥ 在PROBE狀態時,節點會週期性地用NS報文來探測鄰居的可達性,探測最大時間間隔爲RETRANS_TIMER,在最多嘗試MAX_ UNICAST_SOLICIT次後,如果仍未收到鄰居迴應的NA報文,則認爲該鄰居已不可達,該表項將被刪除。

5.5、重複地址檢測DADDuplicate Address Detect

是在接口使用某個IPv6單播地址之前進行的,主要是爲了探測是否有其它的節點使用了該地址。尤其是在地址自動配置的時候,進行DAD檢測是很必要的

DAD機制通過NSNA報文實現

節點會發送NS報文(有人叫張拉拉嗎?),其源地址爲未指定地址,目的地址爲接口配置的IPv6地址

如果收到自己的報文(聽到自己的迴音,奧,自己的聲音不管他),直接忽略

NS報文發送到鏈路上後,如果在規定時間內沒有收到應答的NA報文,則認爲這個單播地址在鏈路上是唯一的,可以分配給接口(好了,我就叫張拉拉了)

反之,如果收到應答的NA報文(一個響亮的聲音回來,我就叫張拉拉!呀丫丫,有人和我同名啊,算了,改個名字吧),則表明這個地址已經被其他節點所使用,不能配置到接口

5.6、重定向功能

當網關路由器發現更好的報文轉發路徑時候,會用重定向報文告訴主機

主機H1要發送數據到網絡N2,經過路由器R1,由R1再轉發到到R2

路由器R1發現R2和它是同一網段,並且R2是直接連接着網絡N2,這時候路由器R1就發送重定向報文(ND redirect)告訴主機H1,以後再給網絡N2的報文就直接給R2好了,別那麼繞彎子,費勁!

在重定向功能中,只有主機纔會處理重定向報文。在圖例中,H1會更新自己的路由表,下次再發送到N2的報文便會直接轉發到R2

6、ICMPv4ICMPv6轉換

信息報文只有回顯請求(8->128)和回顯響應(0->129)轉換了。

差錯報文只有目的不可達(3)、超時(11)、參數問題(12)轉換了

7、與ICMP相關的攻擊

7.1、與ICMP相關的攻擊

主要3類:泛洪(flood)、炸彈(bomb)和信息泄露(information disclosure)

泛洪會造成大量流量,導致針對一臺或多臺計算機的有效的Dos攻擊。

炸彈指的是發送經過特殊構造的報文,能夠導致IP或者ICMP的處理崩潰或者終止。

信息泄露本身並不會造成傷害,但是能夠保住其他攻擊方法避免浪費時間或者被發現。

Smurf攻擊:

一種早期的ICMP攻擊,源IP設爲受害者IP,目的地址設爲廣播地址,導致大量計算機響應,造成Dos攻擊,這種攻擊只需要在防火牆邊界禁止傳入的廣播流量即可處理。

Ping of Death攻擊:

採用ICMPv4回顯請求/應答報文構建數據包分片,當他們重組時形成一個過大的數據報(大於最大值64KB),導致某些系統崩潰,形成另一種形式的Dos攻擊

Land攻擊:

將源地址和目的地址均設爲受害者IP,收到這種報文時,有些實現有問題。

 

7.2、利用ICMP重定向功能

ICMP重定向功能可能導致終端使用一個錯誤的系統作爲下一跳路由。可以沿着流量流插入一箇中間人進行記錄分析,修改導致不想要的動作。還可能會使受害者認爲自身就是到達目的地址的最優網關,導致無線循環,間接鎖定受害者的主機

利用路由器通告和路由器請求報文

路由器通告和路由器請求報文能被用於創建類似重定向攻擊,導致受害者修改他們的默認路由;被動接受這些報文可以使攻擊者瞭解本地網絡環境的拓撲結構。

使用ICMP作爲入侵程序的通信通道,協調一組合作病毒的行動。

SmackBloop攻擊

ICMP目的不可達報文可造成現有連接的拒絕服務。

利用ICMP時間戳請求/應答報文

ICMP時間戳請求/應答報文能夠獲取主機的當前時間,進而預測與時間相關的僞隨機序列。

利用PTB報文

PTB報文包含推薦MTU值的字段,攻擊者修改這個值強制中斷使用非常小的數據包運行,導致性能低下

如果沒有加密,欺騙或者僞裝攻擊仍然可能,使用加密方法的協議提供更高水平的安全性,但部署複雜,出問題時分析複雜。

8、參考文獻

1.《TCP/IP詳解 卷1:協議
2.下一代IP協議---IPv6鄰居發現協議(NDP

https://baijiahao.baidu.com/s?id=1609424059183543390&wfr=spider&for=pc

3.ICMP協議學習總結和實驗筆記

https://wenku.baidu.com/view/e6eff8660b4e767f5bcfce16.html

4.ping的實現和代碼分析

https://blog.csdn.net/zzucsliang/article/details/41407387

5.Traceroute(路由追蹤)的原理及實現

https://www.jianshu.com/p/75a5822d0eec

6.traceroute命令初探

https://www.cnblogs.com/reaperhero/articles/10066611.html

 

感謝langgy

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章