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

您可能听说过ICMP,即使您不是技术专家,也可能知道它与互联网密切相关。

实际上,ICMP是一种协议,类似于IP、TCP和UDP。它在维护我们网络连接的稳定性和可靠性方面发挥着至关重要的作用。

ICMP主要用于检测和处理网络连接问题。接下来,我们将深入探讨ICMP的工作原理及其如何帮助我们保持最佳网络连接状态。

什么是ICMP?

互联网控制消息协议,通常以其缩写ICMP为人所知,是一种基础协议,用于解决各种网络连接问题。

各种网络设备,包括路由器、调制解调器和服务器,都使用此协议来通知其他网络参与者潜在的连接问题。

如前所述,ICMP是一种协议,与TCP和UDP类似,但与后两者不同,ICMP通常不用于促进系统间的数据交换。此外,它不常用于最终用户的网络应用程序,除非它们是诊断工具。

ICMP最初由Jon Postel定义,他对互联网的发展做出了巨大贡献。ICMP的第一个标准于1981年4月在RFC 777中发布。

当然,最初的定义经历了很多修改才演变成我们今天熟悉的形式。 该协议的稳定版本于1981年9月在RFC 792中发布,也是由Postel编写的。

ICMP的工作原理

简单来说,ICMP用于通过确定数据是否能够相对较快地到达其目的地来进行错误报告。

在基本场景中,两个设备通过互联网连接,并使用数据包或数据报交换信息。如果数据包无法到达目的地,ICMP会生成错误并将其发送回原始发送设备。

例如,如果您发送的数据包太大而路由器无法处理,路由器将丢弃该数据包,并生成一条错误消息,告知发送设备其数据包未能到达目的地。

但是,这是一个被动过程,您无需采取任何措施即可接收这些错误消息。 您很快会发现,ICMP还可以主动用于各种网络故障排除操作。

与TCP和UDP不同,ICMP无需建立连接即可发送消息。例如,在TCP连接中,连接的设备需要执行多步握手才能传输数据。

使用ICMP,无需建立连接;可以直接发送消息。此外,与TCP和UDP相比,ICMP消息不需要将消息定向到的端口,它们都使用特定端口来路由信息。ICMP不仅不需要端口,而且实际上不允许针对特定端口。

ICMP消息由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 实验

TTL(生存时间)字段

TTL字段是IP报头中可以生成ICMP错误的字段之一。它包含一个值,该值表示发送的数据包在到达其最终目的地之前可以通过的最大路由器数量。

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

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

ICMP在网络诊断中的使用

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

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

Ping

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

以下是两个ping命令的示例:

ping 168.10.26.7

ping wdzwdz.com

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

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

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

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

关于ping的一个常见误解是,您可以使用它来测试目标系统上某些端口的可用性。简而言之,您不能这样做,因为ICMP不像TCP或UDP那样在主机之间进行真正的消息交换,并且不需要使用端口。

端口扫描应用程序使用TCP或UDP数据包来确定特定端口是否打开和可访问。这些工具将TCP或UDP数据包发送到特定端口,如果该端口不活动,则会生成类型3(主机不可达)子类型3(目标端口不可达)ICMP消息。

Traceroute

与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 wdzwdz.com

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

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

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

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

Pathping

正如我们前面简要提到的,pathping完善了不可或缺的网络故障排除工具的三重奏。从功能的角度来看,pathping是ping和traceroute的组合,因为它利用了上述二者所使用的所有三种消息类型:回声请求(8)、回声回复(0)和时间超出(11)。

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

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

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

Pathping是自Windows NT以来就内置在Windows中的工具,因此您可以像使用ping或tracert一样通过命令行使用它。

以下是如何使用pathping的示例:

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

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

请看下面的屏幕截图,其中提供了有关pathping的快速指南以及可以添加到命令语法中的选项列表。

ICMP在网络攻击中的适用性

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

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

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

Ping洪水

使用ping发送回声请求并等待回声回复似乎是无害的。但是,如果ping不等待回复,而是发送大量ICMP回声请求,会发生什么?在这种经典的DoS(拒绝服务)攻击场景中,如果攻击成功,目标设备会经历严重的延迟,甚至失去连接。

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

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

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

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

死亡之Ping

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

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

死亡之Ping所针对的计算机将接收这些块,并尝试重新组装它们,然后将恶意数据包发送到其目标应用程序。这就是损坏发生的地方:如果组装的数据包比目标计算机中的可用内存长,则重新组装它可能导致缓冲区溢出、系统崩溃,甚至可能允许将恶意代码注入到受影响的机器中。

从好的方面来说,死亡之Ping不再是一种新鲜事物,因为许多安全系统可以毫不费力地识别它并成功阻止它。

Smurf攻击

与前两种攻击类型相反,Smurf攻击不直接攻击设备,而是利用同一网络上的其他设备来协调针对单个机器的分布式DoS攻击(DDoS)。

攻击者需要其目标的IP地址和目标网络的IP广播地址。攻击者将受害者的IP地址添加到ICMP数据包中(欺骗它),然后使用IP广播地址将它们广播到目标的网络。

作为响应,大多数连接到同一网络的设备都会向源IP地址发送回复(替换以反映目标的机器),如果网络足够大(有大量连接的设备),则可能会被流量淹没。

结果,如果攻击足够严重,目标的计算机可能会变慢,甚至在给定的一段时间内无法使用。

与以前一样,您只需关闭网关路由器的ICMP功能即可避免Smurf攻击。实现保护的另一种方法是将来自网络广播IP地址的请求列入黑名单。

Twinge攻击

Twinge攻击由发送大量欺骗性ICMP数据包以损害系统的程序引发。ICMP数据包是假的,因为它们都使用随机的假IP地址,但实际上,这些数据包来自单一来源(攻击者的机器)。

据报道,ICMP数据包包含一个签名,可以泄露攻击并非来自多个来源,而是在Twinge的帮助下进行协调的事实。

尽管如果计划得当,这种攻击可能是灾难性的,但关闭网关路由器上的ICMP并安装防火墙或入侵检测系统可以帮助您保护自己免受攻击。

ICMP隧道

默认情况下,路由器只扫描ICMP数据包的标头,这使得实际上包含大量附加数据的数据包可以轻松绕过检测,只要它们包含ICMP部分即可。这种类型的攻击称为ping或ICMP隧道。幸运的是,标准ping实用程序无法通过防火墙和网关进行隧道传输,因为ICMP隧道需要仔细调整以适应其预期的网络。

另一方面,攻击者可以使用大量在线资源并模拟这样的隧道,从而使他们可以自由地穿过专用网络和与之连接的计算机。与以前一样,关闭网关路由器上的ICMP功能、使用防火墙以及实施严格的黑名单规则对于避免此类攻击至关重要。

ICMP – 结论

总而言之,尽管ICMP不像TCP和UDP那样用于在给定网络上的连接设备之间交换信息,但它仍然具有巨大的应用范围。事实上,ICMP是最灵活的基础协议之一,有助于保持互联网的正常运行。

除了让一个系统知道何时与另一个系统的连接受阻之外,ICMP还是许多故障排除工具(如ping、pathping和traceroute)的支柱。不幸的是,它还帮助恶意代理向易受攻击的计算机提供了各种DoS和渗透攻击。