Should I block ICMP?

No!!

The Problem

很多网络管理员认为 ICMP 是一种安全风险,因此应该始终在防火墙上屏蔽它。诚然,ICMP 的确存在一些安全问题,很多 ICMP 流量也应该被屏蔽。但这并不是屏蔽所有 ICMP 流量的理由!

ICMP 有很多重要的功能;有些对于故障排除很有用,有些对于网络的正常运行至关重要。以下是一些您应该了解并考虑允许通过网络的重要的 ICMP 流量的详细信息。

Echo Request and Echo Reply IPv4 - Echo Request (Type8, Code0) and Echo Reply (Type0, Code0) IPv6 - Echo Request (Type128, Code0) and Echo Reply (Type129, Code0)

我们都知道这些 - ping 是我们最早学习的故障排除工具之一。是的,如果你启用它,这意味着你的主机现在是可被发现的 - 但你的 Web 服务器难道不是已经在 80 端口上监听了吗?当然,如果你真的想在你的 DMZ 边界上阻止它,那可以。但是,在你的网络内部阻止 ping 流量不会给你带来太多好处,除了增加故障排除的难度(“你能 ping 你的默认网关吗?”,“不能,但我一直都不能,所以这说明不了什么!”)。

请记住,你也可以有针对性地允许它;你可以决定让 Echo Requests 从你的网络出去到 Internet,并允许 Echo Replies 从 Internet 进入你的网络,但反之则不行。

Fragmentation Needed (IPv4) / Packet Too Big (IPv6) IPv4 - (Type3, Code4) IPv6 - (Type2, Code0)

这些很重要。非常重要。它们是 Path MTU Discovery (PMTUD) 的一个重要组成部分,PMTUD 是 TCP 的一个重要组成部分,它允许两个主机调整它们的 TCP Maximum Segment Size (MSS) 值,使其适合两个主机之间链路路径上的最小 MTU。如果两个主机之间的路径上的 MTU 小于它们自己的本地链路,并且没有发现此情况的方法,则流量会被静默地黑洞;换句话说,“你将会遇到麻烦”。

设置了 DF bit 的 IPv4 数据包(大多数都是!),或者 IPv6 数据包(记住 IPv6 中路由器不进行分片),如果对于路由器来说太大而无法通过接口传输,将导致该路由器丢弃该数据包,并生成一个 Fragmentation Needed / Packet Too Big ICMP 错误返回给源,其中还包含太小链路的 MTU。如果此错误无法到达发送方,则发送方只会将来自接收方的 ACK 缺失解释为拥塞/丢失并重新传输,当然这也会被丢弃。这种行为很难进行故障排除,因为 TCP 握手都可以正常工作,因为它们是小数据包,但是一旦发生任何大量数据传输,会话就会停滞。

RFC 4821 的开发是为了帮助主机使用 Packetization Layer Path MTU Discovery (PLPMTUD) 来解决此问题,PLPMTUD 通过逐步增加 MSS 来尝试找到适合该路径的值来发现路径 MTU。这消除了对 ICMP 的依赖性,并且在大多数 OS 网络堆栈中都可用,但不如直接了解最大 MTU 应该是什么效率高。所以请在一开始就允许这些 ICMP 消息通过,好吗?

Time Exceeded IPv4 - (Type11, Code0) IPv6 - (Type3, Code0)

Traceroute 是一个非常有用的工具,用于排除两个主机之间网络连接的故障,详细说明路径上的每个跃点。它通过发送 TTL 为 1 的数据包来实现,以便第一个跃点发送回 Time Exceeded 消息(包括其自身的源 IP),然后发送 TTL 为 2 的数据包,依此类推,以发现路径上的每个跃点。

还记得你之前运行它时,得到一个或两个无法在跟踪中发现的跃点吗?或者更糟的是,你尝试 traceroute 到一个主机,每个 跃点都无法被发现。很烦人,对吧?那是因为运行那些路由器的人(或者你的本地防火墙)决定阻止 ICMP Time Exceeded 消息。不要做那样的人,好吗?

NDP and SLAAC (IPv6) Router Solicitation (RS) (Type133, Code0) Router Advertisement (RA) (Type134, Code0) Neighbour Solicitation (NS) (Type135, Code0) Neighbour Advertisement (NA) (Type136, Code0) Redirect (Type137, Code0)

虽然 IPv4 使用 Address Resolution Protocol (ARP) 进行第 2 层到第 3 层的映射,但 IPv6 采用不同的方法,即 Neighbour Discovery Protocol (NDP)。 NDP 提供了许多功能,包括路由器发现、前缀发现、地址解析等等。 除了 NDP,StateLess Address AutoConfiguration (SLAAC) 允许在网络上动态配置主机,在概念上类似于 DHCP(尽管 DHCPv6 确实存在用于更精细的控制)。

为了使 IPv6 的这些功能正常运行,应在你的网络内(而不是跨越你的边界)允许这五种 ICMP 类型。

A Word About Rate Limiting

虽然像本页介绍的 ICMP 消息非常有用,但请记住,生成所有这些消息会占用你的路由器上的 CPU 时间,并会生成流量。你真的期望在正常情况下,每秒钟通过你的防火墙获得 1000 个 ping 吗?如果你看到它,它会被认为是合法的流量吗?不,可能不是。根据你的网络情况,对所有这些 ICMP 流量类型进行速率限制;这是一个不应被忽视的良好防御措施。

Read, Research, Understand

鉴于关于 ICMP 的“阻止还是不阻止”的讨论似乎总是导致混乱、愤怒和近乎狂热的分歧,请继续并自己阅读有关该主题的内容。花时间尽可能全面地理解它;仅在本页中就有大量的链接。然后你可以形成自己的观点,并就最适合你的网络做出明智的选择。