什麼是ICMP?了解 Internet 控制消息協議

您可能聽說過 ICMP,如果您只是一個精通技術的人,您可能會(至少)知道它與 Internet 有關係。

ICMP 實際上是一種協議,很像 IP、TCP 和 UDP(我們之前討論過並解釋過),因此它在我們的 Internet 連接的良好運行中起著非常重要的作用。

ICMP 更多地與檢測和處理連接問題的方式有關,但我們不要過多地破壞我們的講座。如果您想了解什麼是 ICMP 以及它如何幫助我們保持連接以最佳水平運行,請繼續閱讀。

什麼是ICMP?了解 Internet 控制消息協議

什麼是ICMP?

Internet 控制消息協議以其更友好的首字母縮寫詞 ICMP 而聞名,它是解決各種與連接相關問題的基礎的協議。

該協議被各種網絡設備使用,包括但不限於路由器、調製解調器和服務器,以通知其他網絡參與者有關潛在連接問題的信息。

我們在上面提到過,ICMP 是一種類似於 TCP 和 UDP 的協議,但與這兩者不同的是,ICMP 通常不用於促進系統之間的數據交換。此外,它並不經常用於最終用戶網絡應用程序,除非它們是診斷工具。

ICMP 最初的定義由Jon Postel草擬,他為 Internet 的發展做出了大量和多次貢獻,ICMP 的第一個標準於1981年4 月在RFC 777 中發布。

顯然,最初的定義經歷了很多變化,才達到我們今天熟悉的形式。該協議的穩定形式在 1981 年 9 月的 RFC 792 中比其最初定義晚 5 個月發布,並且也是由 Postel 編寫的。

ICMP 是如何工作的?

簡而言之,ICMP 用於通過確定數據是否相對較快地到達其預定目的地來報告錯誤。

在基本場景中,兩個設備通過 Internet 連接並通過我們稱為數據包或數據報的方式交換信息。ICMP 所做的是生成錯誤並將它們與發送原始數據的設備共享,以防數據包永遠無法到達目的地。

例如,如果您發送的數據包太大而路由器無法處理,路由器將首先丟棄該數據包,然後它會生成一條錯誤消息,讓發送方設備知道其數據包從未到達其目的地。

然而,這就是我們所說的被動技能,因為您完全不需要做任何事情來接收這些錯誤消息(如果需要的話)。您很快就會發現,ICMP 還有一個更活躍的實用程序,您可以依靠它來執行各種網絡故障排除操作。

與 TCP 和 UDP 不同,ICMP 不需要連接設備即可發送消息。例如,在 TCP 連接中,連接的設備需要執行多步握手,然後才能傳輸數據。

使用 ICMP,無需建立連接;可以簡單地發送消息來代替連接。此外,與 TCP 和 UDP 相比,ICMP 消息不需要將消息定向到的端口,TCP 和 UDP 都使用特定端口來路由信息。ICMP 不僅不需要端口,而且實際上不允許針對特定端口。

ICMP 消息由 IP 數據包攜帶,但不包含在其中。相反,它們會搭載這些數據包,因為它們僅在其運營商(即 IP 數據包)從未到達其目的地時才會生成。通常情況下,允許 ICMP 數據包產生的情況源於失敗數據包的 IP 標頭中的可用數據。

由於ICMP 包含失敗數據包的IP 報頭數據,因此可以使用網絡分析工具來準確確定哪些IP 數據包未能傳送。然而,IP 報頭並不是 ICMP 數據包攜帶的唯一信息類型。

ICMP 數據包包含 IP 標頭,然後是 ICMP 標頭,以及有效載荷的前八個字節。

  • IP 標頭– 包含有關 IP 版本、源和目標 IP 地址、發送的數據包數量、使用的協議、數據包長度、生存時間 (TTL)、同步數據以及特定數據包的 ID 號的詳細信息
  • ICMP 標頭– 包含有助於對錯誤進行分類的代碼、通過提供描述來促進錯誤識別的子代碼以及校驗和
  • 傳輸層標頭– 有效載荷的前八個字節(通過 TCP 或 UDP 傳輸)

ICMP 控制消息

正如我們上面提到的,當發生錯誤時,可以使用 ICMP 頭的第一個字段中的值來識別它。這些錯誤類型及其標識符如下:

  • 0 – Echo Reply – 用於 ping 目的
  • 3 – 目的地不可達
  • 5 – 重定向消息 – 用於指示選擇不同的路由
  • 8 – Echo Request – 用於 ping 目的
  • 9 – Router Advertisement – 路由器用來宣布它們的 IP 地址可用於路由
  • 10 – 路由器請求 – 路由器發現、請求或選擇
  • 11 – Time Exceeded – TTL 到期或重組時間超過
  • 12 – 參數問題:錯誤的 IP 標頭 – 錯誤的長度、所需的選項丟失或指針指示的錯誤
  • 13 - 時間戳
  • 14 - 時間戳回复
  • 41 – 用於實驗性移動協議
  • 42 – 擴展迴聲請求 – 請求擴展迴聲
  • 43 – Extended Echo Reply – 回复 42 擴展的 Echo 請求
  • 253和254 – 實驗

TTL(生存時間)字段

TTL 字段是可以(並且經常會)生成 ICMP 錯誤的 IP 報頭字段之一。它包含一個值,該值是發送的數據包在到達其最終目的地之前可以通過的最大路由器數。

數據包被路由器處理後,這個值減一,這個過程一直持續下去,直到發生以下兩種情況之一:數據包到達目的地,或者值達到零,這通常是路由器丟棄包並向原始發送方發送 ICMP 消息。

所以不用說,如果一個數據包因為它的 TTL 達到零而被丟棄,這不是因為頭部中的數據損壞或路由器特定的問題。TTL 實際上旨在阻止惡意數據包阻止連接,並導致創建了一個對網絡故障排除至關重要的工具:Traceroute。

ICMP 在網絡診斷中的使用

如上所述,ICMP 可與診斷工具一起使用,以確定網絡連接是否正常運行。在閱讀我們的指南之前,您可能不知道 ICMP 是什麼,但我們確信您至少聽說過 ping,這是一種著名的網絡實用程序,可以讓您知道主機是否可訪問。

嗯,ping實際上是一個重要的工具,它使用 ICMP 作為其主幹。Traceroute是幫助我們診斷和解決網絡連接問題的工具的另一個很好的例子。Pathping是 ping 和 traceroute 的組合,是另一個很棒的基於 ICMP 的工具。

平

Ping是 Windows 內置工具,可通過 CMD 訪問,是使用 ICMP 解決潛在網絡錯誤的最重要工具之一。Ping使用上面列表中的兩個代碼,8(迴聲請求)和0(迴聲回复),更具體。

下面是兩個ping命令示例的樣子:

ping 168.10.26.7
ping TipsWebTech360.com

當你運行它時,ping會發送一個類型字段為 8 的 ICMP 數據包,並會耐心等待類型 0 的回复。回復到達後,ping將確定請求 (8) 與其回复 (0) 之間的時間,並將返回以毫秒錶示的往返值。

我們已經確定,ICMP 數據包通常是由於錯誤而生成和發送的。但是,請求(類型 8)數據包不需要錯誤才能發送,因此ping也可以在不觸發錯誤的情況下收到回复 (0)。

正如您可能從上面的示例中發現的那樣,您可以 ping 一個 IP 地址或一個主機。此外,ping有大量附加選項,您只需將選項附加到命令即可用於更高級的故障排除。

例如,使用-4選項將強制 ping 只使用IPv4,而-6將只使用IPv6地址。查看下面的屏幕截圖,了解可以附加到ping命令的完整選項列表。

什麼是ICMP?了解 Internet 控制消息協議

關於 ping 的一個常見誤解是,您可以使用它來測試目標系統上某些端口的可用性。長話短說,你不能這樣做,因為 ICMP 不像 TCP 或 UDP 那樣在主機之間進行任何真正的消息交換,並且不需要端口使用。

端口掃描器應用程序使用 TCP 或 UDP 數據包來確定特定端口是否開放和可訪問。如果該端口未處於活動狀態,這些工具將 TCP 或 UDP 數據包發送到特定端口,並生成類型 3(主機不可達)子類型 3(目標端口不可達)ICMP 消息。

跟踪路由

與 ping 非常相似,traceroute是另一種網絡故障排除工具,每個網絡管理員不僅應該在其工具帶中擁有,而且還應該掌握它。什麼traceroute的作用是幫助您完成,直到達到其指定的目的地地圖的所有設備的連接顛簸的路線。

因此,如果您有興趣查找您和另一台機器之間的完整路徑,traceroute可以為您提供準確的信息。此工具還可用於確定您的連接所遵循的路線是否有問題。

例如,如果連接路徑上的某個設備很難將您的數據包轉發到預期目的地,traceroute將讓您知道哪個路由器給了您延遲響應(或根本沒有響應)。

traceroute 的工作方式是發送一個TTL(生存時間)值為 0的數據包,它將被它遇到的第一個路由器自動丟棄,正如我們在上面的 TTL 部分中所解釋的。丟棄數據包後,路由器生成一個 ICMP 數據包並將其發送回traceroute。

該程序提取數據包的源地址,以及數據包返回所用的時間,然後發送另一個 TTL 值為1 的數據包。在第二個數據包通過網關後,其 TTL 減1(變為0)並前往第二個路由器,後者在檢測到零 TTL 值時丟棄該數據包並將 ICMP 數據包發送回traceroute。

每次traceroute收到一個 ICMP 數據包時,它都會將 TTL 增加 1 並將其發送回它的軌道,這個操作會一直持續下去,直到到達指定的目的地,或者 traceroute 用完跳數。默認情況下,Windows 分配的最大數量為30跳,但您可以通過在命令語法中指定來增加該數量。

以下是如何在 CMD 中運行traceroute的示例:

tracert TipsWebTech360.com

與 ping 非常相似,traceroute有一系列選項,如果您想更具體,可以將其附加到語法中。您可以強制使用IPv4或IPv6,但也可以跳過將地址解析為主機名並增加搜索目標的最大躍點數。查看下面的屏幕截圖以獲取traceroute使用示例以及您可以使用它的所有選項的列表。

什麼是ICMP?了解 Internet 控制消息協議

不過值得一提的是,traceroute只能為您提供實時信息。因此,如果您遇到連接速度變慢並想使用此工具進行調查,您可能會收到誤導性結果,​​因為在此期間路線可能已更改。

雖然可以通過使用-j選項並手動添加路由器地址來強制 traceroute 遵循特定路徑,但這樣做意味著您已經知道錯誤路徑。這有點自相矛盾,因為首先發現路徑要求您使用不帶-j選項的traceroute 。

如果您不完全喜歡使用CLI(命令行界面)工具,而是更喜歡GUI(圖形用戶界面)方法,那麼有許多用於 traceroute 的第三方軟件解決方案。SolarWinds 的 Traceroute NG 是我們能想到的最好的例子之一。我們有沒有提到它是完全免費的?

路徑

正如我們在上面簡要提到的,路徑完成了不可或缺的網絡故障排除工具的三重作用。從功能的角度來看,patphing是 ping 和 traceroute 的組合,因為它利用了上述二人組利用的所有三種消息類型:迴聲請求(8)、迴聲回复(0)以及超時(11)。

大多數情況下,路徑用於識別受高延遲和數據包丟失影響的連接節點。當然,您可以使用 traceroute 然後 ping 來獲取這些詳細信息,但是對於網絡管理員來說,在一個命令下同時使用這兩個工具的功能要方便得多。

使用路徑的缺點之一是完成查詢可能需要很長時間(每跳 25 秒才能產生 ping 統計信息)。Pathping 將顯示到指定目的地的路線和往返時間。

與 ping 和 traceroute 不同,pathping將重複 ping 其路徑中的每個路由器,從而提高其整體效率。但是,如果遇到禁用了 ICMP 功能的路由器,pathping將停止其對信息的請求,而 ping 仍然可以到達沒有 ICMP 功能的路由器,traceroute 將跳轉到其路徑中的下一個路由器並顯示一串星號對於任何非 ICMP 路由器。

Pathping是 Windows 內置工具,自 Windows NT 以來一直如此,因此您可以像使用 ping 或tracert一樣使用它:通過命令行。

以下是如何使用路徑的示例:

pathping TipsWebTech360.com -h 40 -w 2 -4

上面的命令將顯示到我們網站的路由,以及連接路徑中每個路由器的往返時間。此外,我們在示例中使用的選項會將默認最大躍點值從 30 增加到 40,為每個回复添加 2 毫秒的超時值並強制使用 IPv4。

查看下面的屏幕截圖,獲取路徑使用快速指南以及可以添加到命令語法中的選項列表。

什麼是ICMP?了解 Internet 控制消息協議

ICMP 在網絡攻擊中的適用性

儘管 ICMP 的範圍促進了許多連接故障排除操作,但該協議也可用於執行各種網絡攻擊。如果您在 Internet 上的時間夠長,您可能聽說過 ping 泛洪、DDoS、Ping of Death、Smurf 攻擊或 ICMP 隧道。

雖然其中一些攻擊現在用作PoC(概念證明),但其他攻擊仍被惡意代理用來損害啟用 Internet 的系統或被安全專家用來測試漏洞。

我們將從最流行的一個開始,它是 ping flood(順便說一下,仍然被廣泛使用),並解釋它如何使用 ICMP 來作惡。

平洪

使用 ping 發送迴聲請求並等待迴聲回复似乎是無害的。但是,如果不是等待回复,ping 只是發送大量的 ICMP 回顯請求呢?在這種經典的DoS (拒絕服務)攻擊場景中,如果攻擊成功,目標設備將經歷嚴重的滯後,甚至連接斷開。

如果攻擊者擁有比受害者多的帶寬,並且受害者向其收到的大量請求發送 ICMP 回顯回复,則此攻擊最有效,從而消耗傳入和傳出帶寬。

攻擊者可以為 ping 命令指定“洪水”選項,但此選項非常少見,並且未嵌入操作系統的內置工具中。例如,Windows 的 ping 沒有“洪水”選項,但有一些第三方工具集成了此功能。

如果 Ping Flood 攻擊變成DDoS (分佈式拒絕服務)攻擊,它真的會變成災難性的。DDoS 攻擊使用多個系統來針對單個系統,從而同時用來自多個位置的數據包來淹沒它。

保護自己免受 ping 泛洪攻擊的一種可靠方法是禁用路由器上的 ICMP 功能。如果您需要保護 Web 服務器免受此類攻擊,您還可以安裝Web 應用程序防火牆。

死亡之平

此攻擊涉及向目標計算機發送格式錯誤的 ping。在這種類型的攻擊中,發送的數據包將在有效載荷中包含大量填充物,這些填充物太大而無法一次處理。

然而,在發送之前,這個惡意 ping 將被分割成更小的部分,因為Internet 協議處理器不可能以其原始的、組合的形式傳輸它。

Ping of Death 所針對的計算機將接收數據塊並嘗試重新組合它們,然後再將惡意數據包發送到其目標應用程序。這就是損害發生的地方:如果組裝的數據包比目標計算機中的可用內存長,重新組裝它可能會導致緩衝區溢出、系統崩潰,甚至可能允許將惡意代碼注入受影響的機器。

好的一面是,Ping of Death 不再是新鮮事物,因為許多安全系統都能毫不費力地識別它並成功阻止它。

藍精靈攻擊

與前兩種攻擊類型相反,Smurf 攻擊不直接攻擊設備,而是利用同一網絡上的其他設備來協調對單個機器的分佈式 DoS 攻擊(DDoS)。

攻擊者需要其目標的 IP 地址和目標網絡的 IP 廣播地址。攻擊者將受害者的 IP 地址添加到 ICMP 數據包中(欺騙它),然後使用IP 廣播地址將它們廣播到目標網絡。

作為響應,連接到同一網絡的大多數設備都會向源 IP 地址發送回复(被替換以反映目標機器),如果網絡足夠大(有大量連接的設備),則可能會被流量淹沒。

因此,如果攻擊足夠嚴重,目標的計算機可能會變慢,甚至在給定的時間內無法使用。

和以前一樣,您只需關閉網關路由器的 ICMP 功能即可避免 Smurf 攻擊。另一種實現保護的方法是將來自網絡廣播 IP 地址的請求列入黑名單。

刺痛攻擊

Twinge 攻擊由發送大量欺騙性 ICMP 數據包以損害系統的程序引導。ICMP 數據包是假的,因為它們都使用隨機的假 IP 地址,但實際上,數據包來自單一來源(攻擊者的機器)。

據報導,ICMP 數據包包含一個簽名,可以表明攻擊並非來自多個來源,而是在 Twinge 的幫助下進行了協調。

儘管如果計劃得當,這種攻擊可能是災難性的,但關閉網關路由器上的 ICMP 並安裝防火牆或入侵檢測系統可以幫助您保護自己免受攻擊。

ICMP隧道

默認情況下,路由器僅掃描 ICMP 數據包的標頭,這使得實際上包含大量附加數據的數據包可以輕鬆繞過檢測,只要它們包含 ICMP 部分。這種類型的攻擊稱為 ping 或 ICMP 隧道。幸運的是,標準的 ping 實用程序不能通過防火牆和網關進行隧道傳輸,因為 ICMP 隧道需要仔細適應它們打算使用的網絡。

另一方面,攻擊者可以使用和模擬大量在線資源來模擬這樣的隧道,讓他們可以自由通過專用網絡和連接到它的機器。和以前一樣,關閉網關路由器上的 ICMP 功能、使用防火牆和執行嚴格的黑名單規則對於避免此類攻擊至關重要。

ICMP – 結論

考慮到所有因素,儘管 ICMP 不像 TCP 和 UDP 那樣用於在給定網絡上的連接設備之間交換信息,但它仍然具有巨大的適用範圍。事實上,ICMP 是最靈活的基礎協議之一,有助於保持 Internet 以我們所知的方式運行。

除了讓一個系統知道它與另一個系統的連接何時出現阻塞的基本目的之外,ICMP 還是眾多故障排除工具(例如 ping、pathping 和 traceroute)的支柱。不幸的是,它還幫助惡意代理向易受攻擊的機器提供廣泛的 DoS 和滲透攻擊。

留下評論

如何在自架的 Matrix 伺服器上限制使用者註冊

如何在自架的 Matrix 伺服器上限制使用者註冊

比較在 Synapse 上控制新 Matrix 帳戶的方法,從停用公用註冊到頒發有限用途的令牌,並提供設定範例和檢查。

修復 ownCloud 空白頁/白屏死機:選擇正確的恢復路徑

修復 ownCloud 空白頁/白屏死機:選擇正確的恢復路徑

修正 ownCloud 空白頁問題,首先要區分瀏覽器、PHP、應用程式、權限、升級和代理故障,然後選擇幹擾最小的復原路徑。

如何修復 Zimbra 的「Nginx 代理服務已停止」錯誤

如何修復 Zimbra 的「Nginx 代理服務已停止」錯誤

診斷 Zimbra 停止的 NGINX 代理,讀取正確的日誌,安全地重新啟動它,並檢查針對缺失配置、無效連接埠、憑證和上游故障的修復措施。

修正 Zimbra Amavis 佔用 100% CPU 且不中斷郵件流的問題

修正 Zimbra Amavis 佔用 100% CPU 且不中斷郵件流的問題

在進行任何有風險的變更之前,請先檢查佇列、日誌、SpamAssassin、ClamAV 和復原跡象,以了解如何診斷和修復 Zimbra Amavis CPU 佔用率達到 100% 的問題。

修正 iPhone 上的 Zimbra ActiveSync 連線錯誤

修正 iPhone 上的 Zimbra ActiveSync 連線錯誤

透過檢查帳戶詳細資料、憑證、憑證、網路路徑和伺服器策略來排查 iPhone 上的 Zimbra ActiveSync 錯誤,並比較安全的替代方案。

ownCloud Infinite Scale 與 Nextcloud 28:效能與記憶體使用情況詳解

ownCloud Infinite Scale 與 Nextcloud 28:效能與記憶體使用情況詳解

從架構、效能表現、記憶體需求、快取、擴充和實際部署權衡等方面比較 ownCloud Infinite Scale 和 Nextcloud 28。

修正 Nextcloud “事務性檔案鎖定未設定”錯誤

修正 Nextcloud “事務性檔案鎖定未設定”錯誤

透過檢查部署、設定 Redis 或 KeyValueCache、重新啟動相關服務以及驗證檔案操作,修復 Nextcloud 的事務性檔案鎖定警告。

如何為 Zimbra 設定外部 LDAP 身份驗證

如何為 Zimbra 設定外部 LDAP 身份驗證

透過實際的 CLI 範例、TLS 指南、綁定 DN 和搜尋過濾器模式、驗證步驟和回滾檢查,為 Zimbra 設定外部 LDAP 驗證。

如何在 BigBlueButton 中設定自動錄製清理

如何在 BigBlueButton 中設定自動錄製清理

使用 cron 任務、保留規則、日誌和驗證功能,設定安全的 BigBlueButton 自動化錄製清理機制。比較原始資料清理和完整錄製刪除的效果。

如何透過 RTMP 設定 Jitsi Meet 直播到 YouTube

如何透過 RTMP 設定 Jitsi Meet 直播到 YouTube

比較 Jibri 和 OBS 在將 Jitsi Meet 直播到 YouTube 方面的效能,然後配置正確的路由,安全地使用您的直播金鑰,並驗證即時預覽。