拒绝带有 ICMP 错误的 IP 数据包,还是直接丢弃它们?

信息安全 网络 防火墙 ddos iptables
2021-08-13 11:25:25

考虑一个面向 Internet 的主机(外部防火墙)。应该如何处理不希望的流量:直接丢弃它,或者发回 ICMP 错误,例如端口不可达?(在 Linux 术语中:iptables -P DROPiptables -j REJECT?)

这与我们网络的安全无关,数据包不会以任何方式进入。这是关于成为一个好公民。REJECT如果传入的数据包具有欺骗性的来源,则可以使我们的防火墙参与 DDoS。但它总是正确的选择吗?在某些情况下最好发回正确的 ICMP 错误?

2个回答

我通常投票支持发回 UDP 的 ICMP 错误和 TCP 的 RST 数据包。它确实使调试问题变得更加容易。它还可以防止烦人的超时:邮件和 IRC 服务器经常尝试进行身份查询或检查客户端是否不是开放代理。

如果在最外面的防火墙上完成,则不会泄露相关信息。根据设置,它甚至可能隐藏有防火墙。如果没有答案,很明显有一个黑洞。

重要的是,服务器不为发送到广播地址的数据包发送应答,以防止在 DoS 情况下产生放大效应。在这种情况下防火墙发送错误消息是可以的,导致只有一个答案。

ICMP-errors 和 TCP-RST 数据包不大于最小的原始数据包。所以这些对于 DDoS 攻击来说并不有趣。

编辑:DNS 权威服务器(和配置错误的 DNS 解析器)对于反射 DDoS 攻击更有趣,因为 DNS 答案比查询大,因此可以免费为攻击者提供放大。

您提到iptables,所以您是在暗示 linux (至少作为具有可调网络策略的操作系统的示例)。

很长一段时间以来,linux对发送的ICMP错误消息的数量是有限制的。默认值非常低:1 条消息/秒。

linux 的这种行为可以通过网络sysctl参数进行调整:icmp_ratelimit sysctl

icmp_ratelimit - 整数
    限制发送类型匹配的 ICMP 数据包的最大速率
    icmp_ratemask(见下文)到特定目标。
    0 禁用任何限制,
    否则响应之间的最小间隔(以毫秒为单位)。
    默认值:1000

请注意,默认情况下icmp_ratelimit仅适用于 ICMP 错误消息和源抑制,并非所有 ICMP 回复:

icmp_ratemask - 整数
    由 ICMP 类型制成的掩码,其速率受到限制。
    有效位:IHGFEDCBA9876543210
    默认掩码:0000001100000011000 (6168)

    位定义(参见 include/linux/icmp.h):
        0 回声回复
        3目标不可达 * 
        4源淬火 *
        5 重定向
        8 回声请求
        B超时 * 
        C参数问题 *
        D 时间戳请求
        E 时间戳回复
        F 信息请求
        G信息回复
        H 地址掩码请求
        我地址掩码回复

    * 这些默认情况下是速率限制的(请参阅上面的默认掩码)

因此默认情况下,此速率限制不适用于回显。

在默认设置下,使用 linux 机器发送的 ICMP 错误消息对目标进行 DOS 处理似乎非常困难。

(...) ICMP 不可达数据包非常小

不,它们并不总是很小的:在 linux 下,ICMP 错误消息将尽可能多地从导致它的数据包中捕获上下文,直到 576(或目标 MTU),以便甚至可以对错误消息进行解复用当使用 IP 中的复杂封装时,遵循RFC 1812

4.3.2.3 原始消息头

   从历史上看,每个 ICMP 错误消息都包含 Internet
   报头和数据报的至少前 8 个数据字节
   触发了错误。这不再足够,因为使用
   IP-in-IP 隧道和其他技术。因此,ICMP
   数据报应该包含尽可能多的原始数据报
   ICMP 数据报的长度不超过 576 字节。