13 bandwidth ip requests apache-2.2
我想只允许一个 IP 每天使用最多 1GB 的流量,如果超过该限制,则来自该 IP 的所有请求都将被丢弃,直到第二天。但是,在一定数量的请求后断开连接的更简单的解决方案就足够了。
是否已经有某种模块可以做到这一点?或者我可以通过像 iptables 这样的东西来实现这一点?
谢谢
如果你想要一个纯 Apache 解决方案 bw_mod 用于 Apache 2.0 和 mod_bandwidth 用于 Apache 1.3。他们可以限制您服务器的带宽以限制带宽使用。
还有 mod_limitipconn,它可以防止一个用户与您的服务器建立大量连接。mod_cband 是另一种选择,但我从未使用过它。
如果你不想弄乱你的 Apache 安装,你可以在 Apache 前面放一个 squid 代理。它还可以让您更好地控制节流。
但是,在大多数情况下,当您想限制每个 IP 的带宽时,问题在于几个大对象,并且您想在用户拉取太多数据而您阻止他时给出合理的错误消息。在这种情况下,编写 PHP 脚本并将访问信息存储在数据库的临时表中可能会更容易。
小智 5
这是我针对此类问题的 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
Run Code Online (Sandbox Code Playgroud)
解释:
iptables
检查源 IP 是否在 /proc/net/ipt_recent/ATACK 文件中以 600 秒为间隔列出 5 次或更多次,以及它是否是新请求。如果是,拒绝;别的
iptables
检查请求是否以端口 80 为目标。如果是,则将 IP 和时间戳打印到 /proc/net/ipt_recent/ATACK 并转发数据包。
它可以很好地满足我的需求。
归档时间: |
|
查看次数: |
26250 次 |
最近记录: |