什么是ICMP? 了解 Internet 控制消息协议

您可能听说过 ICMP,如果您只是精通技术,您可能(至少)知道它与 Internet 有关。

ICMP 实际上是一个协议,很像 IP、TCP 和 UDP(我们之前讨论和解释过),因此它在我们的 Internet 连接的良好运行中起着相当重要的作用。

ICMP 更多地与检测和处理连接问题的方式有关,但我们不要过多地破坏我们的讲座。 如果您想了解什么是 ICMP 以及它如何帮助我们将连接保持在最佳水平,请继续阅读。

什么是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 消息不需要将消息定向到的端口,它们都使用特定端口来路由信息。 ICMP 不仅不需要端口,而且实际上不允许针对特定端口。

ICMP 消息由 IP 数据包携带,但不包含在其中。 相反,它们搭载这些数据包,因为它们仅在其载体(即 IP 数据包)从未到达其目的地时才生成。 通常情况下,允许产生 ICMP 数据包的情况是由失败数据包的 IP 标头中可用的数据引起的。

由于 ICMP 包含失败数据包的 IP 报头数据,因此可以使用网络分析工具准确确定哪些 IP 数据包未能传递。 但是,IP 标头不是 ICMP 数据包携带的唯一信息类型。

ICMP 数据包包含 IP 标头,后跟 ICMP 标头,以及有效负载的前 8 个字节。

IP 标头 – 包含有关 IP 版本、源和目标 IP 地址、发送数据包数量、使用的协议、数据包长度、生存时间 (TTL)、同步数据以及特定数据包的 ID 号的详细信息
ICMP 标头 – 包含有助于对错误进行分类的代码、通过提供描述来促进错误识别的子代码以及校验和
传输层标头——有效载荷的前 8 个字节(通过 TCP 或 UDP 传输)

ICMP 控制消息

正如我们上面提到的,当发生错误时,可以使用 ICMP 标头的第一个字段中的值来识别它。 这些错误类型及其标识符如下:

0 – Echo Reply – 用于 ping 目的
3 – 无法到达目的地
5 – 重定向消息 – 用于指示选择不同的路线
8 – 回声请求 – 用于 ping 目的
9 – 路由器广告 – 路由器用于宣布其 IP 地址可用于路由
10 – 路由器请求 – 路由器发现、请求或选择
11 – Time Exceeded – TTL 过期或超过重组时间
12 – 参数问题:错误的 IP 标头 – 错误的长度、缺少所需的选项或指针指示的错误
13 – 时间戳
14 – 时间戳回复
41 – 用于实验性移动协议
42 – Extended Echo Request – 请求扩展 Echo
43 – Extended Echo Reply – 回复 42 扩展 Echo 请求
253 和 254 – 实验

  如何将音乐添加到 Google 幻灯片

TTL(生存时间)字段

TTL 字段是可以(并且经常会)生成 ICMP 错误的 IP 标头字段之一。 它包含一个值,该值是发送的数据包在到达其最终目的地之前可以通过的最大路由器数量。

数据包被路由器处理后,该值减 1,并且该过程继续进行,直到发生以下两种情况之一:数据包到达其目的地,或者该值达到 0,通常随后路由器丢弃该数据包。数据包并向原始发送者发送 ICMP 消息。

因此,不用说,如果一个数据包因为其 TTL 达到零而被丢弃,这不是因为标头中的数据损坏或特定于路由器的问题。 TTL 实际上旨在阻止恶意数据包阻碍连接,并导致创建了一个对网络故障排除至关重要的工具:Traceroute。

ICMP 在网络诊断中的使用

如上所述,ICMP 可与诊断工具一起使用,以确定网络连接是否运行良好。 在阅读我们的指南之前,您可能还不知道 ICMP 是什么,但我们确信您至少听说过 ping,这是一种著名的网络实用程序,可让您知道主机是否可访问。

好吧,ping 实际上是一个使用 ICMP 作为其主干的重要工具。 Traceroute 是另一个很好的工具示例,可帮助我们诊断和解决网络上的连接问题。 Pathping 是 ping 和 traceroute 的组合,是另一个很棒的基于 ICMP 的工具。

Ping 是一个内置的 Windows 工具,可以通过 CMD 访问,是使用 ICMP 解决潜在网络错误的最重要工具之一。 更具体地说,Ping 使用了上面列表中的两个代码,8(回显请求)和 0(回显回复)。

下面是两个 ping 命令示例的样子:

平 168.10.26.7
ping wdzwdz.com

当你运行它时,ping 会发送一个 ICMP 数据包,其 type 字段中的代码为 8,并会耐心等待 type 0 的回复。 回复到达后,ping 将确定请求 (8) 与其回复 (0) 之间的时间,并将返回以毫秒表示的往返值。

我们已经确定 ICMP 数据包通常是由于错误而生成和发送的。 但是,请求(类型 8)数据包不需要错误即可发送,因此 ping 也可以收到回复(0)而不会触发错误。

正如您可能从上面的示例中得出的那样,您可以 ping 一个 IP 地址或主机。 此外,ping 具有大量附加选项,您只需将选项附加到命令即可用于更高级的故障排除。

例如,使用 -4 选项将强制 ping 仅使用 IPv4,而 -6 将仅使用 IPv6 地址。 查看下面的屏幕截图,了解可以附加到 ping 命令的完整选项列表。

  如何使用 Excel 的分屏功能

关于 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加一并返回到它的轨道上,这个操作一直持续下去,直到到达指定的目的地,或者traceroute用完跳数。 默认情况下,Windows 最多分配 30 个跃点,但您可以通过在命令语法中指定它来增加它。

这是一个如何在 CMD 中运行 traceroute 的示例:

tracert wdzwdz.com

与 ping 非常相似,traceroute 有一系列选项,如果您想更具体一些,您可以将其附加到语法中。 您可以强制使用 IPv4 或 IPv6,但也可以跳过将地址解析为主机名并增加搜索目标的最大跃点数。 查看下面的屏幕截图,了解 traceroute 使用示例以及您可以使用的所有选项的列表。

不过值得一提的是,traceroute 只能为您提供实时信息。 因此,如果您遇到连接速度变慢并想使用此工具进行调查,您可能会收到误导性结果,因为在此期间路由可能已更改。

虽然可以通过使用 -j 选项并手动添加路由器地址来强制跟踪路由遵循特定路径,但这样做意味着您已经知道错误路径。 这有点自相矛盾,因为首先发现路径需要您使用不带 -j 选项的 traceroute。

如果您不完全喜欢使用 CLI(命令行界面)工具,并且更喜欢 GUI(图形用户界面)方法,那么有许多用于 traceroute 的第三方软件解决方案。 SolarWinds 的 Traceroute NG 是我们能想到的最佳示例之一。 我们提到它是完全免费的吗?

寻路

正如我们上面简要提到的,路径查找完成了不可或缺的网络故障排除工具的三重奏。 从功能的角度来看,patphing 是 ping 和 traceroute 的组合,因为它利用了上述二人组利用的所有三种消息类型:echo request (8)、echo reply (0) 以及 time exceeded (11)。

大多数情况下,路径是用来识别受高延迟和丢包影响的连接节点。 当然,您可以使用 traceroute 然后 ping 来获取这些详细信息,但是在一个命令下拥有这两个工具的功能对于网络管理员来说要方便得多。

使用路径的缺点之一是完成查询可能需要相当长的时间(每跳需要 25 秒才能产生 ping 统计信息)。 Pathping 将向您显示到指定目的地的路线和往返时间。

与 ping 和 traceroute 不同,pathping 会重复 ping 其路径中的每个路由器,从而提高其整体效率。 但是,如果遇到禁用了 ICMP 功能的路由器,pathping 将停止其对信息的请求,而 ping 仍然可以到达没有 ICMP 功能的路由器,并且 traceroute 将跳转到其路径中的下一个路由器并显示一串星号对于任何非 ICMP 路由器。

Pathping 是一种 Windows 内置工具,自 Windows NT 以来一直采用这种方式,因此您可以像使用 ping 或 tracert 一样使用它:通过命令行。

这是一个如何使用路径的示例:

寻路 wdzwdz.com -h 40 -w 2 -4

上面的命令将向您显示到我们网站的路由,以及到连接路径中每个路由器的往返时间。 此外,我们在示例中使用的选项将默认最大跳数值从 30 增加到 40,为每个回复添加 2 毫秒的超时值并强制 IPv4。

  草案控制跟踪 DOCX、页面和其他格式的文档更改 [OS X]

查看下面的屏幕截图,了解路径使用快速指南和可以添加到命令语法的选项列表。

ICMP 在网络攻击中的适用性

尽管 ICMP 的范围促进了许多连接故障排除操作,但该协议也可以被利用来执行各种网络攻击。 如果您在 Internet 上的时间足够长,您可能听说过 ping 泛洪、DDoS、Ping of Death、Smurf 攻击或 ICMP 隧道。

虽然其中一些攻击现在用作 PoC(概念证明),但其他攻击仍然被恶意代理用来破坏支持 Internet 的系统或被安全专家用来测试漏洞。

我们将从最流行的一种开始,即 ping flood(顺便说一下,仍然被广泛使用),并解释它如何使用 ICMP 来作恶。

平洪水

使用 ping 发送 echo 请求并等待 echo 回复似乎是无害的。 但是,如果 ping 不等待回复,而是发送大量 ICMP 回显请求,该怎么办? 在这种经典的 DoS(拒绝服务)攻击场景中,如果攻击成功,目标设备将经历严重的滞后,甚至连接断开。

如果攻击者拥有比受害者更多的带宽,并且如果受害者向它收到的大量请求发送 ICMP 回显回复,则此攻击最有效,从而消耗传入和传出带宽。

攻击者可以为 ping 命令指定一个“洪水”选项,但该选项非常罕见,并且没有嵌入操作系统的内置工具中。 例如,Windows 的 ping 没有“洪水”选项,但有一些第三方工具集成了此功能。

如果 ping 洪水攻击变成 DDoS(分布式拒绝服务)攻击,它真的会变成灾难性的。 DDoS 攻击使用多个系统来针对单个系统,从而一次将来自多个位置的数据包压倒它。

保护自己免受 ping 洪水攻击的一种可靠方法是禁用路由器上的 ICMP 功能。 如果您需要保护 Web 服务器免受此类攻击,您还可以安装 Web 应用程序防火墙。

死亡之平

此攻击涉及向目标计算机发送格式错误的 ping。 在这种类型的攻击中,发送的数据包将在有效负载中包含大量填充物,这些填充物太大而无法一次处理。

然而,在发送之前,这个恶意 ping 将被分割成更小的部分,因为 Internet 协议处理器不可能以原始的组装形式传输它。

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 和渗透攻击。