我花了几个小时尝试配置 iptables/ufw 来对 Apache2 处理的 HTTP 请求执行此操作:
将一组 IP 范围列入白名单(搜索引擎机器人)在 Y 秒内收到 X 次请求后将 IP 添加到 24 小时阻止列表中(理想情况下,我想设置三个这样的规则)
但在我看来,使用 iptables 来做到这一点是不可能的,因为它只会在短时间内禁止 IP。
有谁知道我所概述的这些功能是否可以通过 mod_security 实现?或者推荐一些可以实现这些功能的东西?任何可以实现类似功能的代码片段都值得欢迎。
答案1
您正在寻找的所有内容都可以在 netfilter 中找到(还有更多!;-))。
可以使用 ipsets 和匹配扩展“set”将一组 IP 范围匹配到白名单:
ipset -N whitelist nethash
ipset --add whitelist 1.2.3.4/24
然后在 netfilter 的 iptables 中:
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
对于 24 小时内的阻止,您需要两次匹配扩展“最近”:一次用于检查传入率,一次用于记住被阻止的来源:
iptables -N BLOCK24
iptables -A BLOCK24 -m recent --name blocked --set
iptables -A INPUT -m recent --name beforeblock --rcheck --seconds 1 --hitcount 1 -j BLOCK24
如果一秒钟有两个数据包,这将匹配。现在要阻止源,只需与“阻止的”最近列表匹配。这条规则当然应该是您的 iptables 规则中的第一条。
iptables -A INPUT -m recent --name blocked --recheck --seconds 86400 -j DROP
所需文档在这里:iptables 扩展和ipset。当然,-p tcp --dport 80
如果这些规则只适用于http的话可以补充一下。
答案2
需要对上述内容进行一些调整。这有效:
sudo ipset -N whitelist nethash
sudo ipset --add whitelist 68.180.228.175
sudo iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
sudo iptables -N BLOCK24
sudo iptables -A BLOCK24 -m recent --name blocked --set
sudo iptables -A INPUT -m state --state NEW -m recent --set
sudo iptables -A INPUT -m state --state NEW -m recent --update --seconds 20 --hitcount 20 -j BLOCK24
sudo iptables -A INPUT -m recent --name blocked --rcheck --seconds 86400 -j BLOCK24
sudo iptables -A BLOCK24 -j LOG --log-prefix='[NETFILTER] ' --log-level 7
sudo iptables -A BLOCK24 -j REJECT