![Apache:限制每个 IP 的请求/流量数量?](https://linux22.com/image/510929/Apache%EF%BC%9A%E9%99%90%E5%88%B6%E6%AF%8F%E4%B8%AA%20IP%20%E7%9A%84%E8%AF%B7%E6%B1%82%2F%E6%B5%81%E9%87%8F%E6%95%B0%E9%87%8F%EF%BC%9F.png)
我希望只允许一个 IP 每天使用最多 1GB 的流量,如果超出该限制,则来自该 IP 的所有请求都将被丢弃,直到第二天。但是,一个更简单的解决方案是,在一定数量的请求后断开连接就足够了。
是否有某种模块可以做到这一点?或者我可以通过 iptables 之类的东西来实现这一点?
谢谢
答案1
这是我针对此类问题提出的 iptables 解决方案。请--seconds
--hitcount
根据需要调整 iptables 表。
iptables -A FORWARD -m state --state NEW -m recent --rcheck --seconds 600 --hitcount 5 --name ATACK --rsource -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -d 192.168.0.113/32 -o eth1 -p tcp -m tcp --dport 80 -m recent --set --name ATACK --rsource -j ACCEPT
解释:
iptables
检查源 IP 是否在 600 秒间隔内出现在 /proc/net/ipt_recent/ATACK 文件中 5 次或更多次,以及它是否是新请求。如果是,则拒绝;否则iptables
检查请求是否发往端口 80。如果是,则将 IP 和时间戳打印到 /proc/net/ipt_recent/ATACK 并转发数据包。
它能满足我的需要。
答案2
如果您想要一个纯 Apache 解决方案,Apache 2.0 可以使用 bw_mod,Apache 1.3 可以使用 mod_bandwidth。它们可以限制服务器的带宽,以限制带宽使用量。
还有 mod_limitipconn,它可以防止一个用户与您的服务器建立大量连接。mod_cband 是另一个选项,但我从未使用过它。
如果你不想弄乱你的 Apache 安装,你可以在 Apache 前面放一个 squid 代理。它还能让你更好地控制节流。
但是,在大多数情况下,当您想要限制每个 IP 的带宽时,问题在于一些大对象,并且当用户提取过多数据而您阻止他时,您希望给出合理的错误消息。在这种情况下,编写 PHP 脚本并将访问信息存储在数据库的临时表中可能会更简单。
答案3
您是否看过类似 fail2ban 的工具?它可能对您来说有点苛刻,但它可以让您限制允许任何给定 IP 的请求数量。它的工作原理是查看日志,您可以设置每次允许多少次违规的规则,因此对您来说,这可能是每天的请求数。一旦它们超过这个数量,它就可以使用 ipchains 进行阻止。
我曾用它成功阻止了针对邮件服务器的 DDoS 攻击。不过,它会消耗大量处理器能力。
答案4
尝试mod_dosevasive
或mod_security
mod_dosevasive
可以配置为在指定时间范围内对站点进行指定数量或页面请求后禁止某个 IP。