![我可以限制每个 IP 地址在时间范围内的数据传输吗?](https://linux22.com/image/747256/%E6%88%91%E5%8F%AF%E4%BB%A5%E9%99%90%E5%88%B6%E6%AF%8F%E4%B8%AA%20IP%20%E5%9C%B0%E5%9D%80%E5%9C%A8%E6%97%B6%E9%97%B4%E8%8C%83%E5%9B%B4%E5%86%85%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%E5%90%97%EF%BC%9F.png)
我的网站上托管着一些相对较大的文件,我突然想到,如果有人编写一个脚本来反复下载这些文件,占用我的数据传输并花费我的钱,那简直是小菜一碟。如果每天 24 小时不间断地下载,普通家庭连接的速度就足以给我带来麻烦,更不用说超高速光纤连接或合适的远程服务器了。
所以我想知道是否有任何适用于 Apache 甚至 Ubuntu 系统的东西可以对每个 IP 地址施加限制?例如,每 24 小时传输 10GB。当达到限制时,客户端将收到一个轻量级的“禁止 - 已达到配额”页面或被直接拒绝连接。我四处寻找,除了各种限制解决方案之外没有找到任何其他方法,这些解决方案可能会有所帮助,但无法解决问题。
答案1
这里记录了 iptables 配额模块:http://ipset.netfilter.org/iptables-extensions.man.html#lbBT
quota
Implements network quotas by decrementing a byte counter with each
packet. The condition matches until the byte counter reaches zero.
Behavior is reversed with negation (i.e. the condition does not match
until the byte counter reaches zero).
[!] --quota bytes
The quota in bytes.
不过,我认为这对您没有帮助,因为使用此方法,您可能必须为可能进入您服务器的每个可能的源 IP 地址创建单独的配额规则(这几乎是不可能的)。您还需要集成某种 BASH 脚本自动化,以便每 24 小时(或任何时间段)重置这些配额,如下所述:IPtables 流量配额 - 增加和减少
很多年前,我曾尝试过一个 Apache 模块,该模块能够在每个 IP 地址的应用程序级别执行此操作。这可能是一种更好的方法(我不确定 Apache/Nginx 有哪些现代模块可以做到这一点 - 需要进一步研究)。
我知道的唯一更好的其他替代方案(在我看来)是将 iptables hashlimit 模块与 tc(流量整形/管制)结合使用:http://ipset.netfilter.org/iptables-extensions.man.html#lbAY- 使用这种方法,流量只会变慢,但永远不会被阻塞。这种方法可能更可行的原因是,iptables hashlimit 模块可以通过记录进入服务器的不同 IP 地址和/或源/目标端口“哈希键”来处理客户端的动态跟踪。我在另一个相关问题上发布了关于如何实现这一点的答案,如下:https://serverfault.com/a/754116/30506- 但总而言之,您创建一个流量整形类(带宽限制器固定在 5Mb/秒),然后当每个客户端会话的数据包速率达到特定阈值时,您开始将它们的数据包汇集到这个类中,从而平息它们的流量。不过,在您的例子中,平息需要调整为在数小时内而不是数秒内运行。
答案2
您好,欢迎来到 Server Fault!
可以使用iptables
和limit
模块来限制带宽。
对此可以找到一个很好的介绍这里
此链接中的一个小示例用于设置带宽限制:
$ sudo iptables --flush # start again
$ sudo iptables --new-chain RATE-LIMIT
$ sudo iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT
$ sudo iptables --append RATE-LIMIT --match limit --limit 50/sec --limit-burst 20 --jump ACCEPT
$ sudo iptables --append RATE-LIMIT --jump DROP
向上述文章的作者 Will Sewell 和 Jim Fisher 表示敬意!