我只想允许一个 IP 每天使用最多 1GB 的流量,如果超过该限制,则来自该 IP 的所有请求都将被丢弃,直到第二天。但是,在一定数量的请求后断开连接的更简单的解决方案就足够了。
是否已经有某种模块可以做到这一点?或者也许我可以通过 iptables 之类的东西来实现这一点?
谢谢
我只想允许一个 IP 每天使用最多 1GB 的流量,如果超过该限制,则来自该 IP 的所有请求都将被丢弃,直到第二天。但是,在一定数量的请求后断开连接的更简单的解决方案就足够了。
是否已经有某种模块可以做到这一点?或者也许我可以通过 iptables 之类的东西来实现这一点?
谢谢
这是我针对此类问题的 iptables 解决方案。根据需要调整
--seconds
--hitcount
,还有 iptables 表。解释:
iptables
检查源 IP 在 /proc/net/ipt_recent/ATACK 文件中是否在 600 秒间隔内列出 5 次或更多次,以及它是否是新请求。如果是,请拒绝;别的iptables
检查请求是否发往 80 端口。如果是,将 IP 和时间戳打印到 /proc/net/ipt_recent/ATACK 并转发数据包。它可以很好地满足我的需求。
如果您想要 Apache 2.0 的纯 Apache 解决方案 bw_mod 和 Apache 1.3 的 mod_bandwidth。他们可以限制服务器的带宽以限制带宽使用。
还有 mod_limitipconn,它可以防止一个用户与您的服务器建立大量连接。mod_cband 是另一种选择,但我从未使用过它。
如果您不想弄乱您的 Apache 安装,您可以在 Apache 前面放置一个 squid 代理。它还使您可以更好地控制节流。
但是,在大多数情况下,当您想要限制每个 IP 的带宽时,问题是一些大型对象,并且您想要在用户提取过多数据并且您阻止他时给出合理的错误消息。在这种情况下,编写 PHP 脚本并将访问信息存储在数据库的临时表中可能会更容易。
你看过像fail2ban这样的工具吗?如果对您来说可能有点笨拙,但它可以让您限制任何给定 IP 允许的请求数量。它通过查看日志来工作,并且您为每次允许的违规次数设置规则,因此对您而言,这可能是每天的请求。一旦他们过去了,它就可以做一些事情,比如使用 ipchains 阻止他们。
我已经使用它非常成功地阻止了针对邮件服务器的 DDoS 攻击。但是,它会消耗大量的处理器功率。
尝试
mod_dosevasive
或mod_security
mod_dosevasive
可以配置为在指定的时间范围内对站点的指定数量或页面请求后禁止 IP。