考虑一个面向 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 字节。