![Raspberry Pi 上的 failed2ban 日志解析太慢 - 选项?](https://linux22.com/image/3318/Raspberry%20Pi%20%E4%B8%8A%E7%9A%84%20failed2ban%20%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%A4%AA%E6%85%A2%20-%20%E9%80%89%E9%A1%B9%EF%BC%9F.png)
我在 950MHz 的 Raspberry Pi 上运行fail2ban,但我无法进一步超频。
Pi 有时会在特定端口上遭受 SYN 洪水攻击。我已经设置了 iptables 来限制感兴趣端口上的 SYN 速率;当超过限制时,发送 SYN 的主机将被放入 REJECT 链中,并记录超出限制的特定 SYN 数据包。
然后,fail2ban 会监视这些记录的 SYN,并在看到一些 SYN 后,暂时禁止主机一段时间(这是我正在使用的应用程序中的一个暂时性问题)。
问题是 SYN 泛洪有时会达到速度太快,fail2ban 无法跟上的速度;我每秒会看到 20-40 条日志消息,最终fail2ban 会落后并变得无效。雪上加霜的是,它在试图追赶的过程中继续消耗大量的 CPU。
我已经验证来自已经被fail2ban禁止的主机的DROP链接数据包是不是已记录,因此不会增加其负载。
我在这里有什么选择?我有一些想法,但没有明确的前进道路。
我可以使日志解析正则表达式“更容易”,从而减少周期吗?使用 iptables --log-prefix 将令牌放在日志消息的开头附近,和/或以其他方式简化/改变fail2ban 正则表达式是否有帮助?这是当前包含正则表达式的fail2ban配置行:
failregex = kernel:.*?SRC=(?:::f{4,6}:)?(?P<host>[\w\-.^_]+) DST.*?SYN
有没有比解析 kern.log 更快的方法来让 fail2ban 监视超出限制的数据包?
fail2ban 可以在 PyPy 而不是 CPython 下运行,只需最少的非标准魔法(操作系统是 Raspbian 7,所以主要是 Debian 7)?
有没有比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 服务器端口之外的所有端口上的端口转发(假设您将其设置为侦听其他端口)。