考虑一个面向 Internet 的主机(外部防火墙)。应该如何处理不希望的流量:直接丢弃它,或者发回 ICMP 错误,例如端口不可达?(在 Linux 术语中:iptables -P DROP
或iptables -j REJECT
?)
这与我们网络的安全无关,数据包不会以任何方式进入。这是关于成为一个好公民。REJECT
如果传入的数据包具有欺骗性的来源,则可以使我们的防火墙参与 DDoS。但它总是正确的选择吗?在某些情况下最好发回正确的 ICMP 错误?
考虑一个面向 Internet 的主机(外部防火墙)。应该如何处理不希望的流量:直接丢弃它,或者发回 ICMP 错误,例如端口不可达?(在 Linux 术语中:iptables -P DROP
或iptables -j REJECT
?)
这与我们网络的安全无关,数据包不会以任何方式进入。这是关于成为一个好公民。REJECT
如果传入的数据包具有欺骗性的来源,则可以使我们的防火墙参与 DDoS。但它总是正确的选择吗?在某些情况下最好发回正确的 ICMP 错误?
我通常投票支持发回 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 字节。