目錄
8.1 引言
8.1.1 在IPv4和IPv6中的封裝
8.2 ICMP 報文
8.2.1 ICMPv4 報文
8.2.2?ICMPv6 報文
8.2.3 處理ICMP報文
8.3?ICMP差錯報文
8.3.1 擴展的ICMP和多部報文
8.3.2 目的不可達和數據包太大
8.3.3 重定向
8.3.4 ICMP 超時
8.3.5 參數問題
8.4 ICMP查詢/信息類報文
8.4.1 回顯請求 / 應答
8.4.2 路由器發現:路由器請求RS和通告RA
8.4.3 本地代理地址發現請求/應答
8.4.4 移動前綴請求/通告
8.4.5 移動IPv6快速切換報文
8.4.6 組播偵聽查詢/報告/完成
8.4.7 版本2組播偵聽發現
8.4.8 組播路由器發現
8.5 IPv6中的鄰居發現
8.5.1 ICMPv6路由器請求和通告
8.5.2 ICMPv6鄰居請求和通告
8.5.3 ICMPv6反向鄰居發現請求/通告
8.5.4鄰居不可達檢測
8.5.5安全鄰居發現
8.5.6 ICMPv6鄰居發現選項
8.6 ICMPv4 和 ICMPv6 轉換
8.7 與ICMP相關的攻擊
8.8 總結
8.1 引言
ICMP位于網絡層和傳輸層之間。
因為路由器緩沖區溢出的丟包不會觸發任何ICMP差錯報文。而由TCP等處理(重傳等)。
黑客在大量攻擊中使用ICMP。由于擔心攻擊,通常防火墻封阻ICMP報文,特別是邊界路由器。此時診斷程序(ping, traceroute)無法正常工作。
ICMPv6包含:
????????錯誤報告。
????????鄰居請求,鄰居通告。
????????路由器請求,路由器通告。
????????重定向:優化路由。
????????報文過濾: 引入Packet Too Big報文,通知源主機包超過了鏈路層MTU。
8.1.1 在IPv4和IPv6中的封裝
報文格式:
其中ICMPv4頭:
字段介紹:
????????類型:指定報文類型,常用8個值。
????????代碼:進一步指定報文類型。
????????校驗和:IP層沒有對載荷完整性保護。所以ICMP需包含校驗和。
8.2 ICMP 報文
ICMP報文分類:
????????差錯報文:用于通知發送端數據包傳輸中的錯誤情況。
????????查詢/信息類報文:用于信息采集和配置。
8.2.1 ICMPv4 報文
差錯報文:
????????目的不可達(類型3),重定向(類型5),超時(類型11 ),參數問題(類型12)
查詢/信息類報文:
????????回顯請求(類型8),回顯應答(類型0),路由器通告(類型9),路由器請求(類型10)
其中重定向報文目的:指導主機或路由器改變路由決策,將數據發送到更優路徑上。
8.2.2?ICMPv6 報文
ICMPv6不僅包含差錯和查詢/信息類報文,還有大量IPv6路由器和主機的配置,如RS,RA,NS,NA。
ICMPv6類型字段值:
????????從0到127是差錯類報文,從128到255是信息類報文。
ICMPv6也使用代碼字段。
ICMPv6還支持大量標準選項,而ICMPv4不支持選項。
8.2.3 處理ICMP報文
收到重定向報文:會更新路由表。
目的不可達報文:可用于路徑MTU發現(PMTUD)
ICMPv6報文處理規則:
????????1. 收到未知ICMPv6差錯報文,須傳遞給上層產生差錯報文的進程。
????????2. 收到未知ICMPv6信息類報文,丟棄。
????????3. 發送ICMPv6差錯報文時,應盡可能多地包含導致差錯的原始IPv6報文,但不超過最小的IPv6 MTU ( 1280字節)
????????4. IPv6節點須限制發送ICMPv6差錯報文速率。
IPv6網絡中鏈路層最小MTU是1280字節。IPv4中是576字節。
8.3?ICMP差錯報文
請注意8.3.1到8.3.5章節都屬于ICMP差錯報文。
不會用ICMP差錯報文響應以下報文:
????????另一個ICMP差錯報文。
????????頭部損壞的數據報(例如校驗和錯誤)。
????????IP層廣播或組播數據。
????????鏈路層廣播或組播幀數據。
????????無效地址(零地址、環回地址、廣播地址,組播地址)
????????第一個之外的分片。
發送ICMP差錯報文:應包含導致錯誤數據報的IP頭副本,包括IP選項和原始IP載荷,生成的ICMP數據報大小不超過網絡最小MTU。
差錯報文包含原始IP包載荷作用:
????????使接收ICMP差錯報文主機能根據IP頭中協議或下一個頭部將該差錯報文傳遞到對應傳輸層和應用進程。
8.3.1 擴展的ICMP和多部報文
擴展的ICMP差錯報文: 使ICMP差錯報文包含額外信息以提供更多診斷信息。
用ICMP中代碼字段指明具體原因,實現擴展功能。
后續章節詳解。
8.3.2 目的不可達和數據包太大
ICMPv4目的不可達差錯報文:
????????網絡不可達:code 0,無路由信息。
????????主機不可達:Code 1,如目標主機關機等。
????????協議不可達:Code 2,目標主機無法處理數據包傳輸層協議。
????????端口不可達:Code 3,該端口未打開或沒有對應端口的應用程序。
????????需要進行分片,但設置了DF位:Code 4
????????源站選路失敗:Code 5,IP包中包含源站路由選項,但無法按照指定路由轉發數據包。
ICMPv6目的不可達差錯報文:
????????無路由:code 0,無路由信息。
????????目的地被管理員禁止通信:code 1
????????源地址的范圍之外:code 2,如訪問公網時,源IP地址是本地鏈路地址,不屬于全局地址。
????????地址不可達:code 3,目標主機未響應或不可達
????????端口不可達:code 4
????????源地址失敗進/出策略:code 5,如因為接口ACL導致數據報無法傳遞。
數據包太大差錯報文
????????即PTB(Packet Too Big)
????????路由器轉發的數據大于出接口MTU,但數據IP頭設置了不分片位,則丟棄該數據,并回復PTB差錯報文。
????????PTB報文中會包含路由器自身 MTU值,以告知源地址減小數據包。
????????因此該報文可用于PMTU發現,PMTU是路徑中MTU最小值。
net.ipv4.icmp_ratemask = 6168(哪些ICMP報文有速率限制,對應code字段)
應用程序使用如下代碼接口ICMP報文:
????????sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
????????應用層收到ICMP差錯報文后,可進行對應操作。
8.3.3 重定向
使用不多。
主機根據ICMP重定向報文信息來更新轉發表
8.3.4 ICMP 超時
IPv4頭部中TTL字段:表示丟棄前最多可經過的路由器跳數。
IPv6頭部中同樣有跳數限制(Hop Limit)字段表示。
超時報文差錯報文:
????????TTL超時:Code 0,指示數據報TTL值已減至零。
????????分片重組超時:Code 1,指示數據報片段重組未能在一定時間內完成。
traceroute原理:
????????主機先發送IPv4 TTL=1數據,到達第一個路由器,此時TTL到期,路由器回復ICMPv4超時報文。主機下一次數據包TTL加1。導致在更遠一跳路由器超時,并回復ICMP超時報文,重復該過程。
ICMP響應報文中包含響應路由器自身IP,由此得到沿途所有路由器IP。
8.3.5 參數問題
場景:IP頭部存在不可修復錯誤。
????????該報文是"包羅萬象”的錯誤指示器。無法指明具體原因,但會指出錯誤相對IP頭部的偏移值。
ICMPv6中細分為三種:
????????錯誤頭部字段。
????????無法識別下一個頭部。
????????無法識別IPv6選項。
8.4 ICMP查詢/信息類報文
注意:8.3 講解的全是ICMP差錯報文。
廣泛使用的ICMP查詢/信息類報文:回顯請求,回顯應答(ping使用)
8.4.1 回顯請求 / 應答
即ping使用的ICMP報文類型。
回顯請求報文大小任意(但受限于IP數據報大小),回顯應答時需要將收到數據返回給發送者,即使需要IP分片。
字段介紹:
????????標識符:UNIX用發送進程PID表示。方便識別同一主機多個ping程序。
????????序列號:從0開始,每個回顯請求加1。方便查看丟包、重復問題。
????????可選數據:如ping在回顯請求和應答包含本地時,方便計算RTT。
????????之前提過NAT處理ICMP時,會結合標識符和序列號進行NAT轉換,因為ICMP報文沒有端口號信息。
ping -b 10.0.0.254
ping廣播地址作用:
????????子網所有主機收到該ping包后,都需要響應,所以都需要知道ping主機的MAC,于是都向ping主機發ARP請求,最終快速廣播ping主機ARP。
Linux默認允許回復CMP應答報文給廣播地址的ICMP請求。
8.4.2 路由器發現:路由器請求RS和通告RA
路由器發現:RD(Router Discovery)
RD:IPv4使用少。主要用于IPv6,是IPv6 SLAAC功能一部分。
IPv6 RD包括:
????????路由器請求RS(Router Solicitation)報文
????????路由器通告RA(Router Advertisement)報文
ICMP type 133,表示路由器請求RS。請求網絡配置,如DNS,IPv6網絡前綴。
ICMP type 134,表示路由器通告RA。要么用于回復RS,要么周期多播發送。
使用場景:
????????無狀態地址配置:RA中包含網絡前綴信息。
8.4.3 本地代理地址發現請求/應答
允許移動網絡IPv6節點在移動時保持其IPv6地址不變,并且可以在外部網絡上通過本地代理進行通信。
8.4.4 移動前綴請求/通告
當節點的本地地址將無效時,請求更新路由前綴。
8.4.5 移動IPv6快速切換報文
改善IP層切換延遲
8.4.6 組播偵聽查詢/報告/完成
允許節點查詢或報告本地鏈路上的組播組成員信息,并執行組播組成員的管理。
8.4.7 版本2組播偵聽發現
8.4.8 組播路由器發現
通過ICMPv6組播路由器發現報文,主機確定哪些路由器支持 IPv6 組播,從而決定是否啟用 IPv6 組播功能。
8.5 IPv6中的鄰居發現
鄰居發現:(Neighbor Discovery,ND),類似IPv4的ARP。
IPv6中沒有廣播地址。
ND用于在同一個鏈路或者網段的節點找到彼此,確定一個鄰居是否變得可用。
ND使用ICMPv6報文。
ND包含:
????????鄰居請求NS(Neighbor Solicitation),ICMP type為135。
????????鄰居通告NA(Neighbor Advertisement),ICMP type為136。
功能:地址解析,鄰居發現,地址自動配置。
8.5.1 ICMPv6路由器請求和通告
路由器通告(RA)報文:
????????通告網絡前綴,MTU,DNS,NTP服務器等配置。
????????通常會定期發送,或者用于響應路由器請求(RS)報文。
RS報文目的IP:ff02::2(所有路由器組播地址)
RA報文目的IP:ff02::1(所有節點的組播地址)或者單播RS主機
結合無狀態DHCPv6 SLAAC使用。
8.5.2 ICMPv6鄰居請求和通告
ICMPv6中的鄰居請求(NS)報文:取代IPv4 ARP
目的:
????????IPv6中ARP功能,獲取IPv6地址對應MAC。
????????檢測附近節點是否可達。
8.5.3 ICMPv6反向鄰居發現請求/通告
在幀中繼網絡中確定給定的MAC地址對應IPv6地址
8.5.4鄰居不可達檢測
(Neighbor Unreachability Detection, NUD)
定期檢測鄰居節點的存活狀態
如果檢測到鄰居不可達,更新鄰居表和路由表,切換到備用網絡。
8.5.5安全鄰居發現
安全鄰居發現(Secure Neighbor Discovery,SEND)
安全性增強的鄰居發現協議。
作用:
????????鄰居發現,且解決傳統IPv6鄰居發現過程安全漏洞。
8.5.6 ICMPv6鄰居發現選項
使用一些可選的選項(Options)來提供額外信息或配置。
源/目標鏈路層地址選項
前綴信息選項PIO
重定向頭部選項
MTU 選項
通告間隔選項
源和目標地址列表選項
時間戳選項
隨機數選項
證書選項
IP地址/前綴選項
鏈路層地址選項
鄰居通告確認選項
路由信息選項
遞歸DNS服務器選項
切換密鑰請求選項
切換密鑰應答選項
8.6 ICMPv4 和 ICMPv6 轉換
8.7 與ICMP相關的攻擊
分為3類:
泛洪(flood):DoS
炸彈(bomb):發送特殊構造報文,導致IP或者ICMP的處理崩潰。
信息泄露(information disclosure)