Raspberry Pi 上的 failed2ban 日志解析太慢 - 选项?

Raspberry Pi 上的 failed2ban 日志解析太慢 - 选项?

我在 950MHz 的 Raspberry Pi 上运行fail2ban,但我无法进一步超频。

Pi 有时会在特定端口上遭受 SYN 洪水攻击。我已经设置了 iptables 来限制感兴趣端口上的 SYN 速率;当超过限制时,发送 SYN 的主机将被放入 REJECT 链中,并记录超出限制的特定 SYN 数据包。

然后,fail2ban 会监视这些记录的 SYN,并在看到一些 SYN 后,暂时禁止主机一段时间(这是我正在使用的应用程序中的一个暂时性问题)。

问题是 SYN 泛洪有时会达到速度太快,fail2ban 无法跟上的速度;我每秒会看到 20-40 条日志消息,最终fail2ban 会落后并变得无效。雪上加霜的是,它在试图追赶的过程中继续消耗大量的 CPU。

我已经验证来自已经被fail2ban禁止的主机的DROP链接数据包是不是已记录,因此不会增加其负载。

我在这里有什么选择?我有一些想法,但没有明确的前进道路。

  1. 我可以使日志解析正则表达式“更容易”,从而减少周期吗?使用 iptables --log-prefix 将令牌放在日志消息的开头附近,和/或以其他方式简化/改变fail2ban 正则表达式是否有帮助?这是当前包含正则表达式的fail2ban配置行:
    failregex = kernel:.*?SRC=(?:::f{4,6}:)?(?P<host>[\w\-.^_]+) DST.*?SYN

  2. 有没有比解析 kern.log 更快的方法来让 fail2ban 监视超出限制的数据包?

  3. fail2ban 可以在 PyPy 而不是 CPython 下运行,只需最少的非标准魔法(操作系统是 Raspbian 7,所以主要是 Debian 7)?

  4. 有没有比fail2ban更好的东西,我可以用它来监视超出SYN限制的数据包,并在X秒内超过N个数据包后,暂时将有问题的IP放入iptables DROP存储桶中,并在禁止计时器到期时将其取出?再说一次,我非常喜欢一个尽可能多地使用 Debian 中可用软件的解决方案,尽管我可以在紧要关头构建 Debian 软件包。

答案1

与您的问题有点偏离主题,但是当遇到中等程度的 SYN 泛洪时,SYN cookie 可能是一种合适且简单的缓解措施。

# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

谷歌一些,以了解为什么这可能是一个好主意或坏主意。

或者,由于您已经配置了内核防火墙,因此您可以使用“最近的”iptables 模块作为限制器来完全规避fail2ban:

# iptables -A INPUT -p tcp -m state --state NEW -m recent --name ftp_limit --update --seconds 60 --hitcount 20 -j DROP
# iptables -A INPUT -p tcp -m state --state NEW -m recent --set --name ftp_limit -m tcp --dport 21 -j ACCEPT

对于名为 ftp_limit 的列表中的 IP 地址,这些规则将 SYN 请求(新连接)的速率从 1 个 IP 限制为每分钟 20 个(第 1 行),并丢弃任何其他请求。每当在端口 21 (ftp) 上建立新连接时,第 2 行就会将源 IP 地址添加到 ftp_limit 列表中。

您面临着阻止源自 NAT 后面网络的合法流量的风险,因为这些流量似乎源自单个 IP 地址。您可能还想将一些受信任的网络列入白名单。

答案2

就像我在评论中所说的那样。

改用CSF,它的内存占用更大,但如果我必须在高ARM-CPU使用率和高整体内存使用率之间做出选择,我会选择后者。

另一种选择是放弃使用任何防火墙软件并改用 iptables 规则。将服务器移至非标准端口(8030、24544 等)并使用 iptables 删除所有其他端口上的连接。

如果您位于 NAT 之后,您可以使用路由器禁用除 Web 服务器端口之外的所有端口上的端口转发(假设您将其设置为侦听其他端口)。

相关内容